美文网首页
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缓存优化实践总结

    keep-alive缓存优化实践总结 keep-alive 具体应用场景 搜索列表页==>详情页==>返回列表页,...

  • Vue2的一些原理

    keep-alive keep-alive - 多看源码,方知原理,才能优化 作用:缓存 怎么缓存:用队列缓存到内...

  • vue2.0中keep-alive实践

    vue2.0中keep-alive实践 vue2.0提供了一个keep-alive组件,用来缓存组件,避免多次加载...

  • 前端优化

    一)内容层面 1、DNS解析优化(DNS缓存、减少DNS查找、keep-alive、适当的主机域名) 2、避免重...

  • 前端性能优化

    一)内容层面1、DNS解析优化(DNS缓存、减少DNS查找、keep-alive、适当的主机域名)2、避免重定向(...

  • 随笔

    缓存 : 包裹动态组件时,会缓存不活动的组件实例,而不是销...

  • 第十八天

    1.你了解哪些Vue性能优化方法? 路由懒加载(通过import方法来实现)keep-alive缓存页面使用v-s...

  • vue3使用 keep-alive对iframe进行缓存

    使用keep-alive缓存不了iframe界面原因 (1)vue中的keep-alive 【1】原理:Vue 的...

  • vue-api-内置组件

    component 动态组件 keep-alive 缓存组件 slot 插槽

  • 常见性能优化实践总结

    常见性能优化实践总结 一:代码 这一点最容易引起技术人员的忽视。很多技术人员拿到一个性能优化的需求以后,言必称缓存...

网友评论

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

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