<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) 摘錄,以方便自己查閱使用,如有侵權事宜,請私信於我。