<keep-alive>是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM。

<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。

prop:

  • include: 字符串或正则表达式。只有匹配的组件会被缓存。
  • exclude: 字符串或正则表达式。任何匹配的组件都不会被缓存。

在2.1.0版本Vue中

常见用法:

  1. // 组件
  2. export default {
  3. name: 'test-keep-alive',
  4. data () {
  5. return {
  6. includedComponents: "test-keep-alive"
  7. }
  8. }
  9. }
  1. <keep-alive include="test-keep-alive">
  2. <!-- 将缓存name为test-keep-alive的组件 -->
  3. <component></component>
  4. </keep-alive>
  5. <keep-alive include="a,b">
  6. <!-- 将缓存name为a或者b的组件,结合动态组件使用 -->
  7. <component :is="view"></component>
  8. </keep-alive>
  9. <!-- 使用正则表达式,需使用v-bind -->
  10. <keep-alive :include="/a|b/">
  11. <component :is="view"></component>
  12. </keep-alive>
  13. <!-- 动态判断 -->
  14. <keep-alive :include="includedComponents">
  15. <router-view></router-view>
  16. </keep-alive>
  17. <keep-alive exclude="test-keep-alive">
  18. <!-- 将不缓存name为test-keep-alive的组件 -->
  19. <component></component>
  20. </keep-alive>

结合router,缓存部分页面

使用$route.meta的keepAlive属性:

  1. <keep-alive>
  2. <router-view v-if="$route.meta.keepAlive"></router-view>
  3. </keep-alive>
  4. <router-view v-if="!$route.meta.keepAlive"></router-view>

需要在router中设置router的元信息meta:

  1. //...router.js
  2. export default new Router({
  3. routes: [
  4. {
  5. path: '/',
  6. name: 'Hello',
  7. component: Hello,
  8. meta: {
  9. keepAlive: false // 不需要缓存
  10. }
  11. },
  12. {
  13. path: '/page1',
  14. name: 'Page1',
  15. component: Page1,
  16. meta: {
  17. keepAlive: true // 需要被缓存
  18. }
  19. }
  20. ]
  21. })

使用效果

以上面router的代码为例:

  1. <!-- Page1页面 -->
  2. <template>
  3. <div class="hello">
  4. <h1>Vue</h1>
  5. <h2>{{msg}}</h2>
  6. <input placeholder="输入框"></input>
  7. </div>
  8. </template>
  1. <!-- Hello页面 -->
  2. <template>
  3. <div class="hello">
  4. <h1>{{msg}}</h1>
  5. </div>
  6. </template>

(1) 在Page1页面输入框输入“asd”,然后手动跳转到Hello页面;

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

​ 图1 进入Page1页面,并输入"asd"

​ 图2 跳转到Hello

​ 图3 返回Page1页面,输入框数据会被保留

当然,也可以通过动态设置route.meta的keepAlive属性来实现其他需求,

借鉴一下 vue-router 之 keep-alive,作者:RoamIn这篇博客中的例子:

  • 首页是A页面
  • B页面跳转到A,A页面需要缓存
  • C页面跳转到A,A页面不需要被缓存

思路是在每个路由的beforeRouteLeave(to, from, next)钩子中设置to.meta.keepAlive

A的路由:

  1. {
  2. path: '/',
  3. name: 'A',
  4. component: A,
  5. meta: {
  6. keepAlive: true // 需要被缓存
  7. }
  8. }
  1. export default {
  2. data() {
  3. return {};
  4. },
  5. methods: {},
  6. beforeRouteLeave(to, from, next) {
  7. // 设置下一个路由的 meta
  8. to.meta.keepAlive = true; // B 跳转到 A 时,让 A 缓存,即不刷新
  9. next();
  10. }
  11. };
  1. export default {
  2. data() {
  3. return {};
  4. },
  5. methods: {},
  6. beforeRouteLeave(to, from, next) {
  7. // 设置下一个路由的 meta
  8. to.meta.keepAlive = false; // C 跳转到 A 时让 A 不缓存,即刷新
  9. next();
  10. }
  11. };

亲测有效哦~

keep-alive生命周期钩子函数:activated、deactivated

使用<keep-alive>会将数据保留在内存中,如果要在每次进入页面的时候获取最新的数据,需要在activated阶段获取数据,承担原来created钩子中获取数据的任务。

