vue3.0列表页面做缓存的方法代码
一.设置动态keepalive
<router-view v-slot="{ Component, route }"> <keep-alive :include="cacheViewsState"> <component :is="Component" /> </keep-alive> </router-view>
可以将要缓存的页面作为vuex全局变量储存
const cacheViewsState = store.state.app.cachedViews
将cachedViews 存入vuex:
state: { cachedViews: ['listPage'] }, mutations:{ ADD_CACHED_VIEW: (state, view) => { if (state.cachedViews.includes(view)) return state.cachedViews.push(view) }, DEL_CACHED_VIEW: (state, view) => { const index = state.cachedViews.indexOf(view) index > -1 && state.cachedViews.splice(index, 1) } }, actions: { //添加缓存组件 addCachedView({ commit }, view) { commit('ADD_CACHED_VIEW', view) }, //删除缓存组件 delCachedView({ commit, state }, view) { return new Promise((resolve) => { commit('DEL_CACHED_VIEW', view) resolve([...state.cachedViews]) }) } }
二.页面初始化数据缓存处理
将页面导出命名空间设置为动态缓存页面名单
<script> export default { name: 'listPage' } </script>
onActivated 注册一个回调函数,若组件实例是 <KeepAlive> 缓存树的一部分,当组件从 DOM 中被移除时调用。
这个钩子在服务器端渲染期间不会被调用。
onActivated(() => { getList() // 初始化列表 })
附:Vue3.0使用keep-alive实现页面缓存不刷新
1.应用场景
1.列表页进入详情页,再从详情页返回列表页;列表页缓存不刷新。保持原来选中的查询参数以及当前页
2.某个新增页面分为两步,分为A页面和B页面;当第一步A页面信息填好后,点击下一步到第二步B页面。再返回到第一步A页面,A页面信息不丢失。同理第二步填好信息返回到第一步,再回到第二页,第二页页面信息不丢失。
2.解决步骤
1.App.vue
//isRouterAlive:通过先设置isRouterAlive为false再设置为true可实现组件的销毁 <router-view v-slot="{ Component }" v-if="isRouterAlive"> <keep-alive> <component :is="Component" v-if="_this.$route.meta.keepAlive" :key="$route.name" /> </keep-alive> <component :is="Component" v-if="!_this.$route.meta.keepAlive" /> </router-view>
2.router.js
//设置meta const routes: Array<RouteRecordRaw> = [ { path: 'list', name: 'list', meta: { keepAlive: true, cacheList: ['detail'] }, component: () => import('@/views/list.vue') }, ] //路由拦截 router.beforeEach((to, from, next) => { //从cacheList中的任何一个页面返回,当前页面缓存 const cacheList: any = to.meta.cacheList if (cacheList) { if (cacheList.indexOf(from.name) > -1) { to.meta.keepAlive = true } else { //解决第一次不缓存问题 if (from.name) { to.meta.keepAlive = false } else { to.meta.keepAlive = true } } } next() }
3.list.vue
import { defineComponent, nextTick } from 'vue' import { onBeforeRouteLeave } from 'vue-router' export default defineComponent({ name: 'list', setup() { onBeforeRouteLeave((to, from, next) => { //当即将访问的界面不是detail则销毁组件,以免上一次缓存信息存在 const cacheList: any = ['detail'] if (cacheList.indexOf(to.name) === -1) { //销毁缓存信息(vue3没有_this.$destory()方法,所以通过v-if实现组件的销毁) //vuex改变全局变量isRouterAlive的值 _this.$store.commit('menu/changeRouterAlive', false) nextTick(() => { _this.$store.commit('menu/changeRouterAlive', true) }) } next() }) } })
总结
到此这篇关于vue3.0列表页面做缓存的文章就介绍到这了,更多相关vue3.0列表页面缓存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
最新评论