美文网首页
keep-alive缓存优化实践总结

keep-alive缓存优化实践总结

作者: halowyn | 来源:发表于2019-03-12 15:39 被阅读0次

    keep-alive缓存优化实践总结

    keep-alive

    <keep-alive>是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM。
    <keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。
    

    具体应用场景

    搜索列表页==>详情页==>返回列表页,保存上次已经加载出来的数据和自动还原上次的浏览位置

    keep-alive钩子函数

     先简单说一下和缓存相关的vue钩子函数。
     对于设置了keepAlive缓存的组件:
      第一次进入:beforeRouterEnter->created->activated->deactivated
      后续进入时:beforeRouterEnter ->activated->deactivated
    可以看出,只有第一次进入该组件时,才会走created钩子,而需要缓存的组件中activated是每次都会走的钩子函数。所以,为了避免重复请求,我们要在activated这个钩子里面去判断,当前组件是需要使用缓存的数据还是重新刷新获取数据。

    prop:

    include: 字符串或正则表达式。只有匹配的组件会被缓存。
    exclude: 字符串或正则表达式。任何匹配的组件都不会被缓存。

    常见用法:

    // 组件
    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实现步骤

    • 保存上次已经加载出来的数据

    需要在<button>router</button>中设置router的元信息meta,(scrollTop属性的设置为了保存浏览位置,后面再说):

        export const constantRouterMap = 
        [{
            path: 'index',
            name: 'list',
            hidden: true,
            meta: { title: '客户管理', keepAlive: true, scrollTop: 0 },
            component: () => import('@/views/List')
          },
          {
            path: 'clientInfo',
            name: 'clientInfo',
            hidden: true,
            component: () => import('@/views/clientInfo/index'),
            meta: { title: '客户信息', icon: 'icon-yejiguanli', keepAlive: true }
        }]
        export default new Router({
          mode: 'history',
          routes: constantRouterMap,
          scrollBehavior: () => ({ y: 0 })
        })
    

    在页面中的路由容器里设置keep-alive标签

    <template>
      <keep-alive v-if="$route.meta.keepAlive">
        <router-view/>
      </keep-alive>
      <router-view v-else-if="!$route.meta.keepAlive"/>
    </template>
    <script>
    export default {
      name: 'List'
    }
    </script>
    
    • 保留页面滚动位置
      首次进入页面时,scrollTop = 0,如上面所说,在设置keep-alive的页面,一定会走activated方法,当页面中存在滚动条,路由跳转的两个场景:
      • 离开列表页进入详情页(修改本页面的路由元信息scrollTop为当前滚动位置)
      • 离开列表页进入其他平级页面(修改本页面的路由元信息scrollTop为0)
    const myMixin = {
      activated() {
        document.querySelector('#app').scrollTop = this.$route.meta.scrollTop
      },
      beforeRouteLeave(to, from, next) {
        if (to.name.includes('clientInfo')) {
          const scrollTop = document.querySelector('#app').scrollTop
          from.meta.scrollTop = scrollTop
        } else {
          from.meta.scrollTop = 0
        }
        next()
      }
    }
    

    页面中列表较多的情况下,我们把activated方法和beforeRouteLeave方法抽离出来复用,页面中引用进来即可:

    import myMixin from '@/utils/mixin.js'
    export default {
      name: 'List',
      mixins: [myMixin]
    }
    

    暂且总结这么多,希望对大家有帮助!

    相关文章

      网友评论

          本文标题:keep-alive缓存优化实践总结

          本文链接:https://www.haomeiwen.com/subject/znlnpqtx.html