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才會生效,這里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è)巨坑.
那就是多級嵌套<router-view></router-view>,但凡有超過兩個(gè)以上的router-view且是父子級關(guān)系,請都加上keep-alive,只加一個(gè)不會生效.
// 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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決vue 使用axios.all()方法發(fā)起多個(gè)請求控制臺報(bào)錯(cuò)的問題
這篇文章主要介紹了解決vue 使用axios.all()方法發(fā)起多個(gè)請求控制臺報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11VUE的history模式下除了index外其他路由404報(bào)錯(cuò)解決辦法
在本篇文章里小編給大家分享的是關(guān)于VUE的history模式下除了index外其他路由404報(bào)錯(cuò)解決辦法,對此有需要的朋友們可以學(xué)習(xí)下。2019-08-08vue 使用自定義指令實(shí)現(xiàn)表單校驗(yàn)的方法
今天小編就為大家分享一篇vue 使用自定義指令實(shí)現(xiàn)表單校驗(yàn)的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08Vue+Element實(shí)現(xiàn)封裝抽屜彈框
這篇文章主要為大家詳細(xì)介紹了如何利用Vue和Element實(shí)現(xiàn)簡單的抽屜彈框效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06vue3+vite使用vite-plugin-svg-icons插件顯示本地svg圖標(biāo)的方法
這篇文章主要介紹了vue3+vite使用vite-plugin-svg-icons插件顯示本地svg圖標(biāo)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-12-12