Vue3 动态修改 KeepAlive

Vue3 动态修改 KeepAlive

代码链接
在线Demo

应用场景

当从列表页进入详情页时,重新实例化详情页,当从详情页进入子页面时,缓存详情页,例如

/list -> /detail 时重新实例化 DetailView

/detail -> /detail/sub 时缓存 DetailView

但是不能处理嵌套,即 /detail -> /detail/sub -> /detail 的情况,暂时没有这个需求,不考虑了。

实现原理

关键点是路由配置 meta 里的 keepAlive 字段设置为响应式,参考 src/router/router.ts

{
   path: 'detail',
   name: 'detail',
   component: () => import('../views/DetailView.vue'),
   meta: {
      keepAlive: ref(false),
   },
},

这样当 keepAlive 字段变动时,可以通过 effect 监听到

再使用 effect 收集所有 keepAlive 为 true 的路由组件名称,然后传给 KeepAlive 组件即可,参考 src/layout/LayoutComponent.vue

effect(() => {
  // 收集所有keepAlive为true的路由组件名称
  const routes = router
    .getRoutes()
    .filter(i => i.meta.keepAlive?.value)
    .map(i => i.components?.default)
    .filter(i => i?.constructor === Object)
    .map(i => i!.name || (i as { __name: string }).__name);
  keepAliveIncludes.value = routes;
});
<RouterView v-slot="{ Component }">
  <KeepAlive :include="keepAliveIncludes">
    <component :is="Component" :key="route.name" />
  </KeepAlive>
</RouterView>

在 DetailView 页面动态修改 keepAlive,参考 src/views/DetailView.vue

const router = useRouter();
onBeforeRouteLeave(to => {
  router.getRoutes().forEach(item => {
    if (item.name === 'detail' && item.meta.keepAlive) {
      // 前往DetailSub页面,缓存Detail页面,否则取消缓存
      item.meta.keepAlive.value = to.name === 'detail-sub';
    }
  });
});
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值