Vue keep-alive数据缓存与activated、deactivated钩子

news/2024/7/10 3:05:45 标签: keep-alive, activated, deactivated, vue

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

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

 属性:

  • include: 字符串或正则表达式。只有匹配的组件会被缓存。-
  • exclude: 字符串或正则表达式。任何匹配的组件都不会被缓存。
// 组件
<script>
export default {
  name: 'Sidebar',
  data () {
    return {
        componentName: Sidebar
    }
  }
}
</script>

 

<keep-alive include="Sidebar">
  <!-- 将缓存name为Sidebar的组件 -->
  <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="componentName">
  <router-view></router-view>
</keep-alive>

<keep-alive exclude="Sidebar">
  <!-- 将不缓存name为Sidebar的组件 -->
  <component></component>
</keep-alive>

结合router缓存页面

注意这个 <keep-alive> 要求被切换到的组件都有自己的名字,不论是通过组件的 name 选项还是局部/全局注册。

<!-- 使用$route.meta的属性 -->
<keep-alive>
    <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>

需要在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 // 需要被缓存
      }
    }
  ]
})

如果不使用keep-aliveinclude,则直接缓存所有页面

<!-- 实际项目中可能部分页面需要缓存,部分不需要 -->
<transition name="fade-transform" mode="out-in">
  <keep-alive>
    <router-view v-if="cache" :key="key"></router-view>
  </keep-alive>
</transition>
<!-- 在vuex中可以动态改变cache,实现缓存取舍 -->
<transition name="fade-transform" mode="out-in">
  <router-view v-if="!cache"></router-view>
</transition>

使用keep-alive可以缓存页面,提高用户体验,同时keep-alive提供了两个钩子函数activateddeactivated

后台管理系统中可以将table数据请求放在activated钩子中,进入页面即请求数据,生成遮罩,离开页面(deactivated)关闭遮罩

  deactivated() {
    // 离开页面触发
    this.listLoading = false // 离开页面关闭遮罩
    this.activatedStatus = 1
  },
  activated() {
    // 使用keep-alive时才会生效,在进入页面时触发
    if (!this.data.length) {
      // 进入页面判断是否有数据,没有数据发起请求
      this.getList()
    }
  }

使用keep-alive可以方便使用这两个钩子函数,减少mounted等钩子的使用,方便页面切换。


http://www.niftyadmin.cn/n/509276.html

相关文章

点击按钮重复发送请求(节流) 及 input模糊查询重复请求接口问题(防抖)

点击按钮重复发送请求&#xff1a;(节流) 项目中点击创建、编辑、删除等按钮都会发送http请求&#xff0c;网络卡顿的情况下点击按钮之后不能快速的响应&#xff0c;一般情况下用户会重复点击按钮&#xff0c;所以会造成重复发送请求问题&#xff0c;一定量造成卡顿延迟问题。…

视频,图片的websocket请求(h5 video)

之前有写过关于websocket的文章&#xff0c;都是一些粗略的理解&#xff0c;感兴趣可以看看&#xff0c;Vue WebSocket&#xff0c; websocekt 应用案例 这次围绕的主题是websocket视频请求&#xff0c;展示&#xff0c;先分析一下需求 要求点击获取证据按钮&#xff0c;发送…

vue 封装 Axios详解

Axios 是一个基于 promise 的 HTTP 库&#xff0c;可以用在浏览器和 node.js 中。 vue接口数据请求一般都使用的axios&#xff0c;先来看一下axios的部分常用配置项&#xff1a; // url 是用于请求的服务器 URLurl: /user,// method 是创建请求时使用的方法method: get, // de…

vue 用户登陆 和 退出登陆

首页登陆事件一般有两种&#xff0c;点击登陆(click)和回车事件(keyup)&#xff0c;触发的是同一个事件&#xff0c;上代码&#xff1a; // 如下是登陆页form表单部分代码 <el-form :model"loginForm" class"login-form" :rules"loginRules"…

vue + element table 增加行,删除行

项目中对表格内容进行编辑的时候会需要创建一行&#xff0c;或者删除一行&#xff0c;其实原理就是向表格数据中添加一个新对象&#xff0c;或者删除一个对应的对象&#xff0c;因为渲染表格数据来源一个数组&#xff0c;所以其实就是对数组的操作。 就像上图&#xff0c;可以创…

vue + elementUI 表格多选框选中 回显

项目开发使用的elemnetUI的table组件&#xff0c;牵扯到一个多选框的回显机制&#xff0c;这里记录一下。(最新方法在最下面) 那么想要实现table的多选框回显&#xff0c;前提得有多选框&#xff0c;而实现回显也主要有依赖多选框自带的几个事件&#xff0c;当表格存在多选框时…

elementUI table组件封装(vue)

前段时间公司做了一个新项目&#xff0c;后台管理这种&#xff0c;大部分都是表格&#xff0c;UI框架用的是element&#xff0c;所以我刚好把表格组件封装了一下&#xff0c; elementUI表格组件常用的功能就是单选/多选框勾选&#xff0c;数据展示&#xff0c;行内按钮操作等&…

字符串拼接 与 三目运算符,$nextTick

项目中在百度地图上绘制 信息窗口 的的时候需要获取后台数据进行绘制&#xff0c;可是用的时候用户并没有添加数据&#xff0c; 所以后台返回 字段 为 null&#xff0c;显示在页面中不太美观&#xff0c;然后就遇到了我要记录的问题&#xff1a; 地图绘制代码&#xff1a; u…