成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

vue中keepAlive的使用

Anleb / 3349人閱讀

摘要:文檔在及其更高版本中,和將會(huì)在樹內(nèi)的所有嵌套組件中觸發(fā)。另外,在我們的項(xiàng)目中遇到路由相同但參數(shù)不同的情況組件被復(fù)用,不更新的問(wèn)題,官方給出了響應(yīng)路由參數(shù)變化根據(jù)參數(shù)數(shù)據(jù)響應(yīng)

前言

在開發(fā)中經(jīng)常有從列表跳到詳情頁(yè),然后返回詳情頁(yè)的時(shí)候需要緩存列表頁(yè)的狀態(tài)(比如滾動(dòng)位置信息),這個(gè)時(shí)候就需要保存狀態(tài),要緩存狀態(tài);vue里提供了keep-alive組件用來(lái)緩存狀態(tài)。
可以用以下幾種方案解決問(wèn)題;

一、利用meta標(biāo)簽

直接上代碼,
1、首先在路由中的meta標(biāo)簽中記錄keepAlive的屬性為true

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

2、在創(chuàng)建router實(shí)例的時(shí)候加上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組件


   

4、由于有些情況下需要緩存有些情況下不需要緩存,可以在緩存的組件里的路由鉤子函數(shù)中做判斷

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,首先第一次打開頁(yè)面的時(shí)候并不緩存,即第一次從列表頁(yè)跳到詳情頁(yè),再回來(lái)并沒(méi)有緩存,后面在進(jìn)入詳情頁(yè)才會(huì)被緩存
并且只會(huì)緩存第一次進(jìn)入的狀態(tài),不會(huì)重新請(qǐng)求數(shù)據(jù),如果當(dāng)頁(yè)面A選中一個(gè)分類跳到B頁(yè)面,再?gòu)腂列表頁(yè)面跳往詳情頁(yè),此時(shí)會(huì)緩存這個(gè)狀態(tài),并且以后再?gòu)腁頁(yè)面的其他分類跳到B頁(yè)面都不會(huì)重新被緩存,以至于每次從詳情頁(yè)返回B頁(yè)面都會(huì)跳第一次緩存的狀態(tài);當(dāng)你的項(xiàng)目只有一種狀態(tài)需要緩存,可以考慮使用這種方法

二 使用include、exclude屬性和beforeRouteEnter鉤子函數(shù)

首先介紹一下include和exclude vue文檔(https://cn.vuejs.org/v2/api/#...
是在vue2.0以后新增的屬性
include是需要緩存的組件;
exclude是除了某些組件都緩存;
include 和 exclude 屬性允許組件有條件地緩存。二者都可以用逗號(hào)分隔字符串、正則表達(dá)式或一個(gè)數(shù)組來(lái)表示:

    

  




  




  

匹配首先檢查組件自身的 name 選項(xiàng),如果 name 選項(xiàng)不可用,則匹配它的局部注冊(cè)名稱 (父組件 components 選項(xiàng)的鍵值)。匿名組件不能被匹配。

max只在2.5.0新增,最多可以緩存多少組件實(shí)例。一旦這個(gè)數(shù)字達(dá)到了,在新實(shí)例被創(chuàng)建之前,已緩存組件中最久沒(méi)有被訪問(wèn)的實(shí)例會(huì)被銷毀掉。


  
activated 與 deactivated。

簡(jiǎn)單介紹一下在被keep-alive包含的組件/路由中,會(huì)多出兩個(gè)生命周期的鉤子:activated 與 deactivated。
文檔:在 2.2.0 及其更高版本中,activated 和 deactivated 將會(huì)在 樹內(nèi)的所有嵌套組件中觸發(fā)。
activated在組件第一次渲染時(shí)會(huì)被調(diào)用,之后在每次緩存組件被激活時(shí)調(diào)用。
activated調(diào)用時(shí)機(jī):
第一次進(jìn)入緩存路由/組件,在mounted后面,beforeRouteEnter守衛(wèi)傳給 next 的回調(diào)函數(shù)之前調(diào)用:

beforeMount=> 如果你是從別的路由/組件進(jìn)來(lái)(組件銷毀destroyed/或離開緩存deactivated)=>mounted=> activated 進(jìn)入緩存組件 => 執(zhí)行 beforeRouteEnter回調(diào)

因?yàn)榻M件被緩存了,再次進(jìn)入緩存路由/組件時(shí),不會(huì)觸發(fā)這些鉤子:// beforeCreate created beforeMount mounted 都不會(huì)觸發(fā)。

