默认情况下组件被切换走就会被销毁,回来时重建,表单填到一半的内容随之消失。keep-alive 是 Vue 内置的抽象组件,把其中的动态组件或 router-view 包起来后,不活动的组件只是被停用(触发 deactivated)而非卸载,再次显示时停用状态恢复(触发 activated),DOM 与数据都留在内存里。
它通过 include、exclude、max 三个属性控制缓存范围:按组件名做白名单或黑名单过滤,max 限制最多缓存多少个实例,超出按 LRU 算法淘汰。文档类、标签页类、分步表单场景非常合适,但详情页这种数据需要实时刷新的场景要谨慎,必要时在 activated 钩子里主动拉取最新数据。
<template> <keep-alive include="UserList,OrderList" :max="10"> <component :is="currentTab" /> </keep-alive> </template> <script setup> import { ref, onActivated } from 'vue'; const currentTab = ref('UserList'); onActivated(() => { console.log('从缓存中恢复了,可以刷新数据'); }); </script>