摘要:文檔在及其更高版本中,和將會在樹內的所有嵌套組件中觸發。另外,在我們的項目中遇到路由相同但參數不同的情況組件被復用,不更新的問題,官方給出了響應路由參數變化根據參數數據響應
前言
在開發中經常有從列表跳到詳情頁,然后返回詳情頁的時候需要緩存列表頁的狀態(比如滾動位置信息),這個時候就需要保存狀態,要緩存狀態;vue里提供了keep-alive組件用來緩存狀態。
可以用以下幾種方案解決問題;
直接上代碼,
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組件
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 vue文檔(https://cn.vuejs.org/v2/api/#...
是在vue2.0以后新增的屬性
include是需要緩存的組件;
exclude是除了某些組件都緩存;
include 和 exclude 屬性允許組件有條件地緩存。二者都可以用逗號分隔字符串、正則表達式或一個數組來表示:
匹配首先檢查組件自身的 name 選項,如果 name 選項不可用,則匹配它的局部注冊名稱 (父組件 components 選項的鍵值)。匿名組件不能被匹配。
max只在2.5.0新增,最多可以緩存多少組件實例。一旦這個數字達到了,在新實例被創建之前,已緩存組件中最久沒有被訪問的實例會被銷毀掉。
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屬性里
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屬性里
3、在store里加入需要緩存的的組件的變量名,和相應的方法;
export default new Vuex.Store({ state: { catch_components: [] }, mutations:{ GET_CATCHE_COMPONENTS (state, data) { state.catch_components = data } } })
3、在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項目里使用keep-alive的情況,網上有一些配合this.$destroy()方法使用的,但我在使用過程中驗證了,并不好用;如果有多個狀態,并且有選擇的緩存,那么第三個方法是最好的選擇;如果你不想用vuex使用第二種方法也可以,但需要注意初始化數據。
另外,在我們的項目中遇到路由相同但參數不同的情況組件被復用,不更新的問題,vue官方給出了 響應路由參數變化
watch: { "$route" (to, from) { document.title = this.$route.query.name this.getDefault() //根據參數數據響應 } },
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105122.html
摘要:問中怎么理解說在前面是源碼中實現的一個組件感興趣的可以研究源碼什么是我們平時開發中總有部分組件沒有必要多次我們需要將組件進行持久化,使組件狀態維持不變,在下一次展示時,也不會進行重新音譯過來就是保持活著所以在中我們可以使用來進行組件緩存基 20190212問 vue中keepalive怎么理解? 說在前面: keep-alive是vue源碼中實現的一個組件, 感興趣的可以研究源碼 ht...
摘要:需求分析背景數據列表頁,滾動加載數據多條數據情況下,點擊某一條,進入詳細頁進行編輯修改,刪除操作保存返回上一頁在上面的情況下,想要保持在上次瀏覽位置,并且保持數據是最新的解決辦法原始的辦法在點擊詳情頁的時候,記住瀏覽位置,傳遞參數或者存到本 需求分析 背景:1.數據列表頁,滾動加載數據;2.多條數據情況下,點擊某一條,進入詳細頁進行編輯(修改,刪除)操作;3.保存返回上一頁; 在上面的...
摘要:解決思路既然每訪問一次就會一個,那能不能就創造一個全局的,讓他一直存在,通過顯示與隱藏去控制在每個單頁面應用中的顯示呢。 1、背景: 項目使用的語言是vue+iview,因為用到了3D,所以找公司買了3d地圖的產品,但是問題隨之而來。把我們項目需要用到的3d地圖封裝成一個組件叫3dMap.vue,方便各個頁面調用,vue的工作機制是在離開當前頁面的時候把當前頁面進行銷毀,但是由于C...
摘要:我們留意到,這里不是簡單地將置為,而是遍歷調用函數刪除。執行組件的鉤子函數刪除緩存還要對應執行組件實例的鉤子函數。這個在不可忽視鉤子函數章節會再次出場。參考技術揭秘源碼一、前言 原文鏈接:github.com/qi... 本文介紹的內容包括: keep-alive用法:動態組件&vue-router keep-alive源碼解析 keep-alive組件及其包裹組件的鉤子 keep-a...
閱讀 1147·2021-11-25 09:43
閱讀 2965·2019-08-30 15:54
閱讀 3349·2019-08-30 15:54
閱讀 2991·2019-08-30 15:44
閱讀 1623·2019-08-26 12:18
閱讀 2254·2019-08-26 11:42
閱讀 875·2019-08-26 11:35
閱讀 3295·2019-08-23 18:22