vue中keepalive的用法优缺点,vue的keep-alive的正确用法

  vue中keepalive的用法优缺点,vue的keep-alive的正确用法

  本文主要介绍vue的keepAlive用例的详细说明。本文通过一个简单的案例来说明对这项技术的理解和使用。以下是详细内容,有需要的朋友可以参考一下。

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

  以下解决方案可用于解决该问题:

  

一、利用meta标签

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

  路径:“/classify”,

  名称:分类,

  component:()=import( @/views/classify/classify . vue ),

  元:{

  标题:“石勒淘宝优惠券”,

  keepAlive:真

  }

  },

  2.创建路由器实例时添加scrollBehavior方法。

  导出默认新路由器({

  模式:“历史”,

  base: process.env.BASE_URL,

  路线,

  scrollBehavior (to,from,savedPosition) {

  if (savedPosition) {

  返回保存的位置

  }否则{

  返回{

  x: 0,

  y: 0

  }

  }

  }

  })

  3.将保活组件包装在需要缓存的路由器视图组件上。

  点火电极

  路由器视图v-if= $ route . meta . keepalive /路由器视图

  /保持活力

  路由器-查看v-if=!$ route . meta . keepalive /router-view

  4.因为在某些情况下需要缓存,而在其他情况下不需要,所以可以在缓存组件的路由钩子函数中做出判断。

  beforeRouteLeave(收件人、发件人、下一个){

  this.loading=true

  if (to.path===/goods_detail) {

  from.meta.keepAlive=true

  }否则{

  from.meta.keepAlive=false

  //这个。$destroy()

  }

  下一个()

  },

  您可以支持组件的缓存,但是这种方法有一个缺陷。第一,第一次打开页面时不缓存,也就是第一次从列表页跳转到详情页,再回来就不缓存了。稍后,当您进入详细信息页面时,它将被缓存。

  只有第一个进入的状态会被缓存,数据不会被重新请求。如果A页选择了一个类别跳转到B页,然后从列表页B跳转到详情页,这个状态会被缓存,以后从A页的其他类别跳转到B页也不会重新缓存,这样每次从详情页返回B页都会跳转到第一个缓存的状态。当您的项目只有一个状态要缓存时,请考虑使用此方法。

  

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

  首先,介绍包含和排除vue文件,https://cn.vuejs.org/v2/api/#keep-alive.

  是vue2.0之后的新属性。

  Include是需要缓存的组件;

  除了某些组件外,Exclude被缓存;

  Include和exclude属性允许有条件地缓存组件。两者都可以用逗号分隔的字符串、正则表达式或数组来表示:

  保持活动包括=a,b

  组件:is= view /组件

  /保持活力

  !-正则表达式(使用“v-bind ”)-

  keep-alive :include=/ab/

  组件:is= view /组件

  /保持活力

  !-数组(使用“v-bind ”)

  keep-alive :include=[a , b]

  组件:is= view /组件

  /保持活力

  首先检查组件自己的名称选项是否匹配,如果名称选项不可用,则匹配其本地注册的名称(父组件组件选项的键值)。匿名组件无法匹配。

  Max只是在2.5.0中添加的,可以缓存的组件实例的最大数量。一旦达到该数量,在创建新实例之前,缓存组件中最长时间未被访问的实例将被销毁。

  保持活动状态:max=10

  组件:is= view /组件

  /保持活力

  

activated 与 deactivated。

  简单介绍一下,在keep-alive包含的组件/路由中,会多两个生命周期的钩子:激活和去激活。

  文档:在2.2.0及更高版本中,树中所有嵌套组件都将触发激活和停用。

  Activated在首次呈现组件时调用,然后在每次激活缓存组件时调用。

  激活通话时间:

  首次进入缓存路由/组件,挂载后,beforeRouteEnter守护传递给next的回调函数并调用:

  Before=如果您来自另一个路由/组件(组件被破坏/缓存未激活)=mounted=激活以进入缓存组件=beforeMount=回调被执行。

  因为组件是缓存的,所以当您重新输入缓存的路由/组件://之前创建装载之前创建装载不会触发这些挂钩。

  停用:当组件被停用(离开路线)时调用。

  有了keep-alive,就不会调用beforeDestroy(组件销毁前的钩子)和destroyed(组件销毁),因为组件没有销毁而是缓存了。

  这个钩子可以看作是beforeDestroy的替代品。如果你缓存组件,并想在组件被销毁时做些什么,你可以把它们放在这个钩子中。

  如果你离开路线,它将依次触发:

  离开当前路由钩子before route Leave=route front guard before each=global rear hook after each=deactivated离开缓存组件=activated输入缓存组件(如果还输入了缓存路由,

  如何在以下情况下使用项目缓存:

  1.将scrollBehavior方法添加到创建的router对象中,同上;

  2.在include属性中添加要缓存的组件。

  keep-alive :include=[home , classified , search]

  路由器视图/路由器视图

  /保持活力

  3.在beforeRouteEnter的下一个返回函数中,初始化返回的A页面不需要缓存的情况,也就是把需要写入的东西写入这里创建的;一定要写好所有需要初始化的数据,不然会有bugs所以不推荐。

  beforeRouteEnter(收件人,发件人,下一个){

  接下来(虚拟机={

  //通过“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 (推荐使用)

  第三种方法与第二种类似,但不同的是,通过将需要缓存的组件保存到全局变量中,可以在routing的hook函数中灵活控制哪些组件需要缓存,哪些不需要缓存;与第二种方法相比,不需要每次重新初始化数据,但需要将数据保存在vuex中。

  上部代码

  1.将scrollBehavior方法添加到创建的router对象中,同上;

  2.在include属性中添加要缓存的组件。

  保持活动状态:include=catch_components

  路由器视图/路由器视图

  /保持活力

  3.在存储中添加要缓存的组件的变量名,以及对应的方法;

  导出默认的新Vuex。商店({

  状态:{

  catch_components: []

  },

  突变:{

  GET_CATCHE_COMPONENTS(状态,数据){

  state.catch_components=data

  }

  }

  })

  4.控制beforeRouteLeave钩子函数中需要缓存的组件。

  Forerouteleave (to,from,next){//控制离开这个组件时需要缓存的组件,否则将是第一次不缓存。

  this.busy=true

  如果(到。path===/goods _ detail ){//当你到详情页时,需要缓存组件;否则,不需要缓存。

  这个。$ store . commit( GET _ CATCHE _ COMPONENTS ,[home])

  }否则{

  这个。$ store . commit( GET _ CATCHE _ COMPONENTS ,[])

  }

  下一个()

  },

  另外,在我们的项目中,当路由相同但参数不同的情况下,组件复用且不更新时,vue官方给出了路由参数变化的响应。

  观察:{

  $route(目的地,出发地){

  document.title=这个。$route.query.name

  This.getDefault() //根据参数数据进行响应

  }

  },

  关于vue的keepAlive的用例的详细说明这篇文章到此为止。更多关于vue的keepAlive使用的信息,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: