广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue之keepAlive使用案例详解
  • 308
分享到

vue之keepAlive使用案例详解

2024-04-02 19:04:59 308人浏览 独家记忆
摘要

在开发中经常有从列表跳到详情页,然后返回详情页的时候需要缓存列表页的状态(比如滚动位置信息),这个时候就需要保存状态,要缓存状态;Vue里提供了keep-alive组件用来缓存状态。

开发中经常有从列表跳到详情页,然后返回详情页的时候需要缓存列表页的状态(比如滚动位置信息),这个时候就需要保存状态,要缓存状态;Vue里提供了keep-alive组件用来缓存状态。
可以用以下几种方案解决问题;

一、利用meta标签

1、首先在路由中的meta标签中记录keepAlive的属性为true


path: '/classify',
  name: 'classify',
  component: () => import('@/views/classify/classify.vue'),
  meta: {
    title: '雷石淘券券',
    keepAlive: true
  }
},

2、在创建router实例的时候加上scrollBehavior方法


export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes,
  scrollBehavior (to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    } else {
      return {
        x: 0,
        y: 0
      }
    }
  }
})

3、在需要缓存的router-view组件上包裹keep-alive组件


<keep-alive>
   <router-view v-if='$route.meta.keepAlive'></router-view>
</keep-alive>
<router-view v-if='!$route.meta.keepAlive'></router-view>

4、由于有些情况下需要缓存有些情况下不需要缓存,可以在缓存的组件里的路由钩子函数中做判断


beforeRouteLeave (to, from, next) {
    this.loading = true
    if (to.path === '/Goods_detail') {
      from.meta.keepAlive = true
    } else {
      from.meta.keepAlive = false
     // this.$destroy()
    }
    next()
  },

可以支持组件的缓存,但是这种方法有bug,首先第一次打开页面的时候并不缓存,即第一次从列表页跳到详情页,再回来并没有缓存,后面在进入详情页才会被缓存
并且只会缓存第一次进入的状态,不会重新请求数据,如果当页面A选中一个分类跳到B页面,再从B列表页面跳往详情页,此时会缓存这个状态,并且以后再从A页面的其他分类跳到B页面都不会重新被缓存,以至于每次从详情页返回B页面都会跳第一次缓存的状态;当你的项目只有一种状态需要缓存,可以考虑使用这种方法

二 使用include、exclude属性和beforeRouteEnter钩子函数

首先介绍一下include和exclude vue文档https://cn.vuejs.org/v2/api/#keep-alive
是在vue2.0以后新增的属性
include是需要缓存的组件;
exclude是除了某些组件都缓存;
include 和 exclude 属性允许组件有条件地缓存。二者都可以用逗号分隔字符串正则表达式或一个数组来表示:


<keep-alive include="a,b">
  <component :is="view"></component>
</keep-alive>
 
<!-- 正则表达式 (使用 `v-bind`) -->
<keep-alive :include="/a|b/">
  <component :is="view"></component>
</keep-alive>
 
<!-- 数组 (使用 `v-bind`) -->
<keep-alive :include="['a', 'b']">
  <component :is="view"></component>
</keep-alive>

匹配首先检查组件自身的 name 选项,如果 name 选项不可用,则匹配它的局部注册名称 (父组件 components 选项的键值)。匿名组件不能被匹配。

max只在2.5.0新增,最多可以缓存多少组件实例。一旦这个数字达到了,在新实例被创建之前,已缓存组件中最久没有被访问的实例会被销毁掉。


<keep-alive :max="10">
  <component :is="view"></component>
</keep-alive>

activated 与 deactivated。

简单介绍一下在被keep-alive包含的组件/路由中,会多出两个生命周期的钩子:activated 与 deactivated。
文档:在 2.2.0 及其更高版本中,activated 和 deactivated 将会在 树内的所有嵌套组件中触发。
activated在组件第一次渲染时会被调用,之后在每次缓存组件被激活时调用。
activated调用时机:
第一次进入缓存路由/组件,在mounted后面,beforeRouteEnter守卫传给 next 的回调函数之前调用:

beforeMount=> 如果你是从别的路由/组件进来(组件销毁destroyed/或离开缓存deactivated)=>mounted=> activated 进入缓存组件 => 执行 beforeRouteEnter回调

