vue中如何自定义keepalive组件,缓存问题怎样解决
Admin 2022-08-12 群英技术资讯 1253 次浏览
今天这篇我们来学习和了解“vue中如何自定义keepalive组件,缓存问题怎样解决”,下文的讲解详细,步骤过程清晰,对大家进一步学习和理解“vue中如何自定义keepalive组件,缓存问题怎样解决”有一定的帮助。有这方面学习需要的朋友就继续往下看吧!前一阵来了一个新的需求,要在vue项目中实现一个多开tab页面的功能,本来心想,这不简单嘛就是一个增加按钮重定向吗?(当然如果这么简单我就不写这个文章了)。很快写完,提交测试。测试大哥很快就提交了一个问题:"你两个tab页访问同一个链接,怎么还是个联动的呢?"。我擦,这指定是缓存的问题。
keep-alive组件是使用
includeexclude这两个属性传入组件名称来确认哪些可以被缓存的
<keep-alive exclude="a,b,c" >
<router-view></router-view>
</keep-alive>
我们在看一下源码,看看人家是怎么实现的(这两张图截的真难看)

主要逻辑(直说上述代码)就是根据传入的
include,exclude两个属性传入数组,根据当前访问的组件名称判断。我们相同链接都访问同一个组件名称(name)相同,第二次访问的时候,链接指向的是同一个组件,因为使用组件的name作为缓存key,此时会被认为是读取缓存操作,就会直接加载缓存并渲染,所以出现了两个tab页访问同一个链接,出现联动情况
这个比较简单之前是因为组件name当key导致的,那我们就不使用组件的name作为key了,改为name+tab的index作为key。

group-keep-alive.js
function remove(arr, item) {
if (arr.length) {
var index = arr.indexOf(item)
if (index > -1) {
return arr.splice(index, 1)
}
}
}
function getFirstComponentChild(children) {
if (Array.isArray(children)) {
for (var i = 0; i < children.length; i++) {
var c = children[i]
if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {
return c
}
}
}
}
function isDef(v) {
return v !== undefined && v !== null
}
function isAsyncPlaceholder(node) {
return node.isComment && node.asyncFactory
}
var patternTypes = [String, RegExp, Array]
export default {
name: 'keep-alive',
abstract: true,
computed: {
// 这里算是一个伪代码
// 缓存的数组 [{ 'tab1/组件名称':comp, 'tab2/组件名称':comp },{ 'tab1/组件名称':comp, 'tab2/组件名称':comp }]
cacheArray() {
return this.$store.state.xxx.groupCache
},
// 当前选中的分组 例:0/1/2... 这里用来读取cache数组的index
groupIndex() {
return this.$store.state.xxx.groupIndex
}
},
created: function created() {
// 当前tab的缓存
const cache = this.cacheArray[this.groupIndex]
this.cache = cache || Object.create(null)
// TODO 页面初始化事件,后续可触发初始化事件
},
destroyed: function destroyed(to, form) {
// TODO 页面离开事件,后续可触发关闭事件
},
render: function render() {
var slot = this.$slots.default
var vnode = getFirstComponentChild(slot)
var componentOptions = vnode && vnode.componentOptions
// check pattern
var ref$1 = this
var cache = ref$1.cache
const key = `${this.groupIndex}/${componentOptions.Ctor.options.name}`
// 存在key直接读取
if (cache[key]) {
vnode.componentInstance = cache[key].componentInstance
} else {
// 没有进行缓存
cache[key] = vnode
}
// 写入缓存
this.$store.dispatch('setGroupCache', {
cache: this.cache
})
return vnode || (slot && slot[0])
}
}
意思一下就行了
<group-keep-alive>
<router-view :key="key" />
/group-keep-alive>
// key一定要区分
computed: {
key() {
return `${选中index}/${fullpath}`
},
}
1. 在group-keep-alive组件中设置了abstract: true,设置当前组件为抽象组件,我的李姐:就是一个对下一级(包含子元素)事件监听等提前拦截,从而对下一级进行操作
2. router-view :key="key" 这key的作用是用来区分同一个组件是不是重复使用一个实例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
目录前言ThreeJS 基础——实现转动的球体ThreeJS 纹理——实现转动的地球交互式雪糕地球添加 loading 效果前言最近的天气有几分酷热,去实验室的道路也有几分漫长,走着走着,小包感觉灵魂已经被热出窍了。回到实验室,把空调打开,雪糕吃上,静坐了几分钟,才重新感觉到灵魂的滋味,葛优躺在实验室的小床上,思维开始
这篇文章给大家分享一些vue框架的实用小技巧,包括数据的双向绑定、使用 Mixins、使用动态组件去懒加载组件、使用装饰器优化代码等等,小编觉得挺实用的,因此分享给大家做个参考,接下来一起跟随小编看看吧。
node的全局对象是“global”,global最根本的作用是作为全局变量的宿主;而所有全局变量(除了global本身以外)都是global对象的属性。在Node.js中可以直接访问到global的属性,而不需要在应用中包含它。
目录前言1.# 使用Object.hasOwn替代“in”操作符2.# 使用#声明私有属性3.# 超有用的数字分隔符4.# 使用?.简化和三元运算符5.# 使用BigInt支持大数计算最后前言JavaScript在不断地升级迭代,越来越多的新特性让我们的代码写起来变得简洁有趣,这篇文章会介绍5个新特性,一起研究一下把。
jquery中each的使用形式是“$(selector).each(function(index,element))”,each()方法可以规定匹配元素运行的函数,常用于遍历指定的对象和数组。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008