vue keep-alive

weixin_34138377發表於2018-06-26

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

prop:

include: 字串或正規表示式。只有匹配的元件會被快取。
exclude: 字串或正規表示式。任何匹配的元件都不會被快取。

在2.1.0版本Vue中
常見用法:

// 元件
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>

結合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 // 需要被快取
      }
    }
  ]
})

使用效果

以上面router的程式碼為例:

<!-- Page1頁面 -->
<template>
  <div class="hello">
    <h1>Vue</h1>
    <h2>{{msg}}</h2>
    <input placeholder="輸入框"></input>
  </div>
</template>
<!-- Hello頁面 -->
<template>
  <div class="hello">
    <h1>{{msg}}</h1>
  </div>
</template>

(1) 在Page1頁面輸入框輸入“asd”,然後手動跳轉到Hello頁面;

(2) 回到Page1頁面發現之前輸入的"asd"依然保留,說明頁面資訊成功儲存在記憶體中;
圖3 返回Page1頁面,輸入框資料會被保留

當然,也可以通過動態設定route.meta的keepAlive屬性來實現其他需求,

借鑑一下 vue-router 之 keep-alive,作者:RoamIn這篇部落格中的例子:

  • 首頁是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鉤子中獲取資料的任務。
此文章轉載於:https://www.cnblogs.com/sysuhanyf/p/7454530.html

相關文章