深入理解vue-router之keep-alive
keep-alive 简介
keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。
用法也很简单:
1
2
3
4
5
|
< keep-alive > < component > <!-- 该组件将被缓存! --> </ component > </ keep-alive > |
props
- include - 字符串或正则表达,只有匹配的组件会被缓存
- exclude - 字符串或正则表达式,任何匹配的组件都不会被缓存
1
2
3
4
5
6
7
|
// 组件 a export default { name: 'a' , data () { return {} } } |
1
2
3
4
5
|
< keep-alive include = "a" > < component > <!-- name 为 a 的组件将被缓存! --> </ component > </ keep-alive >可以保留它的状态或避免重新渲染 |
1
2
3
4
5
|
< keep-alive exclude = "a" > < component > <!-- 除了 name 为 a 的组件都将被缓存! --> </ component > </ keep-alive >可以保留它的状态或避免重新渲染 |
遇见 vue-router
router-view 也是一个组件,如果直接被包在 keep-alive 里面,所有路径匹配到的视图组件都会被缓存:
1
2
3
4
5
|
< keep-alive > < router-view > <!-- 所有路径匹配到的视图组件都会被缓存! --> </ router-view > </ keep-alive > |
然而产品汪总是要改需求,拦都拦不住...
问题
如果只想 router-view 里面某个组件被缓存,怎么办?
- 使用 include/exclude
- 增加 router.meta 属性
使用 include/exclude
1
2
3
4
5
6
7
|
// 组件 a export default { name: 'a' , data () { return {} } } |
1
2
3
4
5
|
< keep-alive include = "a" > < router-view > <!-- 只有路径匹配到的视图 a 组件会被缓存! --> </ router-view > </ keep-alive > |
exclude 例子类似。
缺点:需要知道组件的 name,项目复杂的时候不是很好的选择
增加 router.meta 属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
// routes 配置 export default [ { path: '/' , name: 'home' , component: Home, meta: { keepAlive: true // 需要被缓存 } }, { path: '/:id' , name: 'edit' , component: Edit, meta: { keepAlive: false // 不需要被缓存 } } ] |
1
2
3
4
5
6
7
8
9
|
< keep-alive > < router-view v-if = "$route.meta.keepAlive" > <!-- 这里是会被缓存的视图组件,比如 Home! --> </ router-view > </ keep-alive > < router-view v-if = "!$route.meta.keepAlive" > <!-- 这里是不被缓存的视图组件,比如 Edit! --> </ router-view > |
优点:不需要例举出需要被缓存组件名称
【加盐】使用 router.meta 拓展
假设这里有 3 个路由: A、B、C。
需求:
- 默认显示 A
- B 跳到 A,A 不刷新
- C 跳到 A,A 刷新
实现方式
在 A 路由里面设置 meta 属性:
1
2
3
4
5
6
7
8
|
{ path: '/' , name: 'A' , component: A, meta: { keepAlive: true // 需要被缓存 } } |
在 B 组件里面设置 beforeRouteLeave:
1
2
3
4
5
6
7
8
9
10
11
|
export default { data() { return {}; }, methods: {}, beforeRouteLeave(to, from, next) { // 设置下一个路由的 meta to.meta.keepAlive = true ; // 让 A 缓存,即不刷新 next(); } }; |
在 C 组件里面设置 beforeRouteLeave:
1
2
3
4
5
6
7
8
9
10
11
|
export default { data() { return {}; }, methods: {}, beforeRouteLeave(to, from, next) { // 设置下一个路由的 meta to.meta.keepAlive = false ; // 让 A 不缓存,即刷新 next(); } }; |
这样便能实现 B 回到 A,A 不刷新;而 C 回到 A 则刷新。
总结
路由大法不错,不需要关心哪个页面跳转过来的,只要 router.go(-1) 就能回去,不需要额外参数。
然而在非单页应用的时候,keep-alive 并不能有效的缓存了= =
深入理解vue-router之keep-alive的更多相关文章
- 前端MVC Vue2学习总结(八)——Vue Router路由、Vuex状态管理、Element-UI
一.Vue Router路由 二.Vuex状态管理 三.Element-UI Element-UI是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是 Mint U ...
- 深入浅出的webpack构建工具--webpack4+vue+router项目架构(十四)
阅读目录 一:vue-router是什么? 二:vue-router的实现原理 三:vue-router使用及代码配置 四:理解vue设置路由导航的两种方法. 五:理解动态路由和命名视图 六:理解嵌套 ...
- 深入理解vue路由的使用
vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来.传统的页面应 ...
- Vue 2.0 + Vue Router + Vuex
用 Vue.js 2.x 与相配套的 Vue Router.Vuex 搭建了一个最基本的后台管理系统的骨架. 当然先要安装 node.js(包括了 npm).vue-cli 项目结构如图所示: ass ...
- vue router 只需要这么几步
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 理解vue中的scope的使用
理解vue中的scope的使用 我们都知道vue slot插槽可以传递任何属性或html元素,但是在调用组件的页面中我们可以使用 template scope="props"来获取 ...
- 理解Vue中的Render渲染函数
理解Vue中的Render渲染函数 VUE一般使用template来创建HTML,然后在有的时候,我们需要使用javascript来创建html,这时候我们需要使用render函数.比如如下我想要实现 ...
- 深入理解vue
一 理解vue的核心理念 使用vue会让人感到身心愉悦,它同时具备angular和react的优点,轻量级,api简单,文档齐全,简单强大,麻雀虽小五脏俱全. 倘若用一句话来概括vue,那么我首先想到 ...
- Vue.js 2.x笔记:路由Vue Router(6)
1. Vue Router简介与安装 1.1 Vue Router简介 Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,构建单页面应用. Vue Rout ...
- Vue Router学习笔记
前端的路由:一个地址对应一个组件 Vue Router中文文档 一.路由基本使用 第1步:导入Vue Router: <script src="https://unpkg.com/vu ...
随机推荐
- IDEA eclipse转maven
在pom.xml 文件上右键 Add as Maven Project
- MySQL Backup mysqldump备份流程学习
我们都知道MySQL逻辑备份工具mysqldump可以保证备份数据的一致性,但是它是怎么保持一致性的? 本文不讨论mysqldump具体的选项和用法,一直对mysqldump的工作机制梳理的不太清楚, ...
- c# Resolve SQlite Concurrency Exception Problem (Using Read-Write Lock)
This article describes the c# example to solve the problem of SQlite concurrent exception method. To ...
- js中字符替换函数String.replace()使用技巧
定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 语法 stringObject.replace(regexp/substr,replac ...
- AI 基础
what AI ? 人工智能(Artificial Intelligence),英文缩写为AI. 人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的 ...
- 论文笔记【二】Making Sense of Word Embeddings
摘要 1.作者提出了一种新的简单有效的方法,用于学习词义嵌入word sense embedding 2.传统的两种方法:(1)直接从语料库中学习词义:(2)依赖词汇资源的语义库 研究方法的创新点:通 ...
- pyCharm的第一个项目
首先打开编译器pyCharm 创建一个项目 在location :新建文件夹 在interpreter:指定python解释器的路径 python解释器下载官网: https://www.python ...
- sed 正则的一个小问题
有一段类似以下的文本 aabbccc test[3307]112323553-66778tp aooppx69tp ooppsg aabbccc test[3307]1127233-6674tp bo ...
- Docker Compose 一键部署Nginx代理Tomcat集群
Docker Compose 一键部署Nginx代理Tomcat集群 目录结构 [root@localhost ~]# tree compose_nginx_tomcat/ compose_nginx ...
- oracle addm报告
可通过@?/rdbms/admin/addmrpt.sql生成ADDM报告 ADDM本身并不是很实用,抽象级别太高,用于初步判断系统配置/IO子系统是否合理和快速参考,一个报告截图如下: 任务 '任务 ...