vue3 動態修改 keepAlive


需求場景:

跳轉邏輯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 { };
  }
})
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM