思路:緩存
include string或正則,只有名稱匹配的組件會被緩存 2.1.0+佈局
exclude string或正則, 名稱匹配的組件不會被緩存 2.1.0+this
例子:spa
<keep-alive include="a,b" :include="['a','b']" :exclude="/a|b/" :max="10"> <component :is='view'></component> </keep-alive>
下面開始講解應用在保留列表當前頁的案例中:code
結合router,緩存部分頁面component
1. 佈局router-view中router
<template> <div class="mainContainer-wrap"> <transition :name="name" mode="out-in" name="fade"> <keep-alive> <router-view v-if="this.$route.meta.keepAlive"></router-view> </keep-alive> </transition> <transition :name="name" mode="out-in" name="fade"> <router-view v-if="!this.$route.meta.keepAlive"></router-view> </transition> </div> </template> <script> export default { name: 'mainContainer', data () { return { name: this.$route.name } }, mounted () { // console.log(this.$route.meta.keepAlive) } } </script>
2.在router/設置route的元信息 metablog
1 { 2 path: '/dm', 3 component: Layout, 4 redirect: '/dm/basic', 5 name: '設備中心', 6 meta: { 7 title: '設備中心', 8 icon: '' 9 }, 10 children: [{ 11 path: 'basic', 12 name: 'Basic', 13 component: Basic, 14 meta: { 15 title: '設備管理', 16 keepAlive: true // 須要緩存 17 } 18 }, { 19 path: 'basic/decDetail', 20 name: 'DeviceDetail', 21 component: DeviceDetail, 22 meta: { 23 title: '設備詳情', 24 level: 2, 25 hidden: true, 26 keepAlive: false // 不須要緩存 27 } 28 }] 29 },
created () { this.getList() }, activated() { //只刷新數據,不改變總體的緩存 this.getList() }, mounted () { this.getProductName() }, //修改列表頁的meta值,false時再次進入頁面會從新請求數據。 beforeRouteLeave(to, from, next) { from.meta.keepAlive = false next() },
4. 詳情頁路由的鉤子函數設置生命週期
// 從詳情頁返回主頁時把主頁的keepAlive值設置爲true(要作個判斷,判斷是否是返回到主頁的) beforeRouteLeave (to, from, next) { if (to.name === 'Basic') { to.meta.keepAlive = true } else { to.meta.keepAlive = false } next() },
效果以下: