Vue 组件多级继承、继承全部属性

核心方法

在B组件中添加v-bind="$attrs"v-on="$listeners"两个属性即可`

A 组件中:
<B v-bind="$attrs" v-on="$listeners>
</B>

这样在A中就能使用B的属性和绑定的方法了

如果想详细理解,请继续阅读

一、关于组件之间的通信

组件之间相互传递数据、方法,就可以理解为组件之间的通信。比如A组件传一个对象给B组件,这就是通信。

二、组件之间通信的常见方式

使用props或vuex可以实现。具体实现可参考:

但他们各有缺陷:

  1. 如果仅仅使用vuex,来实现组件通信,则就有点杀鸡用牛刀了。
  2. 使用props, 在多级包含关系的组件之间传递又太麻烦。

三、如何简单的实现组件多级传递属性和方法

使用v-bind="$attrs"v-on="$listeners"。看下面这个例子

现在有一下三个组件:

grandfather组件:
<template>
  <section>
    <father
      name="name"
      age="18"
      gender="666"
      sdf="asd"
      @isClick="isClick"
      @asd="asd"
    ></father>
  </section>
</template>
<script>
  import father from '~/components/father';
  export default {
    components: {
      father
    },
    methods: {
      asd() {
        console.log('gr', 999);
      },
      isClick() {
        console.log('gr', 666);
      }
    }
  };
</script>

这个组件内部包含了一个father组件,并为father组件传递了四个参数和2个方法。

father组件
<template>
  <section>
    <div class="mt-10">
      <son v-bind="$attrs" v-on="$listeners" />
    </div>
  </section>
</template>

<script>
  import son from '~/components/son';
  export default {
    components: {
      son
    },
    props: {
      name: {
        type: String,
        default: 'default'
      },
      age: {
        type: String,
        default: 'default'
      }
    }
  };
</script>

在father组件中,只递归一了两个入参:name和age。使用了v-bind=“ a t t r s " 属 性 , 该 属 性 包 含 了 父 作 用 域 中 不 作 为 p r o p 被 识 别 ( 且 获 取 ) 的 特 性 绑 定 ( c l a s s 和 s t y l e 除 外 ) 。 未 识 别 的 事 件 通 过 ‘ v − o n = " attrs" 属性,该属性包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外)。未识别的事件通过`v-on=" attrs"prop()(classstyle)von="listeners”`传入

son组件
<template>
  <section>
    <div>
      {{ $attrs['gender'] }}  在$attrs里面只会有props没有注册的属性
      <br>
      {{ gender }}
    </div>
  </section>
</template>

<script>
  export default {
    props: {
      gender: {
        type: String,
        default: ''
      }
    },
    mounted() {
      console.log('son', this.$attrs);
      console.log('son', this.$listeners);
      this.$listeners.isClick();
      this.$listeners.asd();
    }
  };
</script>

结果

加载爷爷组件grandfather,运行结果如下:

son {sdf: 'asd'}
son {asd: function, isClick: function}

gr 666
gr 999 

页面上显示:
在$attrs里面只会有props没有注册的属性
666 

从结果分析:

1.在儿子组件中,console.log(‘son’, this.$attrs);的结果为什么是 {sdf: ‘asd’}

在爸爸节点中调用儿子组件时,使用了v-bind=" a t t r s " 。 在 儿 子 节 点 中 的 v m . attrs"。在儿子节点中的vm. attrs"vm.attrs只会包含父节点中没有绑定的属性。爷爷那里传过来了name, age, gender, sdf。其中name age在爸爸那里已经定义了,gender在儿子的props里也定义了。所以只有sdf没有定义,结果中就只有sdf属性了

2.在儿子组件中,console.log(‘son’, this.$listeners);的结果为什么是son {asd: function, isClick: function}

通过 l i s t e n e r s 传 递 了 爷 爷 中 的 方 法 到 孙 子 组 件 , 但 是 在 孙 子 组 件 中 , 不 能 直 接 使 用 该 方 法 , 哪 怕 将 同 名 方 法 暴 露 在 孙 子 的 p r o p s 中 , 在 孙 子 组 件 里 也 不 能 使 用 爷 爷 传 过 来 的 方 法 。 可 以 通 过 v m . listeners传递了爷爷中的方法到孙子组件,但是在孙子组件中,不能直接使用该方法,哪怕将同名方法暴露在孙子的props中,在孙子组件里也不能使用爷爷传过来的方法。可以通过vm. listeners使props使vm.listeners.方法名() 的方式来使用爷爷传递的方法

4.如何理解页面上显示的666

子组件中的gender属性是props中的属性,在爷爷组件中传入了gender的值是666。所以,通过$atter可以直接在爷爷组件传递数据给孙子组件

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值