需求場景:
跳轉邏輯
A跳轉B,B頁面 表單填寫過程中 跳轉 選擇地址等額選項時,我們需要將B頁面 進行 keepAlive 緩存,達到 返回時不重新渲染
但是我們需要考慮 從
A頁面到B頁面 需要全部重新加載,此類場景 我們需要 動態的去控制 keepAlive
流程圖 A頁面 > B頁面(表單頁面) < 互相跳轉 > C頁面(額外選項 選擇地址類似)
App.vue
<!-- vue3.0配置 -->
<router-view v-slot="{ Component }">
<keep-alive>
<component :is="Component" :key="route.name" v-if="route.meta.keepAlive" />
</keep-alive>
<component :is="Component" :key="route.name" v-if="!route.meta.keepAlive" />
</router-view>
復制代碼
import { useRoute } from 'vue-router';
export default defineComponent({
name: 'App',
setup(props) {
const route = useRoute();
return { route }
}
})
復制代碼
router.ts
// ...
{
path: 'path/BComponent',
name: 'BComponent',
component: BComponent,
meta: {
title: 'Page B',
keepAlive: true
}
},
{
path: 'path/CComponent',
name: 'CComponent',
component: CComponent,
meta: {
title: 'Page C',
keepAlive: false
}
},
復制代碼
B.vue
import { useRouter, useRoute, onBeforeRouteLeave } from 'vue-router';
export default defineComponent({
name: 'B',
setup(props) {
const route = useRoute();
const router = useRouter();
const changeRouterKeepAlive = (name: string, keepAlive: boolean) => {
router.options.routes.map((item: any) => {
if (item.name === name) {
item.meta.keepAlive = keepAlive;
}
});
};
onBeforeRouteLeave((to, from) => {
if (to.name !== 'c') {
// 不是去 c 頁面,不緩存
changeRouterKeepAlive(from.name as string, false);
} else {
changeRouterKeepAlive(from.name as string, true);
}
});
return { };
}
})
復制代碼
