添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

关于vue路由缓存问题

之前在工作中遇到了个关于页面跳转相关的缓存问题,没想到解决起来意外的挺简单的。

需求是这样的,有个移动webApp,下面有4个tab可以切换,然后其中有个页面有个列表,在列表页点击某些功能可以跳转至页面B、页面C,页面C返回的时候列表不能刷新,滚动条需要在原来的位置,然而在C页面做了一些操作的时候是会影响列表项的值的,做了这些操作的话,返回列表页需要刷新数据。

我的解决方案当然是用 keep-alive 了,然后把他的 includes 绑定到状态中去,这样可以方便的进行增加、删除。然后在列表页面中添加路由守卫,当判断要跳转到B、C页面的时候,把当前页面添加到缓存中,如果在二级页面需要删除缓存,则在状态管理里把缓存删掉,这样回到列表页之后就会刷新了。

需要注意的是includes中使用的是组件的名称进行缓存的,所以组件的命名要规范,有语义,最好不要重复。

在状态管理中添加缓存的状态和一些动作

新建cache.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import Vue from 'vue'
const cache = {
state: {
cacheComps: [] // 缓存组件
},
mutations: {
addCacheComp: (state, name) => {
if (!state.cacheComps.includes(name)) {
state.cacheComps.push(name)
}
},
removeCacheComp: (state, name) => {
const index = state.cacheComps.indexOf(name)
console.log('index:' + index)
if (index > -1) {
Vue.set(state, 'cacheComps', state.cacheComps.splice(index, 1))
}
}
}
}

export default cache

添加路由守卫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
beforeRouteLeave (to, from, next) { // 缓存策略,当页面离开前判断 是不是以下几个路由,如果是,添加至状态,不是则清空
console.log(to)
const cachePath = ['a','b']
const needCache = cachePath.some(item => to.path.indexOf(item) >= 0)
if (needCache) {
// 由于我是嵌套路由实现的tab 所以需要缓存父子的组件
this.$store.commit('addCacheComp', 'layout')
this.$store.commit('addCacheComp','list')
} else {
this.$store.commit('removeCacheComp', 'layout')
this.$store.commit('removeCacheComp','list')
}
next()
}

适当情况下清空缓存

在B或C页面做了某些提交操作,影响列表数据时需要删除缓存:

1
2
3
4
5
6
7
commit(){
doCommit().then(() => {
// ...
this.$store.commit('removeCacheComp', 'layout')
this.$store.commit('removeCacheComp','list')
})
}