this.$router.go(0)
this.$router.go(0)
這種方法頁面會一瞬間的白屏,體驗不是很好,雖然只是一行代碼的事
location.reload()
location.reload()
這種也是一樣,畫面一閃,效果總不是很好
provide、inject
3、搭配provide、inject
使用
首先在主頁面 app.vue
Home.vue
<keep-alive>
<!-- //當前進入的路由 meta里面 keepAlive為true時走這里-->
<router-view v-if="$route.meta.keepAlive" class="home-router"></router-view>
</keep-alive>
<!-- 當前進入的路由 meta里面 keepAlive為false時走這里 下面 if 判斷進行了取反處理-->
<router-view v-if="!$route.meta.keepAlive"></router-view>
App.vue
<template>
<div id="app">
<!-- <router-view v-if="isRouterAlive"></router-view> -->
<home v-if="isRouterAlive"></home>
</div>
</template>
<script>
import Home from './views/Home.vue';
export default {
name: "app",
components: {
Home
},
provide() {
//父組件中通過provide來提供變量,在子組件中通過inject來注入變量。
return {
reload: this.reload
};
},
data() {
return {
isRouterAlive: true //控制視圖是否顯示的變量
};
},
methods: {
reload() {
this.isRouterAlive = false; //先關閉,
this.$nextTick(function () {
this.isRouterAlive = true; //再打開
});
}
}
};
</script>
在需要刷新的頁面導入 inject: ['reload'],
調用刷新:
export default {
inject: ["reload"],
}
`this.reload() `// 刷新頁面
回退頁面 keeplive 緩存問題
在router/index.js中添加路由元信息,設置需要緩存的頁面
meta: {
title:'trade.tradeTitle',
keepAlive: true, // 此組件需要被緩存
isBack:false, //用於判斷上一個頁面是哪個
}
鈎子函數的執行順序
不使用keep-alive
beforeRouteEnter --> created --> mounted --> destroyed
使用keep-alive
beforeRouteEnter --> created --> mounted --> activated --> deactivated
再次進入緩存的頁面,只會觸發beforeRouteEnter -->activated --> deactivated 。created和mounted不會再執行。我們可以利用不同的鈎子函數,做不同的事。務必理解上述鈎子函數的執行時機和執行順序,本教程的核心就依賴於此鈎子函數
activated和deactivated是使用keep-alive后
beforeRouteEnter
在緩存的頁面通過beforeRouteEnter鈎子函數中判斷是從哪個頁面過來的
beforeRouteLeave(to, from, next) {
// 路由導航鈎子,此時還不能獲取組件實例 `this`,所以無法在data中定義變量(利用vm除外)
// 所以,利用路由元信息中的meta字段設置變量,方便在各個位置獲取。這就是為什么在meta中定義isBack
if (from.path === '/SnNavigationUp') {
//判斷是從哪個路由過來的,
//刷新數據
to.meta.isBack = false;
} else {
//不刷新
to.meta.isBack = true;
}
next();
},
data
data中定義變量isFirstEnter用來判斷是否第一次進入,或是否刷新了頁面,默認false
data() {
return {
isFirstEnter:false,
};
},
created
created中把isFirstEnter變為true,說明是第一次進入或刷新了頁面
this.isFirstEnter = true; // 只有第一次進入或者刷新頁面后才會執行此鈎子函數 // 使用keep-alive后(2+次)進入不會再執行此鈎子函數 this.$nextTick(() => { this.getall(); });
activated
activated中增加判斷條件
activated() { if (this.$route.meta.isBack || !this.isFirstEnter) { // 如果isBack是false,表明需要獲取新數據,否則就不再請求,直接使用緩存的數據 // 如果isFirstEnter是true,表明是第一次進入此頁面或用戶刷新了頁面,需獲取新數據 this.$nextTick(() => { this.getall(); }); } else { this.$route.meta.isBack = false this.isFirstEnter = false; } },
直接寫上也可以解決以上問題
activated() { this.getall(); },