因为组件被缓存了,再次进入缓存路由/组件时,不会触发这些钩子:// beforeCreate created beforeMount mounted 都不会触发。

deactivated:组件被停用(离开路由)时调用
使用了keep-alive就不会调用beforeDestroy(组件销毁前钩子)和destroyed(组件销毁),因为组件没被销毁,被缓存起来了。
这个钩子可以看作beforeDestroy的替代,如果你缓存了组件,要在组件销毁的的时候做一些事情,你可以放在这个钩子里。
如果你离开了路由,会依次触发:

组件内的离开当前路由钩子beforeRouteLeave => 路由前置守卫 beforeEach =>全局后置钩子afterEach => deactivated 离开缓存组件 => activated 进入缓存组件(如果你进入的也是缓存路由

项目中缓存使用方法:
1、在创建的router对象上加scrollBehavior方法,同上;
2、将需要缓存的组件加在include属性里


<keep-alive :include="['home','classify','search']">
      <router-view></router-view>
</keep-alive>

3、在beforeRouteEnter的next回掉函数里,对返回A页面不需要缓存的的情况初始化,即将本来需要写在created里的东西写在这里;注意一定要将所有的需要初始化的数据要写一遍,不然会有bug;所以不太推荐


beforeRouteEnter (to, from, next) {
    next(vm => {
      // 通过 `vm` 访问组件实例
      if (from.path !== '/goods_detail') { // 一定是从A进到B页面才刷新
        vm.titleText = vm.$route.query.name
        vm.categoryUpper = vm.$route.query.categoryUpper
        vm.goods = []
        vm.page = 1
        vm.catsIndex = 0
        vm.is_search = false
        vm.getCats2()// 是本来写在created里面的各种
      }
    })
  }

三、使用include、exclude属性和beforeRouteLeave钩子函数和vuex (推荐使用)

第三种方法和第二种相似,不同的地方在于,将需要缓存的组件保存到全局变量,可以在路由的钩子函数里灵活的控制哪些组件需要缓存,那些不需要缓存;跟第二种方法相比,不需要每次再重新初始化数据,但是需要在vuex中保存数据;
上代码
1、在创建的router对象上加scrollBehavior方法,同上;
2、将需要缓存的组件加在include属性里


<keep-alive :include="catch_components">
      <router-view></router-view>
</keep-alive>

3、在store里加入需要缓存的的组件的变量名,和相应的方法;


export default new Vuex.Store({
  state: {
    catch_components: []
  },
mutations:{
    GET_CATCHE_COMPONENTS (state, data) {
      state.catch_components = data
    }
}
})

4、在beforeRouteLeave钩子函数里控制需要缓存的组件


beforeRouteLeave (to, from, next) { //要在离开该组件的时候控制需要缓存的组件,否则将出现第一次不缓存的情况
    this.busy = true
    if (to.path === '/goods_detail') { // 去往详情页的时候需要缓存组件,其他情况下不需要缓存
      this.$store.commit('GET_CATCHE_COMPONENTS', ['home'])
    } else {
      this.$store.commit('GET_CATCHE_COMPONENTS', [])
    }
    next()
  },

另外,在我们的项目中遇到路由相同但参数不同的情况组件被复用,不更新的问题,vue官方给出了 响应路由参数变化


watch: {
    '$route' (to, from) {
      document.title = this.$route.query.name
      this.getDefault() //根据参数数据响应
    }

  },

到此这篇关于vue之keepAlive使用案例详解的文章就介绍到这了,更多相关vue之keepAlive使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: vue之keepAlive使用案例详解

本文链接: https://www.lsjlt.com/news/135072.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue之keepAlive使用案例详解
    在开发中经常有从列表跳到详情页,然后返回详情页的时候需要缓存列表页的状态(比如滚动位置信息),这个时候就需要保存状态,要缓存状态;vue里提供了keep-alive组件用来缓存状态。...
    99+
    2022-11-12
  • vue keepAlive缓存清除问题案例详解
    vue项目中经常会用到keepalive来做缓存,在应付基本要求上可以说非常方便。但是遇到同一个页面,根据条件不同,分别缓存或者不缓存,就有些麻烦了。 首先先把坑列出来: 1. ...
    99+
    2022-11-12
  • Vue之TodoList案例详解
    <template> <div id="root"> <div class="todo-container"> ...
    99+
    2022-11-12
  • vue之监听器的使用案例详解
    第一种,用jquery的ajax发请求  用户注册时,判断用户名不能重复,可以用到监听器。监听器,用watch,需要监听哪个值的变化,就把这个值,放在watch里面。&#...
    99+
    2022-11-12
  • 详解Vue适时清理keepalive缓存方案
    目录需求思考尝试1. 手动操作 keep-alive 组件的 cache 数组2. exclude 大法好Demo需求 单页面应用中,用户进入表单填写页面,需要初始化表单内容,填写过...
    99+
    2022-11-13
  • vue前端开发keepAlive使用详解
    目录前言keep-avlive钩子函数keep-avlive缓存哪些组件小结及注意事项前言 keep-alive 是 Vue 的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,...
    99+
    2022-11-12
  • Vue之监听方法案例详解
    vue中的监听方法 watch 注意 名字 你想监听哪个属性,就要和他起一样的名字 1.作用 用来监听vue实例中的数据变化 可以随时修改状态的变化 2.触发条件 当你监听的属性...
    99+
    2022-11-12
  • Java之Jackson使用案例详解
    序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取...
    99+
    2022-11-12
  • Vue之vue.$set()方法源码案例详解
    在使用vue开发项目的过程中,经常会遇到这样的问题:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更...
    99+
    2022-11-12
  • Vue使用Swiper的案例详解
    Vue使用Swiper看这一篇就够了 此案例实现需求 完成swiper动态异步数据下的slide渲染自定义分页器样式解决loop:true设置时的事件丢失问题swiper鼠标移入/移...
    99+
    2022-11-13
  • Vue之使用mockjs生成模拟数据案例详解
    目录在项目中安装mockjs在Vue项目中使用mockjs的基本流程Mock语法规范数据模板定义规范(Data Template Definition,DTD)数据占位符定义规范(D...
    99+
    2022-11-12
  • C# ThreadPool之QueueUserWorkItem使用案例详解
    先看代码: //设置可以同时处于活动状态的线程池的请求数目。 bool pool = ThreadPool.SetMaxThreads(8, 8); if (pool) { ...
    99+
    2022-11-12
  • perl之print,printf,sprintf使用案例详解
    目录printprintfsprintf区别参考文档详细用法,可以查看perl用户手册。 perldoc -f print perldoc -f printf perldoc -...
    99+
    2022-11-12
  • Android之AttributeSet案例详解
    public interface AttributeSet { public int getAttributeCount(); public...
    99+
    2022-11-12
  • Java之HashMap案例详解
    概述 这篇文章,我们打算探索一下Java集合(Collections)框架中Map接口中HashMap的实现。Map虽然是Collctions框架的一部分,但是Map并没有实现Col...
    99+
    2022-11-12
  • Java之Algorithm_analysis案例详解
    public class BubbleSort { public void sort(int[] array){ for(int i=1;i<...
    99+
    2022-11-12
  • vue中keepAlive组件的作用和使用方法详解
    前言 在面试的时候,很多面试官再问vue的时候可能就会提一嘴,你知道keep-alive有什么作用吗? keep-alive是vue内置的一个组件,而这个组件的作用就是能够缓存不活动...
    99+
    2022-11-12
  • Vue.js之$emit用法案例详解
    1、父组件可以使用 props 把数据传给子组件。 2、子组件可以使用 $emit 触发父组件的自定义事件。 vm.$emit( event, arg ) //触发当前实例上的事件 ...
    99+
    2022-11-12
  • Java之Class.forName()用法案例详解
    Class.forName()主要功能 Class.forName(xxx.xx.xx)返回的是一个类, Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载...
    99+
    2022-11-12
  • SpringBoot之使用枚举参数案例详解
    接口开发过程中不免有表示类型的参数,比如 0 表示未知,1 表示男,2 表示女。通常有两种做法,一种是用数字表示,另一种是使用枚举实现。 使用数字表示就是通过契约形式,约定每个数字表...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作