位置: IT常识 - 正文

Vue缓存路由(keep-alive)以及新的生命周期(vue缓存路由组件相关的两个生命周期函数是)

编辑:rootadmin
Vue缓存路由(keep-alive)以及新的生命周期

推荐整理分享Vue缓存路由(keep-alive)以及新的生命周期(vue缓存路由组件相关的两个生命周期函数是),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue的路由缓存,vue缓存路由记录页数,vue缓存路由组件,vue缓存路由记录页数,vue缓存路由记录页数,vue缓存路由组件,vue缓存路由组件相关的两个生命周期函数是,vue缓存路由组件,内容如对您有帮助,希望把文章链接给更多的朋友!

一.概念

也就是说,kee-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染 。也就是所谓的组件缓存 keep-alive 是 Vue 的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们 在平常开发中,有部分组件没有必要多次初始化,这时,我们需要将组件进行持久化,使组件的状态维持不变,在下一次展示时,也不会进行重新初始化组件。在组件切换过程中将状态保留在内存中,防止重复渲染DOM,减少加载时间及性能消耗,提高用户体验性。

三.Props

include - 字符串或正则表达式。只有名称匹配的组件会被缓存。 exclude - 字符串或正则表达式。任何名称匹配的组件都不会被缓存。 max - 数字。最多可以缓存多少组件实例 两个新的生命周期钩子 作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。只适用于keep-alive

四. 生命周期

当组件在 内被切换,它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。

activated : 路由组件被激活时触发。(当进入缓存的路由组件时触发) 使用 keep-alive 会将数据保留在内存中,如果要在每次进入页面的时候获取最新的数据,需要在 activated 阶段获取数据,承担原来 created 钩子函数中获取数据的任务 你应该初始读取一次数据,比如在created里面, 而activated第一次创建页面时不会激活,缓存之后,第二次进入才会开始激活 // 当缓存组件被激活的时候执行

activated(){ this.userName = this.$route.query.id },

deactivated: 路由组件失活时触发。(当离开缓存的路由组件时触发)

五.用法(两种方式)1.根据条件缓存页面// 所有路径匹配到的视图组件都会被缓存!<keep-alive> <router-view></router-view></keep-alive>// 只缓存组件name为aa或者bb的组件<keep-alive include="aa,bb"> <component /></keep-alive>// 组件name为cc的组件不缓存<keep-alive exclude="cc"> <component /></keep-alive>// 如果同时使用include,exclude,那么exclude优先于include, 下面的例子只缓存aa组件<keep-alive include="aa,bb" exclude="bb"> <component /></keep-alive>// 如果缓存的组件超过了max设定的值3,那么将删除第一个缓存的组件<keep-alive exclude="c" max="3"> <component /></keep-alive>

缺点:需要知道组件的 name,项目复杂的时候不是很好的选择

3.结合路由缓存部分页面

优点:不需要例举出需要被缓存组件名称

//在 router 目录下的 index.js 文件里import Vue from 'vue'import Router from 'vue-router'Vue.use(Router)import Layout from '@/layout'export default new Router = [ { path: '/admin', component: Layout, redirect: '/admin/user', alwaysShow: true, name: 'Admin', meta: { title: '系统管理', icon: 'documentation' }, children: [ { path: 'user', component: () => import('@/views/admin/user'), name: 'User', meta: { title: '用户管理', keepAlive: true // 需要缓存 } }, { path: 'user2', component: () => import('@/views/admin/user2'), name: 'User2', meta: { title: '用户管理2', keepAlive: false // 不需要缓存,默认不缓存,可以不写 } } ] }]

App.vue

<template> <div id="app"> <!-- <router-view/> --> <!-- 可以被缓存的视图组件 --> <keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> </keep-alive> <!-- 不可以被缓存的视图组件 --> <router-view v-if="!$route.meta.keepAlive"></router-view> </div></template><style></style>使用 router.meta 拓展

当然,也可以通过动态设置route.meta的keepAlive属性来实现其他需求, 首页是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(); }};六/实现前进刷新,返回不刷新

