【Vue】父子组件通信失败的原因分析

现象:
自定义树形组件时,使用 $parent 和 $emit 方法子组件都调用不到父组件。

原因:
树形控件使用了组件递归的思想,所以只要递归了一层之后就不是严格的父子关系了,所以 $emit 方法是不合适的。

$emit使用的一些条件:
1.组件之间是严格的父子关系。
2.自定义的事件名必须全为小写。

因为是树形结构,所以它的层数是不确定,所以 $parent方法也是不合适的。

解决方法:使用 $listeners 和 $attrs 实现通信。

“祖辈”组件(父组件):

<div class="tree-scroll">
  <child
    :label="title"
    :treeData="children"
    @childMethod="childMethod" />
</div>

子组件:

<template>
  <div>
  	  // 递归
      <child 
        :key="children.key"  
        v-for="children in treeData"  
        :treeData="children.children" 
        :label="children.title"
        v-bind="$attrs"   //  绑定$attrs属性,孙组件可以获取到祖辈组件中传递下来的属性
        v-on="$listeners" // 使孙组件也可以调用祖辈组件的方法
      >
      </child>
  </div>
</template>
<script>
export default {
  name: 'child', 
  data () {
    }
  },
  props: {
     treeData: {
      type: Array,
      default: () => []
    },
    label: {
      type: String,
      default: () => ''
    }
  },
  methods: {
    calFatherMethod (e) {
      // 调用祖辈组件函数
      this.$listeners.childMethod()
    }
  }
}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值