vue keep-alive

keep-alive本身是vue2.0的功能,可以使被包含的组件保留状态,或避免重新渲染

标签<keep-alive>具有属性:
	1. include:
		内容要求字符串或正则表达,只有匹配的组件会被缓存
	2.exclude:
		内容要求字符串或正则表达式,任何匹配的组件都不会被缓存
	实例:
		// 组件 component
		export default {
			name: 'a',
			data () {
				return {}
			}
		}
		<!-- name 为 a 的组件将被缓存! -->
		<keep-alive include="a">
			<component></component>
		</keep-alive>
 
		<!-- 除了 name 为 a 的组件都将被缓存! -->
		<keep-alive exclude="a">
			<component></component>
		</keep-alive>
keep-alive也可以作为router的配置属性,设定在路由中
	例如:
		import Vue from 'vue'
		import Router from 'vue-router'
		Vue.use(Router)
		export default new Router({
			{
				//home会被缓存
				path:"/home",
				component:home,
				meta:{
					keepAlive: true
				}
			}
			{
				//hello不会被缓存
				path:"/hello",
				component:hello,
				meta:{
					keepAlive: false
				}
			}
		})
	读取可以通过$route.meta.keep-alive
实例:
<template>
  <div id="app">
    <!--缓存想要缓存的页面,实现后退不刷新-->
    <!--加上v-if的判断,可以自定义想要缓存的组件,自定义在router里面-->
    <keep-alive>
      <router-view v-if="$route.meta.keepAlive"></router-view>
    </keep-alive>
    <router-view v-if="!$route.meta.keepAlive"></router-view>
    <!--这里是其他的代码-->
  </div>
</template>

<router-view> 也是一个组件,如果直接被包在 <keep-alive> 里面,所有路径匹配到的视图组件都会被缓存
当然也可以通过添加<keep-alive>的属性include或者exclude,配置组件name进行筛选

当组件在 <keep-alive> 内被切换,它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。
而传统的mounted和estroyed的生命周期钩子函数不会被触发。
如此使得被keep-alive组件包裹的组件的状态得以保留也避免了该组件的重复渲染。
如果要在该组件内做进入的局部数据更新,可以在activated中进行数据更新。

也可以通过更改keep-alive在router中的属性值来控制页面本次加载是否缓存数据
当需要在离开页面前改变去往页面的缓存状态时,仅需要在页面中添加beforeRouteLeave
实例:
	export default {
        data() {
            return {
                
            };
        },
        beforeRouteLeave(to, from, next) {
            // 设置下一个路由的 meta
            to.meta.keepAlive = false;
            next();
        }
    }

 

上一篇:process的name和is_alive


下一篇:vue的keep-alive组件