關於填坑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