Vue keep-alive实践总结的更多相关文章

  1. Vue.js最佳实践

    Vue.js最佳实践 第一招:化繁为简的Watchers 场景还原: created(){ this.fetchPostList() }, watch: { searchInputValue(){ t ...

  2. [vue]webpack&vue组件工程化实践

    [vue]全局组件和局部组件(嵌套+props引用父组件数据) [vue]组件篇 [vue]组件的创建(componet)和销毁(keep-alive缓存)和父子dom同步nextTick [vue] ...

  3. vue+axios新手实践实现登陆

    vue+axios新手实践实现登陆 https://segmentfault.com/a/1190000015201803 增加 利用HTML5的history.replacestate()修改当前页 ...

  4. Vue 浅析与实践

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:曾柏羲 导语 入职接到的第一个需求是实现一个关于K歌实体售卖的ERP系统,管理系统过去做过不少,这次打算换个姿势,基于时下正热但早已不新 ...

  5. Vue + webpack 项目实践

    Vue.js 是一款极简的 mvvm 框架,如果让我用一个词来形容它,就是 “轻·巧” .如果用一句话来描述它,它能够集众多优秀逐流的前端框架之大成,但同时保持简单易用.废话不多说,来看几个例子: & ...

  6. nodejs, vue, webpack 项目实践

    vue 及 webpack,均不需要与nodejs一期使用,他们都可以单独使用到任何语言的框架中. http://jiongks.name/blog/just-vue/ https://cn.vuej ...

  7. Vue.js最佳实践--给大量子孙组件传值(provide/inject)

    开发中有个需求,有个Parent组件(例如div)下,输入框,下拉框,radiobutton等可编辑的子孙组件几百个,根据某个值统一控制Parent下面的所有控件的disabled状态 类似于这样,给 ...

  8. Vue 工程化最佳实践

    目录结构 总览   api 目录用于存放 api 请求,文件名与模型名称基本一致,文件名使用小驼峰,方法名称与后端 restful 控制器一致.   enums 目录存放 常量,与后端的常量目录对应 ...

  9. windows下搭建vue开发环境实践

    Vue.js是一套构建用户界面的 "渐进式框架".与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已 ...

  10. 前端开发工具vue.js开发实践总结

    最近有很长时间没有更新博客了,换了公司,全部的心思都放在项目上了.通过这次项目的上线,让我感受最深的是前后端分离后,前端页面的模块化管理,以及前端页面的数据邦定.在接触vue.js之前,我之前端要用到 ...

随机推荐

  1. 关于net mail组件ssl端口问题

    最近开发一个项目使用到.net mail组件发送邮件.在开发环境中一切正常,可是部署到阿里云服务器上死活发送不出去,一直连接不上,或者报语法错误. 然后是各种折腾,各种测试,最后发现,使用ssl的时候 ...

  2. USB的包结构及包分类

    USB的传输总是低位在前,高位在后. USB的传输方向:从设备到主机的数据为输入:从主机到设备的数据叫做输出. 1. 包结构 以同步域开始,紧跟着一个包标识符PID(Packet Identifier ...

  3. Let's Encrypt与DNS轮循

    本文由网络安全研究员.securityheaders.io和report-uri.io创始人Scott Helme发布在其个人博客中.描述了如何使用Let's Encrypt的同时兼容DNS轮循. 早 ...

  4. (转)浅析CSS——元素重叠及position定位的z-index顺序

    多次在项目中遇到html页面元素的非期待重叠错误,多数还是position定位情况下z-index的问题.其实每次解决类似问题思路大致都是一样的,说到底还是对z-index的理解比较模糊,可以解决问题 ...

  5. 【EntityFramework 6.1.3】个人理解与问题记录

    前言 又是一个炎热夏日的晚上,开着空调听着音乐又开始了我们今天的博文.此文并不是ROM工具哪家强之类的引战贴,只是本文自己的一点看法和见解,望前辈看官有望斧正 声明 本文欢迎转载,原文地址:http: ...

  6. 基于Vivado调用ROM IP core设计DDS

     DDS直接数字式频率合成器(Direct Digital Synthesizer) 下面是使用MATLAB生成正弦波.三角波.方波的代码,直接使用即可. t=:*pi/^:*pi y=0.5*sin ...

  7. [COGS 1065] 绿豆蛙的归宿

    先贴题面w 1065. [Nescafe19] 绿豆蛙的归宿 ★   输入文件:ldfrog.in   输出文件:ldfrog.out   简单对比时间限制:1 s   内存限制:128 MB 随着新 ...

  8. maven相关的学习资料

    1, maven的settings配置文件详解: http://blog.csdn.net/jinshuaiwang/article/details/23686099 2,maven原理---翡青的博 ...

  9. HAproxy部署配置

    HAproxy部署配置 拓扑图 说明: haproxy服务器IP:172.16.253.200/16 (外网).192.168.29.140/24(内网) 博客服务器组IP:192.168.29.13 ...

  10. C语言程序设计进阶 翁恺 第4周编程练习

    第4周编程练习 查看帮助 返回 第4周编程练习 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业 ...