再談vue前進重新整理,後退不重新整理,include實現方法。

夢遲發表於2019-02-16

關於填坑vue的前進重新整理與後退不重新整理,網上有很多方法,基本都是利用 keep-alive,但是試了好多種方法都不盡人意,後來有人提示說基於keepalive include,試驗了一下找到了些思路,暫時實驗可行,分享下共同探討學習,也許不是最佳解決方案,但確實有效。這裡需要用到vuex,如不用vuex可以自行用Local Storage代替。

1.修改主路由頁面,keep-alive 標籤新增 include

<keep-alive :include="includeds">
    <router-view></router-view>
</keep-alive>

2.同時此頁面新增自動computed includeds

computed:{
    includeds(){
        return this.$store.state.includeds
    }
 }

3.修改vuex的store,新增includeds物件,並新增commit方法。此處如不用vuex,也可自行設定Local Storage。

state: {
    includes: ``
},
mutations: {
    setIncludeds(state,setdata){
        state.includeds = setdata
    }
}

4.在main.js頁面新增beforeEach路由守衛。並設定後退頁面陣列。如不用全域性守衛,也可在頁面單獨設定單獨寫beforeRouteLeave,方法相同。

router.beforeEach((to, from, next) => {
    let addPage = [`addProduct`,`newEdit`,`showNews`];
    if (!mCd.inArray(to.name,addPage)) { //此處mCd.inArray的方法為判斷陣列是否包含,需要自己實現。
        store.commit(`setIncludeds`,``);
    }
    next();
})

5.設定頁面(news.vue)的name和activated

export default{
    name: `news`,
    data() {
        return {
            ....
        }
    },
    activated(){
        this.$store.commit(`setIncludeds`,`news`); //此處設定name一致的名稱
    }
}

*注意:此處activated裡設定的commit裡第二個引數,必須與name名稱一致。

6.然後就可以了。

原理解析:

1. 通過設定keepalive 的 include,當然也可以設定exclude,自行百度。include為要快取的頁面name
2. 在頁面activated的時候設定為快取當前頁面。
3. 頁面跳轉的時候判斷路由的to.name是否包含在已設定的陣列中。
4. 跳轉到edit或show頁面,返回後回到快取頁面,不重新整理。由其他頁面進入則重新整理。
5. 如果不設定路由全域性守衛,也可以每個頁面單獨寫beforeRouteLeave

也不知道這樣寫對不對。反正目前可以實現想要的效果。另外路由巢狀不是很深。如果哪位大俠有更好的方法,歡迎提供。^_^

相關文章