vue 组件之间通信

176 阅读1分钟

vue数据通信:

几种通信方式无外乎以下几种:

Prop(常用)

$emit (组件封装用的较多)

.sync语法糖 (较少)

attrs & $listeners (组件封装用的较多)

provide & inject (高阶组件/组件库用的较多)

slot-scope & v-slot (vue@2.6.0+)新增

scopedSl

父组件向子组件

通过 props 传递父组件数据和事件,或者通过 $emit$on 实现事件传递

通过 ref 属性,调用子组件方法,传递数据;

通过 props 传递父组件数据和事件,或者通过 $emit$on 实现事件传递

通过 this.$parent.$data 或者 this.$parevent._data 获取父组件数据,通过

this.$parent 执行父组件方法

子组件向父组件

this.$emit()

兄弟组件

通过 eventBus 挂在全局事件

利用 parent 进行数据传递, parent.$children 调用兄弟组件事件

注意:1使用 eventBus 不需要的时候须移除

多级嵌套组件数据通信

attrs listeners

attrs 是一个属性集合,而 listeners 是一个事件集合,两者都是 以对象的形式来保存数据,

A组件代码更新如下

<template>
 <div>
   <child-dom
    :foo="foo"
    :coo="coo"
     v-on:upRocket="reciveRocket"
   >
   </child-dom>
 </div>
</template>
<script>
 import childDom from "@/components/ChildDom.vue";
 export default {
   name:'demoNo',
   data() {
     return {
       foo:"Hello, world",
        coo:"Hello,rui"
    }
  },
 components:{childDom},
 methods:{
   reciveRocket(){
      console.log("reciveRocket success")
   }
 }
}
</script>
b组件更新如下

<template>
 <div>
 <p>foo:{{foo}}</p>
 <p>attrs:{{$attrs}}</p>
 <childDomChild v-bind="$attrs" v-on="$listeners"></childDomChild>
 </div>
</template>
<script>
import childDomChild from './childDomChild';
export default {
 name:'child-dom'
 props:["foo"],
 inheritAttrs:false, // 组件标签内所绑定的属性
}
</script>
c组件更新如下

<template> 
 <div>
 <p>coo:{{coo}}</p>
 <button @click="startUpRocket">我要发射火箭</button>
 </div>
</template>
<script>
 export default {
 name:'childDomChild',
 props:['coo'],
 methods:{
 startUpRocket(){
 this.$emit("upRocket");
 console.log("startUpRocket")
 }
 }
 }
</script>