美文网首页Web 前端开发
keep-alive介绍及应用场景

keep-alive介绍及应用场景

作者: lmmy123 | 来源:发表于2018-11-28 23:18 被阅读58次

HTTP keep-alive

项目中使用axios开启 Http Keep-Alive
// 插件
const Agent = require('agentkeepalive')
const keepaliveAgent = new Agent({
  maxSockets: 100,
  maxFreeSockets: 10,
  timeout: 60000,
  freeSocketKeepAliveTimeout: 30000
})

$axios.defaults.httpAgent = keepaliveAgent

Vue keep-alive

props:

  • include string或正则,只有名称匹配的组件会被缓存 2.1.0+
  • exclude string或正则, 名称匹配的组件不会被缓存 2.1.0+
  • max 最多可以缓存多少组件实例 2.5.0+
  • activated 和 deactivate 生命周期钩子
<keep-alive include="a,b" :include="['a','b']" :exclude="/a|b/" :max="10">
  <component :is='view'></component>
</keep-alive>

<keep-alive> 不会在函数式组件中正常工作,因为它们没有缓存实例。
结合router,缓存部分页面

<keep-alive>
  <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive></router-view

在router/设置route的元信息 meta

routers: [{
  path: '/',
  name: 'Home',
  meta: {
    keepAlive: false // 不需要缓存
  }
},{
  path: '/page',
  name: 'Page',
  meta: {
    keepAlive: true  // 需要缓存
  }
},]

使用keep-alive会将数据保留在内存中,如果每次进入页面的时候要获取最新的数据,需要 在 activated 生命周期中 重新获取数据,承担原来created 钩子中获取数据的任务
设置了keep-alive的组件
第一次进入: beforeRouteEnter => created => ... => activated => ... => deactivated
后续进入:beforeRouteEnter => activated => deactivated,
只有第一次进入该组件时,才会走created钩子,需要缓存的组件中activated时每次都会走的钩子函数

场景 Vue中前进刷新,后退缓存用户浏览数据

列表页面 =>点击进入详情页=> 后退到列表页 要缓存列表原来数据

重新进入列表页面 => 获取最新的数据

// router.js
{
  path: '/list',
  name: 'List',
  component: List,
  meta: {
    isUseCache: false, // 默认不缓存
    keepAlive: true  // 是否使用 keep-alive
  }
}
// 列表页面
activated() {
  if(!this.$route.meta.isUseCache){ //isUseCache 时添加中router中的元信息,判读是否要缓存
    this.list = [] //清空原有数据
    this.onload() // 重新加载
  }
}

// 列表页面跳转到 详情页时,设置需要缓存
beforeRouteLeave(to, from, next){
  if(to.name=='Detail'){
    from.meta.isUseCache = true
  }
  next()
}
// 列表页面的activated
activated() {
 if(!this.$route.meta.isUseCache){ //isUseCache 时添加中router中的元信息,判读是否要缓存
    this.list = [] //清空原有数据
    this.onload() // 重新加载
  }
 this.$route.meta.isUseCache = false // 通过这个控制刷新
}

文章参考:https://juejin.im/post/5b2ce07ce51d45588a7dbf76

相关文章

网友评论

    本文标题:keep-alive介绍及应用场景

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