Vue2官方文档:https://v2.cn.vuejs.org/v2/api/#keep-alive
Vue3官方文档:https://cn.vuejs.org/guide/built-ins/keep-alive.html
<!-- App.vue中 -->
<router-view v-else-if="isRouterAlive" v-slot="{ Component }">
<keep-alive :include="['App']">
<component :is="Component" />
</keep-alive>
</router-view>
<!-- App.vue中 -->
<template>
<div id="app">
<keep-alive >
<router-view></router-view>
</keep-alive>
</div>
</template>
组件默认是不存在缓存机制的,只要切换到下一个组件就会销毁当前的组件,此时可通过改内置组件将当前的组件进行销毁,内部缓存机制:
<!-- App.vue中 -->
<template>
<div id="app">
<keep-alive >
<router-view></router-view>
</keep-alive>
</div>
</template>
<!-- App.vue中 -->
<template>
<div id="app">
<keep-alive >
<router-view v-if="$route.meta.keepAlive"></router-view> //需缓存的组件或者自定义
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view> //不需要缓存的组件
</div>
</template>
<!-- App.vue中 -->
{
path: '/basis/drps/department',
name: 'about',
component: () =>
import(
/* webpackChunkName: "ums-department" */ '@/views/user/department/about.vue' ),
meta: {
keepalive: true, //默认未false,若为true则表示该页面需要缓存
},
},
<!-- include是包含 使用的是组件名(组件中的name非路由中的name)并非是路由的名字 此处只有Hello组件有缓存 -->
<keep-alive include="Hello">
<router-view></router-view>
</keep-alive>
<!-- exclude是不包含/排除 使用的是组件名(组件中的name非路由中的name)并非是路由的名字 此处只有Hello组件不被缓存 其他都能被缓存-->
<keep-alive exclude="Hello">
<router-view></router-view>
</keep-alive>
<!-- max最大 此处最多缓存10个组件-->
<keep-alive :max="10">
<component :is="view"></component>
</keep-alive>
<!-- activated:进入页面时执行->
activated(){
},
<!-- deactivated:退出页面时执行->
deactivated(){
},
<!-- about.vue -->
<router-view name = 'Hello'/> // 在about组件中渲染Hello组件
<h1>{{$router.name}}</h1> // 渲染组件中name的值
<!-- params传参 1、声明式: router-link-->
//父路由组件
<router-link :to="/child/123">进入Child路由</router-link>
//子路由配置
{
path: '/child/:id',
component: Child
}
// 或者
{
path: '/child/:id',
name:"Child",
component: Child
}
<!-- params传参 2、编程/链式:this.$router.push-->
// 父路由使用编程式进行传参(通常使用事件触发)
this.$router.push({
path:'/child/${id}',
})
//子路由配置
{
path: '/child/:id',
component: Child
}
//子路由中可通过this.$route.params.id进行获取
<!-- query传参 1、声明式:-->
// 父路由组件中
<router-link :to="{name:'Child',query:{id:134565}}">进入到Child路由中</router-link>
// 子路由配置
{
path: '/child,
name: 'Child',
component: Child
}
// 父路由通过编程式传参(通常是通过事件进行触发)
this.$router.push({
name:'Child',
query:{
id:123
}
})
// 子路由配置
{
path: '/child,
name: 'Child',
component: Child
}
//子路由中可通过this.$route.query.id获取到所传递的参数
<!-- router.js/ts中 -->
import About from '@views/about/about.vue'
const aboutRouter = {
path: '/about',
name:'About', //此处的About必须与about.vue页面中的name值相同,否则即使配置了keepalive:true也无效
component: About,
meta: {
keepalive: true,
},
<!-- about.vue中 -->
export default defineComponent({
name: 'About', //当前页面的名字,namespace
...
});
const aboutRouter = {
path: '/about',
name:'About', //此处的About必须与about.vue页面中的name值相同,否则即使配置了keepalive:true也无效
component: () => import('@/views/about.vue'),
meta: {
keepalive: true,
},
<!-- about.vue中 -->
export default defineComponent({
name: 'About', //当前页面的名字,namespace
...
});