Vue基于$attrs及$listeners实现隔代通信

简介: Vue基于$attrs及$listeners实现隔代通信

所谓隔代通信就是A 与C的通信

A -> B -> C

d24.3.png

代码实例

A.vue

<template>

<div id="app">
<!-- 此处监听了事件,可以在C组件中直接触发 -->
<b-child
nameToB="nameToB"
nameToC="nameToC"
@buttonClick="buttonClick"
>
</b-child>
</div>
</template>


<script>
import BChild from "./B.vue";

export default {
data() {
return {};
},

components: { BChild },

methods: {
buttonClick() {
console.log("buttonClick...");
}
}
};
</script>

B.vue

<template>
<div>
<h1>B组件</h1>
<p>name: { {nameToB}}</p>
<p>$attrs: {<!-- -->{$attrs}}</p>
<hr>
<!-- C组件中能直接触发buttonClick的原因在于 B组件调用C组件时 使用 v-on 绑定了$listeners 属性 -->
<!-- 通过v-bind 绑定$attrs属性,C组件可以直接获取到A组件中传递下来的props(除了B组件中props声明的) -->
<c-child v-bind="$attrs&#34; v-on&#61;&#34;$listeners"></c-child>

</div>
</template>

<script>
import CChild from './C.vue';

export default {
props: ['nameToB'],

components: { CChild },

data () {
return {};
},

// inheritAttrs: false,
};
</script>

C.vue

<template>
<div>
<h1>C组件</h1>
<p>name: { {nameToC}}</p>
<p>$attrs: {<!-- -->{$attrs}}</p>
<button @click="buttonClick">点击C按钮</button>
</div>
</template>

<script>
export default {
// inheritAttrs: false,

props: ['nameToC'],

data () {
return {};
},

methods: {
buttonClick(){
this.$emit('buttonClick');
}
}
};
</script>

最终,通过B实现了A与C的通信

d24.4.png


参考

Vue v2.4中新增的a t t r s 及 attrs及attrs及listeners属性使用教程


            </div>
目录
相关文章
|
2月前
|
存储 JavaScript 容器
Vue3通信方式之ref、$parent、provide、inject、pinia和slot
Vue3通信方式之ref、$parent、provide、inject、pinia和slot
16 0
|
4月前
|
JavaScript
vue3中$attrs的变化与inheritAttrs的使用
vue3中$attrs的变化与inheritAttrs的使用
|
8月前
|
JavaScript API
vue组件通讯之provide / inject
vue组件通讯之provide / inject
29 0
|
10月前
|
JavaScript
vue v-bind=“$attrs“、v-on=“$listeners“
vue v-bind=“$attrs“、v-on=“$listeners“
105 0
|
11月前
|
前端开发 JavaScript 容器
React组件通过Context通讯
React组件通过Context通讯
58 0
|
JavaScript
Vue基于$attrs及$listeners实现隔代通信
Vue基于$attrs及$listeners实现隔代通信
71 0
Vue基于$attrs及$listeners实现隔代通信
|
JavaScript API 容器
详细讲解vue中祖孙组件间的通信之使用$attrs和$listeners的方式
详细讲解vue中祖孙组件间的通信之使用$attrs和$listeners的方式
347 0
|
JavaScript
$attrs/$listeners的使用场景 -- vue组件通信系列
$attrs/$listeners的使用场景 -- vue组件通信系列
108 0
|
JavaScript API
ref/$refs的使用场景 -- vue组件通信系列
ref/$refs的使用场景 -- vue组件通信系列
148 0
|
存储 测试技术 API
vue3源码分析——实现组件通信provide,inject
问题解决: 问题1和问题2都很好解决,对外导出函数,传递对应的参数,只是数据存储在哪里的问题,经过仔细的思考,会发现,组件的数据是需要进行共享的,父组件存入的数据,里面的所有子组件和孙子组件都可以共享,那么存储在实例上,是不是一个不错的选择呢? inject 是获取父级组件的数据,那么在实列上还需要传入parent