vue自定义keepalive组件的问题解析

 更新时间:2022年07月06日 14:22:47   作者:神经蛙12138  
这篇文章主要介绍了vue自定义keepalive组件的相关资料,keep-alive组件是使用 include exclude这两个属性传入组件名称来确认哪些可以被缓存的,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

vue自定义keepalive组件

前一阵来了一个新的需求,要在vue项目中实现一个多开tab页面的功能,本来心想,这不简单嘛就是一个增加按钮重定向吗?(当然如果这么简单我就不写这个文章了)。很快写完,提交测试。测试大哥很快就提交了一个问题:"你两个tab页访问同一个链接,怎么还是个联动的呢?"。我擦,这指定是缓存的问题。

为什么会出现这种情况呢

keep-alive组件是使用 include exclude这两个属性传入组件名称来确认哪些可以被缓存的

    <keep-alive exclude="a,b,c" >
        <router-view></router-view>
    </keep-alive>

我们在看一下源码,看看人家是怎么实现的(这两张图截的真难看)

male

主要逻辑(直说上述代码)就是根据传入的 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的作用是用来区分同一个组件是不是重复使用一个实例。

到此这篇关于vue自定义keepalive组件的文章就介绍到这了,更多相关vue keepalive组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue设置浏览器小图标(ICON)的详细步骤

    Vue设置浏览器小图标(ICON)的详细步骤

    vue中网页图标默认使用的是vue自带的一个icon的图标,也是vue的logo,下面这篇文章主要给大家介绍了关于Vue设置浏览器小图标(ICON)的详细步骤,需要的朋友可以参考下
    2023-01-01
  • vue进行图片的预加载watch用法实例讲解

    vue进行图片的预加载watch用法实例讲解

    下面小编就为大家分享一篇vue进行图片的预加载watch用法实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • 浅谈ElementUI中switch回调函数change的参数问题

    浅谈ElementUI中switch回调函数change的参数问题

    今天小编就为大家分享一篇浅谈ElementUI中switch回调函数change的参数问题,具有很好的价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Element Notification通知的实现示例

    Element Notification通知的实现示例

    这篇文章主要介绍了Element Notification通知的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • vant实现购物车功能

    vant实现购物车功能

    这篇文章主要为大家详细介绍了vant实现购物车功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • vue封装动态表格方式详解

    vue封装动态表格方式详解

    这篇文章主要为大家介绍了vue封装动态表格方式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • vue组件常用的父子、兄弟、跨组件等传值方法

    vue组件常用的父子、兄弟、跨组件等传值方法

    Vue常用的三种传值方式有: •父传子 •子传父 •非父子传值 引用官网的一句话:父子组件的关系可以总结为 prop 向下传递,事件向上传递,熟悉vue各类关系的组件之间传值方法会令开发更加得心应手,下面将对父子、兄弟、页级组件之间的传值作浅谈
    2023-12-12
  • Vue引入jQuery的方法和配置教程

    Vue引入jQuery的方法和配置教程

    虽然Vue.js作为一个现代化的前端框架,鼓励使用其自身的响应式机制来处理DOM操作,但在某些情况下,尤其是在需要维护旧系统的项目中,可能会遇到需要引入jQuery的情况,本文将详细讲解如何在Vue项目中引入jQuery,需要的朋友可以参考下
    2024-09-09
  • 10分钟了解Vue3递归组件的用法

    10分钟了解Vue3递归组件的用法

    递归 简单来讲就是程序自己调用自身,vue中的递归组件就是,组件自身调用自身,下面这篇文章主要给大家介绍了关于Vue3递归组件的用法,需要的朋友可以参考下
    2022-03-03
  • el-select 下拉框全选、多选的几种方式组件示例详解

    el-select 下拉框全选、多选的几种方式组件示例详解

    这篇文章主要介绍了el-select 下拉框全选、多选的几种方式组件示例详解,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12

最新评论