Vue keep-alive實踐總結

走啊丶去拯救世界發表於2018-08-08

<keep-alive> 是Vue的內建元件,能在元件切換過程中將狀態保留在記憶體中,防止重複渲染DOM。

<keep-alive> 包裹動態元件時,會快取不活動的元件例項,而不是銷燬它們。和 <transition> 相似,<keep-alive> 是一個抽象元件:它自身不會渲染一個 DOM 元素,也不會出現在父元件鏈中。

prop:

- include: 字串或正規表示式。只有匹配的元件會被快取。
- exclude: 字串或正規表示式。任何匹配的元件都不會被快取。
複製程式碼
1.常見用法:
// 元件
export default {
  name: 'test-keep-alive',
  data () {
    return {
        includedComponents: "test-keep-alive"
    }
  }
}
複製程式碼
<keep-alive include="test-keep-alive">
  <!-- 將快取name為test-keep-alive的元件 -->
  <component></component>
</keep-alive>

<keep-alive include="a,b">
  <!-- 將快取name為a或者b的元件,結合動態元件使用 -->
  <component :is="view"></component>
</keep-alive>

<!-- 使用正規表示式,需使用v-bind -->
<keep-alive :include="/a|b/">
  <component :is="view"></component>
</keep-alive>

<!-- 動態判斷 -->
<keep-alive :include="includedComponents">
  <router-view></router-view>
</keep-alive>

<keep-alive exclude="test-keep-alive">
  <!-- 將不快取name為test-keep-alive的元件 -->
  <component></component>
</keep-alive>
複製程式碼
2.結合router,快取部分頁面

使用$route.meta的keepAlive屬性:

<keep-alive>
    <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>
複製程式碼

需要在router中設定router的元資訊meta:

//...router.js
export default new Router({
  routes: [
    {
      path: '/',
      name: 'Hello',
      component: Hello,
      meta: {
        keepAlive: false // 不需要快取
      }
    },
    {
      path: '/page1',
      name: 'Page1',
      component: Page1,
      meta: {
        keepAlive: true // 需要被快取
      }
    }
  ]
})
複製程式碼
ps: 當然,也可以通過動態設定route.meta的keepAlive屬性來實現其他需求
  • 首頁是A頁面
  • B頁面跳轉到A,A頁面需要快取
  • C頁面跳轉到A,A頁面不需要被快取

思路是在每個路由的beforeRouteLeave(to, from, next)鉤子中設定to.meta.keepAlive A的路由:

{
    path: '/',
    name: 'A',
    component: A,
    meta: {
        keepAlive: true // 需要被快取
    }
}
複製程式碼
export default {
    data() {
        return {};
    },
    methods: {},
    beforeRouteLeave(to, from, next) {
         // 設定下一個路由的 meta
        to.meta.keepAlive = true;  // B 跳轉到 A 時,讓 A 快取,即不重新整理
        next();
    }
};
複製程式碼
export default {
    data() {
        return {};
    },
    methods: {},
    beforeRouteLeave(to, from, next) {
        // 設定下一個路由的 meta
        to.meta.keepAlive = false; // C 跳轉到 A 時讓 A 不快取,即重新整理
        next();
    }
};
複製程式碼

keep-alive生命週期鉤子函式:activated、deactivated

使用<keep-alive>會將資料保留在記憶體中,如果要在每次進入頁面的時候獲取最新的資料,需要在activated階段獲取資料,承擔原來created鉤子中獲取資料的任務。

結語

以上是文章來自於部落格園[ HanYif](https://www.cnblogs.com/sysuhanyf/p/7454530.html) 摘錄,以方便自己查閱使用,如有侵權事宜,請私信於我。

相關文章