前言
遇到這一個個問題 需要是這樣的 Vue里面的不刷新問題
頁面分為: A 主頁 B列表頁 C 詳情頁
A beforeRouteLeave 時設置 to.meta.keepAlive = false (A 進入 B頁面時), 不緩存 B列表頁
B beforeRouteLeave 時 (B -> C)列表頁進詳情頁時 from.meta.keepAlive =true 緩存B列表頁
C詳情頁 返回 B列表頁 ,此時B列表頁緩存不生效,也就是第一次不生效
總結問題原因:
當進入B列表頁后,keepAlive 為 true 時,緩存生效
當離開B列表頁時 設置 keepAlive 為 true 時 ,緩存不生效
這就是很頭疼的問題,查閱相關資料找到
解決
在app.vue 頁面
<transition :name="transitionName"> <keep-alive> <!-- v-if="isRouterALive" :include="[ keepData ]" --> <router-view class="child-view" v-if="$route.meta.keepAlive" ></router-view> </keep-alive> </transition> <transition :name="transitionName"> <router-view class="child-view" v-if="!$route.meta.keepAlive"></router-view> </transition>
路由頁面配置:

{ path: '/activities/create_proto', name: 'create_proto', meta: { index: 2, title: '活動創建', keepAlive: false, //此組件不需要被緩存 rank:1, }, component: () => import (/* webpackChunkName: "create_proto" */'@/pages/activities/create_proto') }, { path: '/activities/create/:id', name: 'create', meta: { index: 2, title: '活動創建', keepAlive: true, //此組件不需要被緩存 isBack:false, //用於判斷上一個頁面是哪個 rank:1.5, }, component: () => import (/* webpackChunkName: "create" */'@/pages/activities/create') }, { path: '/activities/createMask', name: 'createMask', meta: { index: 2, title: '組', keepAlive: false, //此組件不需要被緩存 isBack:false, //用於判斷上一個頁面是哪個 rank:1.5, }, component: () => import (/* webpackChunkName: "createMask" */'@/pages/activities/createMask') },
讓B頁面始終是緩存,
然后在B頁面 就是 create頁面 里:
beforeRouteEnter(to,from,next){ //來自editNotic的不緩存 if(from.name === 'createMask' && to.name === 'create'){ to.meta.isBack = true; } next(); }, activated() { // console.log(this.$route.meta) if(!this.$route.meta.isBack || this.isFirstEnter){ // 如果isBack是false,表明需要獲取新數據,否則就不再請求,直接使用緩存的數據 this.getApi(); } // 恢復成默認的false,避免isBack一直是true,導致下次無法獲取數據 this.$route.meta.isBack=false; //this.isBack = false; this.isFirstEnter = false; }, beforeCreate() { this.$loading.open(); }, mounted(){ this.isFirstEnter = true; this.getApi(); },
解釋一波
緩存的頁面 created 會執行只有一次,activated每次都會執行 ,
created 里面做 第一次 isFirstEnter = true(由於頁面被緩存,所以一直生效),之后再activated 里面做判斷
只有 “不是返回回來的” 和 “第一次進來的” 就刷新數據, 並且要在下面 都設為false, 以免緩存各標識不對,
在進入 “列表頁” 時,通過router鈎子函數 beforeRouteEnter做判斷,
詳情頁過來的設 isBack 為true,即不刷新頁面
但第一次都是不生效的,查閱了github 上的大佬方法,就是強制清除B緩存,當B頁面離開去到A頁面,用rank 來比較
在main.js 中 寫入:
Vue.mixin({ beforeRouteLeave: function (to, from, next) { console.log(to) if (from && from.meta.rank && to.meta.rank && from.meta.rank > to.meta.rank) { //如果返回上一層,則摧毀本層緩存。 if (this.$vnode && this.$vnode.data.keepAlive) { if (this.$vnode.parent && this.$vnode.parent.componentInstance && this.$vnode.parent.componentInstance.cache) { if (this.$vnode.componentOptions) { var key = this.$vnode.key == null ? this.$vnode.componentOptions.Ctor.cid + (this.$vnode.componentOptions.tag ? `::${this.$vnode.componentOptions.tag}` : '') : this.$vnode.key; var cache = this.$vnode.parent.componentInstance.cache; var keys = this.$vnode.parent.componentInstance.keys; if (cache[key]) { if (keys.length) { var index = keys.indexOf(key); if (index > -1) { keys.splice(index, 1); } } delete cache[key]; } } } } this.$destroy(); } next(); }, })
就是強制清除緩存,哇,這個問題搞了半天,
然后就解決了前進刷新,后退不刷的問題,
當然還可以結合vuex 來做到效果,但數據比較大的話還是適合 我寫的這種吧,哈哈哈