所说的前进刷新后退不刷新是指组件是否重新渲染,比如列表list页面,点击其中的每一项进入详情detail页面,然后从detail页面后退到列表list页面时,list页面没有重新渲染,也没有重新发送ajax请求

routes: [{ path: '/', name: 'home', component: Home, meta: { keepAlive: false //此组件不需要被缓存 } }, { path: '/list', name: 'list', component: List, meta: { keepAlive: true //此组件需要被缓存 } }, { path: '/detail', name: 'detail', component: Detail, meta: { keepAlive: false // 此组件需要被缓存 } }]Vue缓存路由(keep-alive)以及新的生命周期(vue缓存路由组件相关的两个生命周期函数是)

第一次进入keep-alive组件时,其生命周期执行顺序

beforeRouteEnter --> created --> mounted --> activated --> deactivated

非首次进入时,其生命周期执行顺序:

beforeRouteEnter -->activated --> deactivated

,非首次进入keep-alive组件时,正常的vue组件生命周期函数是不会在执行,而会执行keep-alive新增的两个周期钩子函数。同时也可以看出离开keep-alive组件时其destroy周期函数并没有执行,从侧面证明缓存组件并没有销毁。根据介绍,我们可以:

通过利用keep-alive提供activated钩子函数来决定是否进行ajax请求来更新组件,以及deactivated钩子函数来重置页面相关状态。

首先,在每个路由元信息meta中添加一个isBack字段

... { path: '/list', name: 'list', component: List, meta: { keepAlive: true, //此组件需要被缓存 isBack: false } } ...

(list.vue页面 )然后,借助beforeRouteEnter钩子函数来判断页面来源

beforeRouteEnter(to, from, next) { if(from.name === 'detail') { //判断是从哪个路由过来的,若是detail页面不需要刷新获取新数据,直接用之前缓存的数据即可 to.meta.isBack = true; } next(); },

最后,需要借助keep-alive提供钩子函数activated来完成是否更新:

activated() { if(!this.$route.meta.isBack) { // 如果isBack是false,表明需要获取新数据,否则就不再请求,直接使用缓存的数据 this.getData(); // ajax获取数据方法 } // 恢复成默认的false,避免isBack一直是true,导致下次无法获取数据 this.$route.meta.isBack = false },

特殊情况,在keep-alive组件前进的页面刷新导致keep-alive组件状态丢失 继续以上面的list、detail页面为例,在进入详情页面后,然后刷新,这时列表页面的缓存的数据都丢失了,由于上面的判断规则也会导致不会重新获取数据。所以对于这种问题,还需要额外加一些判断条件。由于keep-alive第一次进入时会执行created方法,所以利用这点加一个标识来加以判断:

//第一次进入keep-alive路由组件时 created() { this.isFirstEnter = true; // 只有第一次进入或者刷新页面后才会执行此钩子函数,使用keep-alive后(2+次)进入不会再执行此钩子函数 }, activated() { if(!this.$route.meta.isBack || this.isFirstEnter){ // 如果isBack是false,表明需要获取新数据,否则就不再请求,直接使用缓存的数据 // 如果isFirstEnter是true,表明是第一次进入此页面或用户刷新了页面,需获取新数据 this.data = ''// 把数据清空,可以稍微避免让用户看到之前缓存的数据 this.getData(); } // 恢复成默认的false,避免isBack一直是true,导致下次无法获取数据 this.$route.meta.isBack=false // 恢复成默认的false,避免isBack一直是true,导致每次都获取新数据 this.isFirstEnter=false; },

列表页回到上次浏览位置

条件:1、列表页不可使用懒加载延迟加载数据,2、列表页需要使用keepAlive缓存

beforeRouteLeave(to,from,next){ //离开页面之前将高度存储到sessionStorage。这里不建议用localStorage,因为session在关闭浏览器时会自动清除,而local则需要手动清除,有点麻烦。sessionStorage.setItem('scrollH',document.getElementById('demo').scrollTop) next()},activated(){ //在activated生命周期内,从sessionStorage中读取高度值并设置到dom if(sessionStorage.getItem('scrollH')){ document.getElementById('demo').scrollTop=sessionStorage.getItem('scrollH') }},

可使用ref

this.$refs.demo.scrollTop =50;

其他:

参考: 1路由缓存, 2前进后退刷新问题, 3.一直缓存,判断是否第一次进入,或者是否返回,返回重新请求数据刷新页面,不是的话默认缓存 ​

本文链接地址:https://www.jiuchutong.com/zhishi/299407.html 转载请保留说明!

上一篇:我的十年编程路 2020年篇(我的十年怎么写)

下一篇:使用nvm安装node(使用nvm安装nodejs后无法执行node命令)

  • 2016怎样成功申请搜狐自媒体?

    2016怎样成功申请搜狐自媒体?

  • 苹果手机icloud照片怎么恢复到相册(苹果的照片icloud)

    苹果手机icloud照片怎么恢复到相册(苹果的照片icloud)

  • vivo NEX 3s有几种颜色呢(vivo nex3 3s)

    vivo NEX 3s有几种颜色呢(vivo nex3 3s)

  • 华为荣耀8x手机多少厘米(华为荣耀8x手机壳)

    华为荣耀8x手机多少厘米(华为荣耀8x手机壳)

  • 7p屏幕c11和dtp通用吗(iphone7plus屏幕c11和dtp怎么区分)

    7p屏幕c11和dtp通用吗(iphone7plus屏幕c11和dtp怎么区分)

  • 苹果7ios10系统怎么录屏

    苹果7ios10系统怎么录屏

  • oppoa11可以开空调吗(oppo 能不能开空调)

    oppoa11可以开空调吗(oppo 能不能开空调)

  • iphone现在安装是灰色的(ios更新是什么意思)

    iphone现在安装是灰色的(ios更新是什么意思)

  • Excel表格怎么加一根线(excel表格怎么加一列)

    Excel表格怎么加一根线(excel表格怎么加一列)

  • 网速变慢的原因及解决办法(网速变慢的原因有哪些)

    网速变慢的原因及解决办法(网速变慢的原因有哪些)

  • i7 9700t是什么cpu(i7-9700t 性能)

    i7 9700t是什么cpu(i7-9700t 性能)

  • 抖音上地址是随人处的地方定位的吗(抖音上的地址是根据什么决定的)

    抖音上地址是随人处的地方定位的吗(抖音上的地址是根据什么决定的)

  • 华为手机暂不支持此类文件(华为手机暂不支持HDR视频)

    华为手机暂不支持此类文件(华为手机暂不支持HDR视频)

  • qq撤回消息对方知道吗(对方撤回了一条消息如何恢复)

    qq撤回消息对方知道吗(对方撤回了一条消息如何恢复)

  • 联想r5和i5的区别(联想i5和r5的区别)

    联想r5和i5的区别(联想i5和r5的区别)

  • 11有指纹解锁吗(苹果11有指纹开锁吗?)

    11有指纹解锁吗(苹果11有指纹开锁吗?)

  • 华为微信支付能免单吗(华为怎么微信支付)

    华为微信支付能免单吗(华为怎么微信支付)

  • 抖音号能查到微信号吗(抖音能查到微信号码)

    抖音号能查到微信号吗(抖音能查到微信号码)

  • 小米mde6是什么型号(小米MDE6是什么型号)

    小米mde6是什么型号(小米MDE6是什么型号)

  • 淘宝公益宝贝有什么用(淘宝公益宝贝有权重吗)

    淘宝公益宝贝有什么用(淘宝公益宝贝有权重吗)

  • 手机清内存怎么清理(手机清内存怎么找Qq聊天图片)

    手机清内存怎么清理(手机清内存怎么找Qq聊天图片)

  • 华为手环3怎么开机(华为手环3怎么连接手机使用教程)

    华为手环3怎么开机(华为手环3怎么连接手机使用教程)

  • trt-al00是什么型号(trt-al00什么型号)

    trt-al00是什么型号(trt-al00什么型号)

  • 为什么动态壁纸没有声音(为什么动态壁纸设置一段时间就不动了)

    为什么动态壁纸没有声音(为什么动态壁纸设置一段时间就不动了)

  • 小米平板怎么投屏到电视(小米平板怎么投屏到投影仪)

    小米平板怎么投屏到电视(小米平板怎么投屏到投影仪)

  • 朋友圈怎么发实况照片(朋友圈怎么发实时位置)

    朋友圈怎么发实况照片(朋友圈怎么发实时位置)

  • Mac怎么同时登录2个微信?苹果电脑微信双开教程(mac如何登陆两个微信)

    Mac怎么同时登录2个微信?苹果电脑微信双开教程(mac如何登陆两个微信)

  • 在Linux系统中使用fuser命令来列出进程编号(在linux操作系统中)

    在Linux系统中使用fuser命令来列出进程编号(在linux操作系统中)

  • watch os2.0有哪些新功能 watch os2.0新功能详解(watch os2.1支持机型)

    watch os2.0有哪些新功能 watch os2.0新功能详解(watch os2.1支持机型)

  • JavaScript知识总结 基础篇(js相关知识)

    JavaScript知识总结 基础篇(js相关知识)

  • 增值税专用发票抵扣期限
  • 矿产资源补偿费计入管理费用吗
  • 居民个人取得境内、境外所得,如何计算应纳税额?
  • 金税三期反映出来的是前几年的问题
  • 房产税从价计征和从租怎么选择
  • 公司收到借款利息收入要交增值税吗
  • 卖出看跌期权的损益图
  • 支票上的法人章和财务章是央行盖吗
  • 科目余额表凭证号顺序
  • 开发成本属于什么类账户
  • 通用机打发票还能用吗
  • 劳务费专票需要备注吗
  • 企业文化事业建设费计算
  • 员工报销款可以公转私吗
  • 物业代收费:有关法律
  • 当买方违约时,卖方可以得到哪些补救?
  • 驻外人员医保报销
  • 公司牌车还款从哪里扣款
  • 收到样品费计入什么科目
  • 一次性发20万元个税如何算
  • 企业个人所得税逾期未申报怎么办
  • 总分机构如何做账
  • 为什么餐费不能计入在差旅费
  • 物业公司怎么开展业务
  • 本年累计金额和上年金额
  • 积分小技巧
  • 广告设计公司需要哪些设备
  • 汇兑损益计算例题
  • 工程建设劳务费怎么算
  • 备用金借款单怎么写
  • 什么是短期借款利率
  • 用友t3怎样查询报表
  • 贸易公司出口是什么意思
  • bios报警声是怎样的
  • 如何处理收到的短信
  • php curl_init
  • 补提去年的所得税费用是怎么做分录?
  • 建筑工程甲级什么意思
  • h5调用海康摄像头
  • joplin使用
  • php请求https
  • 下载vue2
  • idea2020.2.3创建web
  • php ffi
  • php类的特性实例是什么
  • Laravel 5.1 on SAE环境开发教程【附项目demo源码】
  • vue实现回车登录
  • 终止经营净利润含义
  • 印花税应计入哪里
  • 织梦前台数据不能存入中文
  • 商品流通企业购入的商品采用售价金额法核算的
  • 交易性金融资产的账务处理
  • 办理进出口权的费用西安
  • 超市的小票能入账吗
  • 企业缴纳印花税时需要
  • 计量差错引起的原材料盘亏
  • 费用转销是什么意思
  • 小规模转一般纳税人条件最新政策
  • 清除sql表内容
  • sql只能查询数据,不能修改数据
  • win8连接网络
  • 000.exe病毒
  • win10 禁用驱动
  • win1021年更新
  • win7系统图形设置选项
  • win7能打lol
  • win10系统安装cad2008的注册机无法打开
  • Python判断字符串结尾并输出yes或no
  • jquery dom对象
  • interview分析方法
  • 抛弃无情道剑尊后扶桑知我
  • 菜鸟 javascript
  • android获取本机ip地址
  • 深入理解计算机系统
  • jquery不生效的原因
  • jquery设置iframe的src
  • python ftp storbinary
  • 工商跟税务的区别
  • 国家税务总局,湖北省税务局
  • 预征率是2%怎么计算
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设