[Vue]Vue keep-alive
keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。
keep-alive生命周期钩子函数:activated、deactivated
使用<keep-alive>会将数据保留在内存中,如果要在每次进入页面的时候获取最新的数据,需要在activated阶段获取数据,承担原来created钩子中获取数据的任务。
一、prop:
- include: 字符串或正则表达式。只有匹配的组件会被缓存。
 - exclude: 字符串或正则表达式。任何匹配的组件都不会被缓存。
 
// 组件
export default {
name: 'test-keep-alive',
data () {
return {
includedComponents: "test-keep-alive"
}
}
}
<keep-alive include="test-keep-alive">
<!-- 将缓存name为test-keep-alive的组件 -->
<component></component>
</keep-alive> <keep-alive include="a,b">
<!-- 将缓存name为a或者b的组件,结合动态组件使用 -->
<component :is="view"></component>
</keep-alive> <!-- 使用正则表达式,需使用v-bind -->
<keep-alive :include="/a|b/">
<component :is="view"></component>
</keep-alive> <!-- 动态判断 -->
<keep-alive :include="includedComponents">
<router-view></router-view>
</keep-alive> <keep-alive exclude="test-keep-alive">
<!-- 将不缓存name为test-keep-alive的组件 -->
<component></component>
</keep-alive>
二、结合router,缓存部分页面
使用$route.meta的keepAlive属性:
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>
需要在router中设置router的元信息meta:
//...router.js
export default new Router({
routes: [
{
path: '/',
name: 'Hello',
component: Hello,
meta: {
keepAlive: false // 不需要缓存
}
},
{
path: '/page1',
name: 'Page1',
component: Page1,
meta: {
keepAlive: true // 需要被缓存
}
}
]
})
三、使用效果展示
以上面router的代码为例:
<!-- Page1页面 -->
<template>
<div class="hello">
<h1>Vue</h1>
<h2>{{msg}}</h2>
<input placeholder="输入框"></input>
</div>
</template>
<!-- Hello页面 -->
<template>
<div class="hello">
<h1>{{msg}}</h1>
</div>
</template>
(1) 在Page1页面输入框输入“asd”,然后手动跳转到Hello页面;

(2)跳转到Hello页面

(3) 回到Page1页面发现之前输入的"asd"依然保留,说明页面信息成功保存在内存中;

四、以下问题的解决:
- 首页是A页面
 - B页面跳转到A,A页面需要缓存
 - C页面跳转到A,A页面不需要被缓存
 
思路是在每个路由的beforeRouteLeave(to, from, next)钩子中设置to.meta.keepAlive
//A的路由
{
path: '/',
name: 'A',
component: A,
meta: {
keepAlive: true // 需要被缓存
}
}
export default {
    data() {
        return {};
    },
    methods: {},
    beforeRouteLeave(to, from, next) {
         // 设置下一个路由的 meta
        to.meta.keepAlive = true;  // B 跳转到 A 时,让 A 缓存,即不刷新
        next();
    }
};
export default {
    data() {
        return {};
    },
    methods: {},
    beforeRouteLeave(to, from, next) {
        // 设置下一个路由的 meta
        to.meta.keepAlive = false; // C 跳转到 A 时让 A 不缓存,即刷新
        next();
    }
};
[Vue]Vue keep-alive的更多相关文章
- Javascript - Vue - vue对象
		
vue提供了一整套前端解决方案,可以提升企业开发效率 vue的处理过程 app.js 项目入口,所有请求最先进入此模块进行处理 route.js 由app.js调用,处理路由的分发 controlle ...
 - Vue - vue.js 常用指令
		
Vue - vue.js 常用指令 目录: 一. vuejs模板语法之常用指令 1. 常用指令: v-html 2. 常用指令: v-text 3. 常用指令: v-for 4. 常用指令: v-if ...
 - 前端开发 Vue  Vue.js和Nodejs的关系
		
首先vue.js 是库,不是框架,不是框架,不是框架. Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据. Vue.js 的核心是一个允许你 ...
 - [Vue] : Vue概述
		
什么是Vue.js Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架. Vue.js 是前端的主流框架之一,和Angular.js.React.js 一起,并成为前端三大主流框 ...
 - Property 'validate' does not exist on type 'Element | Element[] | Vue | Vue[]'. Property 'valid...
		
使用vue-cli 3.0+Element-ui时候,调用form表单校验时候出现的问题是: Property 'validate' does not exist on type 'Element | ...
 - Vue Vue.use() / Vue.component / router-view
		
Vue.use Vue.use 的作用是安装插件 Vue.use 接收一个参数 如果这个参数是函数的话,Vue.use 直接调用这个函数注册组件 如果这个参数是对象的话,Vue.use 将调用 ins ...
 - vue & vue router & dynamic router
		
vue & vue router & dynamic router https://router.vuejs.org/guide/essentials/dynamic-matching ...
 - vue & vue router & match bug
		
vue & vue router & match bug match bugs solution name must be router https://stackoverflow.c ...
 - [Vue] vue中setInterval的问题
		
vue中使用setInterval this.chatTimer = setInterval(() => { console.log(this.chatTimer); this.chatMsg( ...
 - [Vue] vue跳转外部链接
		
问题 vue 跳转外部链接问题,当跳转的时候会添加在当前地址后面 var url = 'www.baidu.com' //跳转1 window.localtion.href = url //跳转2 w ...
 
随机推荐
- linux删除目录下指定后缀的文件
			
这几天在Colab上使用ImageAI训练模型时每次都会保存精确度有所提升的模型,这些模型可以算是中间产物,不太重要.为了避免混淆,运行完通过以下命令删除. find . -name "*. ...
 - laravel不同用户对应的同名的session是独立的
			
laravel不同用户对应的同名的session是独立的 一.总结 一句话总结: laravel中 不同用户会根据不同的laravel_session从而将session存在不同的session文件里 ...
 - 三种Timer使用
			
System.Windows.Forms.Timer, System.Threading.Timer, System.Timer,三种Timer使用如下 第一种:System.Windows.Fo ...
 - Harbor 1.8.0 仓库的安装和使用
			
安装的先决条件 硬件环境 1.CPU 至少2G,最好4G 2.内存 至少4G,最好8G 3.磁盘 至少40G,最好160G 软件环境 1.docker版本 17.03.0-ce ...
 - 隐藏Nginx、Apache、PHP的版本号
			
Nginx: 在nginx配置文件nginx.conf中,加入以下代码: server_tokens off; Apache: 在apache配置文件httpd.conf中,加入以下代码: Serve ...
 - (十四)用session和过滤器方法检验用户是否登录
			
一.session方法 1.1 编写登录页面文件(index.html) <!doctype html> <html> <head> <title>测试 ...
 - form 提交页面不刷新实现
			
// no redirect <!DOCTYPE html> <html> <head> <meta http-equiv="Content-typ ...
 - NET-使用Js调用WebService
			
注:JsWebServiceObject 此类是我做测试示例时为了测试js是否能调用webService中的复合类型而单独新建的一个类 此类中只有名字与年龄的属性. 最近身边的一个朋友做项目,其中有一 ...
 - 【RobotFramework-RequestsLibrary】post方法data<empty>为空问题
			
日志提示data<empty> 只是因为post requset关键字需要data的值为字典格式,上面set variable将data变为了字符串,所以提示程序异常,这一点可以在post ...
 - maven:清除lastUpdated文件
			
项目使用maven管理jar包,很容易因为各种原因(网速慢.断网)导致jar包下载不下来,出现很多.lastUpdated文件.这些文件一个一个删除太麻烦.下面是全部删除的方法 windows系统 c ...