当列表项较多时,用户输入一些搜索条件、改变页数、改变页码获取到需要的搜索条目A,当对该搜索条目A进行操作(例如:编辑、查看等需要打开新页面),点击面包屑或者返回时,需要对之前的搜索项做一个缓存,以保证用户返回时能快速定位到之前的搜索条目A。
搜索缓存也遇到一些坑,本篇做一个记录。
2024.5.16更新:可以直接使用 keepAlive 组件缓存。
问题描述
列表页注入缓存,在所有涉及页面做判断是否需要去除缓存
detail.vue 页面
 | watch(route, () => {   const path = route.path   if (path.indexOf('traceChip') < 0) {     localStorage.removeItem('traceChip')   } })
 
  | 
 
不足:每个页面都要判断,很麻烦。若是有新需求要增加新页面,必须要再次加上。
在列表页面做缓存
搜索后打开其他页面时,做缓存
 | const openLook = (index: any, row: any) => {   localStorage.setItem(     'traceChip',     JSON.stringify({       query: toRaw(dataList.query),       queryShow: toRaw(dataList.queryShow)     })   )   router.push({     path: '/traceDetailChip',     query: { detail: JSON.stringify(toRaw(row.id)), backUrl: 'trace' + state.productInfoType }   }) }
 
  | 
 
页面初始化时获取缓存,赋予 query,去除缓存,这样在第一次搜索时可以调用 query。
 | onMounted(() => {   const traceChip = JSON.parse(localStorage.getItem('traceChip'))     console.log('localStorage=', traceChip)     if (traceChip) {       dataList.query = traceChip.query       dataList.queryShow = traceChip.queryShow       localStorage.removeItem('traceChip')     } })
 
  | 
 
KeepAlive
默认情况下,一个组件实例在被替换掉后会被销毁。这会导致它丢失其中所有已变化的状态——当这个组件再一次被显示时,会创建一个只带有初始状态的新实例。
 是一个内置组件,它的功能是在多个组件间动态切换时缓存被移除的组件实例。
 | <!-- 基础组件 --> <component :is="activeComponent" /> <!-- 非活跃的组件将会被缓存! --> <KeepAlive>   <component :is="activeComponent" /> </KeepAlive>
 
  | 
 
【注意】不能在自定义组件中插入 KeepAlive,已测试无效。