vue3+js+vite学习之页面动态缓存

一、目的

1、实现部分页面缓存

2、实现标签页关闭之后清除页面缓存

二、实现方法

     使用keep-alive进行路由缓存,配合include参数实现动态缓存

1、首选在路由列表中进行是否需要缓存配置

      在需要进行缓存的页面中,meta参数中增加keepAlive配置项,需要缓存的配置成true,不需要缓存的配置成false或者不设置都行

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: 'list',
      name: 'list',
      meta: {
        title: '列表',
        keepAlive: true
      },
      component: () => import('@/views/list.vue')
    },
  ]
})

2、将缓存的页面name数组存储在pinia中,根据打开的标签页列表动态变化

export const useTagsNavInfoStore = defineStore('tagsNavInfo', () => {
  // 缓存的页面列表
  const cacheList = ref([])
  // 打开的标签页列表
  const openTags = ref([])
  // 监听tags变化
  watch(
    openTags.value,
    () => {
      cacheList.value = openTags.value
        .filter((item) => item.meta && item.meta.keepAlive)
        .map((item) => {
          return item.name
        })
    },
    { immediate: true }
  )
  return {
    cacheList,
    openTags
  }
})

3、在router-view中使用keep-alive,include是缓存的页面name数组,读取pinia中的值

<template>
  <router-view v-slot="{ Component, route }">
    <keep-alive :include="tagsNavInfoStore.cacheList">
      <component :is="Component" :key="route.fullPath" />
    </keep-alive>
  </router-view>
</template>
<script setup>
import { useTagsNavInfoStore } from './tagsNavInfoStore'
const tagsNavInfoStore = useTagsNavInfoStore()
</script>

三、重点注意事项

1、include中的name指的是组件的name值,组件的默认name值是文件的名字,需要将vue升级到3.3.8版本以上,才能给组件设置name值,给组件设置name值的代码如下:

<script setup>
defineOptions({
  name: 'list'
})
</script>

2、使用router-view时,如果遇到多层嵌套的问题,只需要在最里层的router-view中加上keep-alive缓存即可。否则打开新页面时页面会进行根据router-view嵌套的keep-alive层级进行多次加载,后台接口会调取多次,影响系统性能

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值