vue中keep-alive,include的緩存問題
前提:有A,B,C,D四個(gè)頁面,A是按鈕頁(點(diǎn)擊按鈕進(jìn)入B頁面),B是訂單列表頁,C是訂單詳情頁,D是費(fèi)用詳情頁
需求:順序是A->B->C->D,每次都刷新頁面,D->C->B時(shí)走緩存,但是每次從A到B都要刷新B頁面,從B到C需要刷新C頁面,從C到D要刷新D頁面
在vue官方文檔2.1以上有include 和 exclude 屬性允許組件有條件地緩存。在這里主要用include結(jié)合vuex來實(shí)現(xiàn)(四個(gè)頁面組件都有自己的name才會(huì)生效,這里name就叫A,B,C,D)
從D->C,從C->B,從B->A 可以寫一個(gè)公共的頭部返回組件,統(tǒng)一使用 this.$router.go(-1)返回前一頁
App.vue
<template>
<div class="app">
<keep-alive :include="keepAlive" >
<router-view/>
</keep-alive>
</div>
</template>
<script type='text/javascript'>
export default {
data () {
return {}
},
computed: {
keepAlive () {
return this.$store.getters.keepAlive
}
}
}
</script>
store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
keepAlive: []
},
mutations: {
SET_KEEP_ALIVE: (state, keepAlive) => {
state.keepAlive = keepAlive
}
},
getters: {
keepAlive: state => state.keepAlive
}
})
每次進(jìn)入B頁面時(shí)先初始化 keepAlive(設(shè)置要走緩存的頁面)
A.vue
<script>
export default {
name: 'A',
methods: {
buttonClick () {
this.$store.commit('SET_KEEP_ALIVE', ['B', 'C', 'D'])
this.$router.push('/B')
}
}
}
</script>
B.vue 該頁面用來設(shè)置緩存和清除緩存
<script>
export default {
name: 'B',
beforeRouteEnter (to, from, next) {
next(vm => {
if (from.path.indexOf('C') > -1) {
vm.$store.commit('SET_KEEP_ALIVE', ['B'])
}
})
},
beforeRouteLeave (to, from, next) {
if (to.path.indexOf('C') > -1) {
this.$store.commit('SET_KEEP_ALIVE', ['B', 'C'])
} else if (to.path.indexOf('A') > -1) {
this.$store.commit('SET_KEEP_ALIVE', [])
}
next()
}
}
</script>
到這里就實(shí)現(xiàn)了需求
PS:vue keep-alive include無效
檢查版本
確定當(dāng)前的vue版本的是2.1+
因?yàn)閕nclude和exclude是vue2.1.0新增的兩個(gè)屬性.
package.json
"vue": "^2.5.2",
檢查name
注意,不是router.js中的name,而是單個(gè)vue組件中的name屬性.
建議將router.js中的name和vue組件的name保持一致,不要混亂.
export default {
name: "index"
}
多層嵌套
網(wǎng)上的答案幾乎都是檢查vue組件的name屬性,但還是有一個(gè)巨坑.
那就是多級(jí)嵌套<router-view></router-view>,但凡有超過兩個(gè)以上的router-view且是父子級(jí)關(guān)系,請(qǐng)都加上keep-alive,只加一個(gè)不會(huì)生效.
// app.vue <keep-alive include="app,index"> <router-view></router-view> </keep-alive> // other.vue <keep-alive include="app,index"> <router-view></router-view> </keep-alive>
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue 如何添加全局函數(shù)或全局變量以及單頁面的title設(shè)置總結(jié)
本篇文章主要介紹了vue 如何添加全局函數(shù)或全局變量以及單頁面的title設(shè)置總結(jié),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-06-06
vue-router實(shí)現(xiàn)嵌套路由的講解
今天小編就為大家分享一篇關(guān)于vue-router實(shí)現(xiàn)嵌套路由的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01
Vue文件如何轉(zhuǎn)換成base64并去除多余的文件類型前綴
這篇文章主要介紹了Vue文件如何轉(zhuǎn)換成base64并去除多余的文件類型前綴問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
vue3實(shí)現(xiàn)搜索項(xiàng)超過n行就折疊的思路詳解
我們?cè)谧隽斜聿樵兊臅r(shí)候,會(huì)有很多查詢項(xiàng),如何實(shí)現(xiàn)超過n行查詢項(xiàng)的時(shí)候自動(dòng)折疊起來呢?本文給大家分享vue3實(shí)現(xiàn)搜索項(xiàng)超過n行就折疊的思路詳解,感興趣的朋友一起看看吧2022-06-06
vue中動(dòng)態(tài)渲染數(shù)據(jù)時(shí)使用$refs無效的解決
這篇文章主要介紹了vue中動(dòng)態(tài)渲染數(shù)據(jù)時(shí)使用$refs無效的解決方案,具有很好的參考價(jià)值。希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
使用proxytable 配置解決 vue-cli 的跨域請(qǐng)求問題【推薦】
這篇文章主要介紹了利用 proxytable 配置解決 vue-cli 的跨域請(qǐng)求問題,本文的目錄結(jié)構(gòu)基于 webpack 模板結(jié)構(gòu),需要的朋友可以參考下2018-05-05

