keep-alive缓存优化实践总结

2019-03-12  本文已影响0人  halowyn

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>
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]
}

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

上一篇下一篇

猜你喜欢

热点阅读