vue3中< keep-alive >页面实现缓存及遇到的问题
实现原理:keep-alive 是 Vue 的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。实现不同路由是否缓存只需要设置对应路由参数keepAlive为true,不需要缓存的路由设置false。如果是多级路由你要设置子路由缓存的话,它的父级路由的keepAlive也必须为true。
keep-alive的参数
参数 | 原理 |
---|---|
include | 它会根据组件的 name 选项进行匹配,所以组件如果想要条件性地被 KeepAlive 缓存,就必须显式声明一个 name 选项 |
exclude | 任何名称与 exclude 匹配的组件都不会被缓存 |
max | 最大缓存实例数 |
<!-- 以英文逗号分隔的字符串 -->
<KeepAlive include="a,b">
<component :is="view" />
</KeepAlive>
<!-- 正则表达式 (需使用 `v-bind`) -->
<KeepAlive :include="/a|b/">
<component :is="view" />
</KeepAlive>
<!-- 数组 (需使用 `v-bind`) -->
<KeepAlive :include="['a', 'b']">
<component :is="view" />
</KeepAlive>
一:keep-alive设置缓存
<template>
<div id="app">
<!--需要缓存的keep-alive配置 展示内容-->
<keep-alive :include="getKeepAliveNames">
<router-view v-if="$route.meta.keepAlive" />
</keep-alive>
<!--不需要缓存的keep-alive 配置 展示内容-->
<router-view v-if="!$route.meta.keepAlive" />
</div>
</template>
二:router,多级router页面缓存
//首页
{
path: "/home",
name: "home",
component: component: () => import("@/views/home/index.vue"),
//配置keep-alive 的状态
meta: {
keepAlive: true, //需要缓存的页面,
title:"首页"
},
},
{
path: "/user",
name: "user",
component: component: () => import("@/views/user/index.vue"),
//配置keep-alive 的状态
meta: {
keepAlive: true, //需要缓存的页面
title:"用户"
},
children:[
{
path: "/userOne",
name: "userOne",
component: component: () => import("@/views/userOne/index.vue"),
//配置keep-alive 的状态
meta: {
keepAlive: true, //需要缓存的页面,
title:"用户1"
},
},
{
path: "/userTwo",
name: "userTwo",
component: component: () => import("@/views/userTwo/index.vue"),
//配置keep-alive 的状态
meta: {
keepAlive: true, //需要缓存的页面,
title:"用户2"
},
},
]
},
三:查看页面是否缓存成功
1:查看 onActivated ,onDeactivated 判断 keepalive是否生效
<script setup>
import { onActivated, onDeactivated } from 'vue'
onActivated(() => {
// 调用时机为首次挂载
// 以及每次从缓存中被重新插入时
})
onDeactivated(() => {
// 在从 DOM 上移除、进入缓存
// 以及组件卸载时调用
})
</script>
2:使用vue插件判断缓存是否生效
四:遇到的问题
写了以上步骤缓存都失效,查看了原因:是因为keep-alive里面的名称和组件的名称没有匹配上。
解决办法是在组件页面给他命名,这样就解决了。
import { defineOptions} from 'vue';
defineOptions({ name: 'userRegister' })//与路由的name要一致
如果遇到defineOptions
报错
更新vue和vue-router版本就行;我的版本是:"vue": "3.3.4"
,"vue-router": "^4.0.12"
,然后再npm i安装一下再重启项目就可以了。