deactivated:組件被停用(離開路由)時(shí)調(diào)用
使用了keep-alive就不會(huì)調(diào)用beforeDestroy(組件銷毀前鉤子)和destroyed(組件銷毀),因?yàn)榻M件沒(méi)被銷毀,被緩存起來(lái)了。
這個(gè)鉤子可以看作beforeDestroy的替代,如果你緩存了組件,要在組件銷毀的的時(shí)候做一些事情,你可以放在這個(gè)鉤子里。
如果你離開了路由,會(huì)依次觸發(fā):

組件內(nèi)的離開當(dāng)前路由鉤子beforeRouteLeave => 路由前置守衛(wèi) beforeEach =>全局后置鉤子afterEach => deactivated 離開緩存組件 => activated 進(jìn)入緩存組件(如果你進(jìn)入的也是緩存路由

項(xiàng)目中緩存使用方法:
1、在創(chuàng)建的router對(duì)象上加scrollBehavior方法,同上;
2、將需要緩存的組件加在include屬性里


      

3、在beforeRouteEnter的next回掉函數(shù)里,對(duì)返回A頁(yè)面不需要緩存的的情況初始化,即將本來(lái)需要寫在created里的東西寫在這里;注意一定要將所有的需要初始化的數(shù)據(jù)要寫一遍,不然會(huì)有bug;所以不太推薦

beforeRouteEnter (to, from, next) {
    next(vm => {
      // 通過(guò) `vm` 訪問(wèn)組件實(shí)例
      if (from.path !== "/goods_detail") { // 一定是從A進(jìn)到B頁(yè)面才刷新
        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()// 是本來(lái)寫在created里面的各種
      }
    })
  }
三、使用include、exclude屬性和beforeRouteLeave鉤子函數(shù)和vuex (推薦使用)

第三種方法和第二種相似,不同的地方在于,將需要緩存的組件保存到全局變量,可以在路由的鉤子函數(shù)里靈活的控制哪些組件需要緩存,那些不需要緩存;跟第二種方法相比,不需要每次再重新初始化數(shù)據(jù),但是需要在vuex中保存數(shù)據(jù);
上代碼
1、在創(chuàng)建的router對(duì)象上加scrollBehavior方法,同上;
2、將需要緩存的組件加在include屬性里


      

3、在store里加入需要緩存的的組件的變量名,和相應(yīng)的方法;

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

3、在beforeRouteLeave鉤子函數(shù)里控制需要緩存的組件

beforeRouteLeave (to, from, next) { //要在離開該組件的時(shí)候控制需要緩存的組件,否則將出現(xiàn)第一次不緩存的情況
    this.busy = true
    if (to.path === "/goods_detail") { // 去往詳情頁(yè)的時(shí)候需要緩存組件,其他情況下不需要緩存
      this.$store.commit("GET_CATCHE_COMPONENTS", ["home"])
    } else {
      this.$store.commit("GET_CATCHE_COMPONENTS", [])
    }
    next()
  },

以上是在vue項(xiàng)目里使用keep-alive的情況,網(wǎng)上有一些配合this.$destroy()方法使用的,但我在使用過(guò)程中驗(yàn)證了,并不好用;如果有多個(gè)狀態(tài),并且有選擇的緩存,那么第三個(gè)方法是最好的選擇;如果你不想用vuex使用第二種方法也可以,但需要注意初始化數(shù)據(jù)。

另外,在我們的項(xiàng)目中遇到路由相同但參數(shù)不同的情況組件被復(fù)用,不更新的問(wèn)題,vue官方給出了 響應(yīng)路由參數(shù)變化

watch: {
    "$route" (to, from) {
      document.title = this.$route.query.name
      this.getDefault() //根據(jù)參數(shù)數(shù)據(jù)響應(yīng)
    }

  },

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/105122.html

相關(guān)文章

  • JS每日一題:vuekeepalive怎么理解?

    摘要:?jiǎn)栔性趺蠢斫庹f(shuō)在前面是源碼中實(shí)現(xiàn)的一個(gè)組件感興趣的可以研究源碼什么是我們平時(shí)開發(fā)中總有部分組件沒(méi)有必要多次我們需要將組件進(jìn)行持久化,使組件狀態(tài)維持不變,在下一次展示時(shí),也不會(huì)進(jìn)行重新音譯過(guò)來(lái)就是保持活著所以在中我們可以使用來(lái)進(jìn)行組件緩存基 20190212問(wèn) vue中keepalive怎么理解? 說(shuō)在前面: keep-alive是vue源碼中實(shí)現(xiàn)的一個(gè)組件, 感興趣的可以研究源碼 ht...

    fsmStudy 評(píng)論0 收藏0
  • Vue keepAlive 數(shù)據(jù)緩存工具,實(shí)現(xiàn)返回上一個(gè)頁(yè)面瀏覽位置;

    摘要:需求分析背景數(shù)據(jù)列表頁(yè),滾動(dòng)加載數(shù)據(jù)多條數(shù)據(jù)情況下,點(diǎn)擊某一條,進(jìn)入詳細(xì)頁(yè)進(jìn)行編輯修改,刪除操作保存返回上一頁(yè)在上面的情況下,想要保持在上次瀏覽位置,并且保持?jǐn)?shù)據(jù)是最新的解決辦法原始的辦法在點(diǎn)擊詳情頁(yè)的時(shí)候,記住瀏覽位置,傳遞參數(shù)或者存到本 需求分析 背景:1.數(shù)據(jù)列表頁(yè),滾動(dòng)加載數(shù)據(jù);2.多條數(shù)據(jù)情況下,點(diǎn)擊某一條,進(jìn)入詳細(xì)頁(yè)進(jìn)行編輯(修改,刪除)操作;3.保存返回上一頁(yè); 在上面的...

    everfly 評(píng)論0 收藏0
  • Cesium3D在多個(gè)單頁(yè)面應(yīng)用,內(nèi)存只增不減致內(nèi)存溢出問(wèn)題解決

    摘要:解決思路既然每訪問(wèn)一次就會(huì)一個(gè),那能不能就創(chuàng)造一個(gè)全局的,讓他一直存在,通過(guò)顯示與隱藏去控制在每個(gè)單頁(yè)面應(yīng)用中的顯示呢。 1、背景: 項(xiàng)目使用的語(yǔ)言是vue+iview,因?yàn)橛玫搅?D,所以找公司買了3d地圖的產(chǎn)品,但是問(wèn)題隨之而來(lái)。把我們項(xiàng)目需要用到的3d地圖封裝成一個(gè)組件叫3dMap.vue,方便各個(gè)頁(yè)面調(diào)用,vue的工作機(jī)制是在離開當(dāng)前頁(yè)面的時(shí)候把當(dāng)前頁(yè)面進(jìn)行銷毀,但是由于C...

    zlyBear 評(píng)論0 收藏0
  • 徹底揭秘keep-alive原理

    摘要:我們留意到,這里不是簡(jiǎn)單地將置為,而是遍歷調(diào)用函數(shù)刪除。執(zhí)行組件的鉤子函數(shù)刪除緩存還要對(duì)應(yīng)執(zhí)行組件實(shí)例的鉤子函數(shù)。這個(gè)在不可忽視鉤子函數(shù)章節(jié)會(huì)再次出場(chǎng)。參考技術(shù)揭秘源碼一、前言 原文鏈接:github.com/qi... 本文介紹的內(nèi)容包括: keep-alive用法:動(dòng)態(tài)組件&vue-router keep-alive源碼解析 keep-alive組件及其包裹組件的鉤子 keep-a...

    lavnFan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<