vue刷新及解決增加緩存后刷新無效


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();    },

參考 https://blog.csdn.net/weixin_41164499/article/details/90718155


免責聲明!

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



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