vue中keep-alive详细讲解
场景
今天产品跑过来跟我说,
当我在A页面修改数据后,去B页面。
然后返回A页面。希望A页面保留我修改后的数据。
而不是数据又恢复最初的样子了。我心里想,尼玛,又要加班了?
看下面小粒子
数据被被重置的问题
<template>
  <div>
      <el-button @click="gotosHander">去详情页面</el-button>
      <el-button @click="changeHander">改变数据</el-button>
      <ul class="box">
        <li class="demoli" v-for="(item,index) in list" :key="index">
          {{ item.name }}==> {{item.age  }}
        </li>
      </ul>
  </div>
</template>
<script>
  export default {
    data(){
      return{
        list:[
          {name:'张三',age:23},
          {name:'李四',age:33},
        ]
      }
    },
    methods:{
      gotosHander(){
        this.$router.push("/details")
      },
      changeHander(){
        this.list=[
          {name:'何西亚',age:33},
        ]
      }
    }
  }
</script>

我们发现的问题
在页面更改数据后,我们去详情页面。
在返回上一个页面。数据被重置了。
但是我们并不想数据重置。
想让他保留我们更改后的样子,
怎么办?????
使用keep-alive解决数据被重置
<keep-alive>
    <router-view></router-view>
</keep-alive>

在页面中使用一个定时器
<template>
  <div>
      <el-button @click="gotosHander">去详情页面</el-button>
  </div>
</template>
<script>
  export default {
    data(){
      return{
        timer:null
      }
    },
    methods:{
      gotosHander(){
        this.$router.push("/details")
      },
    },
    mounted(){
      this.timer=setInterval(()=>{
        console.log("@@@@@@@@@@@@@@@@@@@")
      },100)
    },
    beforeDestroy(){
      clearInterval(this.timer)
    }
  }
</script>

keep-alive产生的问题
如果我们在页面中写一个定时器,
那么这个定时器在beforeDestroy中将不会被清除。
也就是说:使用keep-alive后,页面中的beforeDestroy不会被执行
如何让页面中的beforeDestroy被执行
我们可以使用生命周期 activated 和 deactivated
activated是页面或者组件被激活的时候触发该函数,
激活可以理解为展示在页面上的时候。
deactivated是页面别取消隐藏的时候触发该函数
我们从详情页进入该页面的时候,
使用activated函数。因为是展示嘛~
当我们离开该页面的时候触发函数deactivated,因为是隐藏嘛~
从详情页进入该页面
<template>
  <div>
      <el-button @click="gotosHander">去详情页面</el-button>
  </div>
</template>
<script>
  export default {
    data(){
      return{
        timer:null
      }
    },
    methods:{
      gotosHander(){
        this.$router.push("/details")
      },
    },
    mounted(){
      this.timer=setInterval(()=>{
        console.log("@@@@@@@@@@@@@@@@@@@")
      },100)
    },
    activated(){
      console.log("页面被激活的时候触发该函数")
    },
    deactivated(){
      clearInterval(this.timer)
      console.log("页面被取消/切换的时候触发该函数")
    },
  }
</script>

keep-alive的后遗症
刚刚我们说了,使用keep-alive后,默认情况下,
所有页面中的beforeDestroy和destroyed生命周期函数不会被执行了
我的个乖乖~,好可怕!
其实也不是没有办法,只是我们使用include。
include只会缓存与之匹配的值
include的使用
<keep-alive  include="yourPageName">
    <router-view></router-view>
</keep-alive>
上面这段代码只会缓存【页面、组件】名是yourPageNamede
如果你需要缓存多个页面或者组件。
你可以写成一个数组
<keep-alive  :include="['yourPageName','xingqing']">
    <router-view></router-view>
</keep-alive>
<template>
    <div>
        <el-button @click="backHander">返回上一页</el-button>
        我是详情页面
    </div>
</template>
<script>
    export default {
        //这个是组件或者页面名。
        // 因为include会自动匹配,该组件会被缓存
        // 所以销毁的生命周期是不会被执行的
        // activated【激活、展示】 和 deactivated【隐藏、离开】会被执行
        name:'xingqing',
    }
</script>
												
											vue中keep-alive详细讲解的更多相关文章
- vue中watch的详细用法
		
在vue中,使用watch来响应数据的变化.watch的用法大致有三种.下面代码是watch的一种简单的用法: <input type="text" v-model=&quo ...
 - vue中watch的详细用法(转载)
		
在vue中,使用watch来响应数据的变化.watch的用法大致有三种.下面代码是watch的一种简单的用法: <input type="text" v-model=&quo ...
 - vue中router-link的详细用法
		
官网文档地址:https://router.vuejs.org/zh/api/#to 今天项目突然有需求,让vue中的一个页面跳转到另一个页面 // 字符串 <router-link to=&q ...
 - Vue 中使用 TypeScript 详细总结
		
VUE 项目中使用 Typescript 第一节:项目起步 Vue 中使用 TypeScript 项目中主要使用到的第三方依赖 vue2 vue-class-component vue-propert ...
 - vue中watch的详细用法(深度侦听)
		
vsCode插件 在vue中,使用watch来响应数据的变化.watch的用法大致有三种.下面代码是watch的一种简单的用法: <input type="text" v-m ...
 - 054——VUE中vue-router之实例讲解定义一下单页面路由
		
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - vue中的provide/inject讲解
		
最近在看element-ui的源码,发现了一个这样的属性:inject.遂查看官网provider/inject provider/inject:简单的来说就是在父组件中通过provider来提供变量 ...
 - java中log4j用法详细讲解和一些小总结
		
0.Log4j的用法详解 首先,在项目中的classes 中新建立一个log4j.properties文件即可: 在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义.定义步骤就是对 ...
 - Unix操作系统中UUCP知识详细讲解
		
导读 Unix操作系统有很多值得学习的地方,这里我们主要介绍Unix操作系统中的uucp,大家一起来学习下吧!UUCP系统是一组程序,完成文件传输,执行系统之间的命令,维护系统使用情况的统计,保护安全 ...
 - 关于ios中得路径详细讲解
		
利用create groups for any added folders 这样的方式表示的是将所有的资源都放在资源包得路径下,没有层次的概念利用create folder references fo ...
 
随机推荐
- STM32+华为云IoTDA,带你设计一个属于自己的动态密码锁
			
摘要:设计一款物联网智能电子密码锁,以STM32单片机为主控制器,由触摸矩阵键盘.ESP8266.步进电机等模块组成,具有远程控制.随机密码生成等功能. 本文分享自华为云社区<STM32+华为云 ...
 - CWE4.6标准中加入 OWASP 2021 TOP10
			
摘要: 新发布的CWE4.6标准,加入了OWASP 2021 TOP10的视图. 本文分享自华为云社区<CWE 4.6 和 OWAPS TOP10(2021)>,作者: Uncle_Tom ...
 - vue2升级vue3:TypeScript下vuex-module-decorators/vuex-class to vuex4.x
			
因为vue2 下 vue-property-decorator + vue-tsx-support +vuex-module-decorators/vuex-class ,class compone ...
 - 还在用 Excel 和 SQL?火山引擎 VeDI 这款产品帮你更快处理数据
			
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 对大多数职场打工人来说,看数据.用数据一直是项有"门槛"的工作. 特别是在企业业务快速发展的背景下,为 ...
 - PPT 商务PPT 如何展示你的产品
			
PPT 商务PPT 如何展示你的产品 如何优雅的展示产品 如何展示互联网产品 直接产品截图,比较生硬,简单粗暴 使用场景+样机 放一个电脑或手机的外壳 如何展示产品 如何展示现实中的产品 多角度剪裁 ...
 - PPT 文字穿插
			
软件文字,添加一个形状 先选形状,再选文字 选择拆分 设置对象格式
 - System.out.printf 格式化输出
			
System.out.printf @Test public void printTest() throws Exception { String str = "安倍晋三已无生命体征!!&q ...
 - Intellij IDEA 集成 Docker 发布
			
1. Docker开启远程访问,注意端口不要用默认的,防止被攻击 [root@localhost ~]# vi /usr/lib/systemd/system/docker.service 修改 # ...
 - Django rest_framework用户认证和权限
			
完整的代码 https://gitee.com/mom925/django-system 使用jwt实现用户认证 pip install djangorestframework-simplejwt 重 ...
 - 锁定/解锁账户BAPI
			
一.锁定/解锁账户 锁定账户后,该账户不能在SAP系统登录,但是已经登录的用户,仍然可以继续使用 解锁账户后,该账户就可以正常登录使用 "-------------------------- ...