Vue动态缓存KeepAlive

vue中keep-alive组件主要有三个常用的props。

  • 1,include存放的name是组件自身的name属性,只有名称匹配的组件会被缓存
  • 2,exclude,任何名称匹配的组件都不会被缓存
  • 3,max,最多可以缓存多少组件实例,一旦达到这个数字,那么缓存组件中最近没有被缓存的实例会被销毁

这里使用 include 属性实现动态缓存,include 有3种传值方式:

  1. '组件A的name,组件B的name'
  2. '正则表达式1,正则表达式2'
  3. '[组件A的name,组件B的name]'

实际开发过程中一般配合vue-router食用:

<keep-alive :include="aliveRoutes">

<router-view></router-view>

</keep-alive>

思路:通过将 aliveRoutes 加入Vuex进行状态管理,然后通过actions来动态改变aliveRoutes。具体实现如下:

javascript 复制代码
// store/async-router.js
state: {
 ...
 aliveRoutes: []    
},
mutations: {
    UPDATE_ALIVE_ROUER: (state, data) => {
      state.aliveRoutes = data
    },
},
actions: {
    ...
    addAliveRouter({ commit, state }, routerName) {
      if (!routerName) return
      const originData = state.aliveRoutes || []
      originData.push(routerName)
      const arr = Array.from(new Set(originData))
      commit('UPDATE_ALIVE_ROUER', arr)
    },
    delAliveRouter({ commit, state }, routerName) {
      const originData = state.aliveRoutes || []
      const index = originData.indexOf(routerName)
      if (!routerName || index === -1) return
      originData.splice(index, 1)
      commit('UPDATE_ALIVE_ROUER', originData)
    },
}
javascript 复制代码
// xxx.vue

...

export default {
name: 'componentA', // 注意name需要与 aliveRoutes 中保持一致
 beforeRouteLeave(to, from, next) {
    next()
    // 判断如果返回首页则移除keepalive 否则保持缓存
    if (to.path === 'index') {
    // 移除 aliveRoutes 中的 componentA 
      this.$store.dispatch('delAliveRouter', 'componentA')
    }
  },
created() {
// 初始化时增加 componentA 到 aliveRoutes 
    this.$store.dispatch('addAliveRouter', 'componentA')
},
...
}

在初始化路由时可以将路由中需要缓存的组件的name添加到 aliveRoutes 中

javascript 复制代码
import store from '@/store'

// 加载默认需要keep alive的路由
allRoutes.forEach(route => {
  const { meta, name } = route
  if (meta && meta.keepAlive) store.dispatch('addAliveRouter', name)
})

...
相关推荐
郭少几秒前
🔥 放弃 vw!我在官网大屏适配中踩了天坑,用 postcss-px-to-viewport-8-plugin 实现了 Rem 终极方案
vue.js·性能优化·nuxt.js
heartmoonq2 分钟前
关于前端监控用户行为导致的报错
前端
已读不回1432 分钟前
告别痛苦的主题切换!用一个插件解决 Tailwind CSS 多主题开发的所有烦恼
前端·架构
咸虾米2 分钟前
微信小程序通过uni.chooseLocation打开地图选择位置,相关设置及可能出现的问题
vue.js·微信小程序
pepedd8642 分钟前
🚀Webpack 从入门到优化,一文全掌握!
前端·webpack·trae
TimelessHaze3 分钟前
【面试考点】从URL输入到页面展示
前端·trae
玲小珑5 分钟前
LangChain.js 完全开发手册(一)AI 应用开发入门
前端·langchain·ai编程
excel6 分钟前
前端必修:从表单基础到富文本编辑,一文吃透 HTML 表单编程与交互
前端
袁煦丞8 分钟前
JuiceSSH你的口袋里的Linux操控台:cpolar内网穿透实验室第530个成功挑战
前端·程序员·远程工作
鹏多多12 分钟前
深入解析vue的transition过渡动画使用和优化
前端·javascript·vue.js