美文网首页
vue 父组件获取循环子组件 undefined

vue 父组件获取循环子组件 undefined

作者: 云高风轻 | 来源:发表于2023-12-18 18:50 被阅读0次

1. 前言

  1. 问题困扰了几天,今天突然解决了哈哈
  2. Vue 父组件循环使用refs调用子组件方法出现undefined的问题

2. 简要描述下场景

  • 模板
  <div v-for="(componentName, registrationNumber) in cxDialog" :key="registrationNumber">
      <component :is="componentName" :ref="registrationNumber"></component>
    </div>
  1. 父组件当中.v-for 循环动态创建子组件
  • 点击事件
    apiClickCB(btn) {
      console.log('componentRef', this.$refs)
      console.log('ref', this.$refs[btn.apiCode])
      console.log('show', this.$refs[btn.apiCode].show)
}
  1. 父组件点击事件 可以获取到组件,也有属性但是访问的时候报错 undefined
  • 错误
错误

定时器 ,nextTick 等等尝试了也不好使,


3. 解决方式-1

  1. 每个组件单独写,不使用循环指令
<BDC313 ref="BDC313" /> 
<BDC314 ref="BDC314" /> 
  1. 子组件少了还行,但是多了肯定不使用

4. 解决方式-2

  • 模板
  <div v-for="(componentName, registrationNumber) in cxDialog" :key="registrationNumber">
      <component :is="componentName" ref="cxDialogRef"></component>
    </div>
  1. ref不要动态绑定 ,原因如下
  1. 关于 ref 注册时间的重要说明:因为 ref 本身是作为渲染结果被创建的,在初始渲染的时候你不能访问它们 - 它们还不存在!$refs 也不是响应式的,因此你不应该试图用它在模板中做数据绑定
  • 逻辑
    apiClickCB(btn) {
      console.log('this.$refs.cxDialogRef', this.$refs.cxDialogRef);
      this.$refs.cxDialogRef.forEach((com) => {
        if (com.$options.name == btn.apiCode) {
             console.log('com.$options', com.$options.name);
             console.log('name', com.name);
             com.show(btn)
        }
      })
    },
调试

当 ref 和 v-for 一起使用的时候,你得到的 ref 将会是一个包含了对应数据源的这些子组件的数组

  1. 不要直接访问name属性
  2. 我这里其实还有过滤展示,还有其他组件的封装,无法直接使用 ,循环时候的索引来从数组里面比对,取值,这个看自己的需求来就行

5. 后记

  1. 多看官网,多试
  2. 没有牛人的本事,就自己多尝试,咱就普通人,菜鸟.普通人有普通人的解决方式

参考资料

vue2ref


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉

相关文章

网友评论

      本文标题:vue 父组件获取循环子组件 undefined

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