vue 组件之间如何通信

组件之间如何通信,组件之间不同的关系,有不同的通信方式。

(1)公用通信方式 :vuex

不论组件是什么关系,都可以使用vuex,vuex状态管理器,可以把共享公共的数据都存储在这里,里面也有改变数据的方法。

(2)父子组件通信方式: props/$emit 、$parent/$children 、provide/inject 

  (a)props/$emit:父组件通过props给子组件传数据,子组件通过$emit(事件名,参数)给父组件传新数据

//父组件
<template>
  <div>
      <child :message="mes" @postMessage="getMessage"></child>
      <div>{{mes}}</div>
  </div>
</template>
export default{
    data(){
        mes:"第一次消息"
    },
    methods:{
        // 接受子组件发起的$emit事件,传来的新数据
        getMessage(val){
            this.mes = val
        }
    }
}

// 子组件
<template>
  <div>
      <p>我是子组件,props中message的值:{{message}}</p>
      <button @click="change">改变props中的message</button> 
  </div>
</template>
export default{
    props:["message"],
    methods:{
        change(){
            this.$emit("postMessage","第二次消息")
        }
    }
}

  (b)$parent/$children:组件实例中有$parent、$children属性

  (c)provide/inject:这个比较适合跨级的组件,比如祖父组件与孙组件(描述的好奇怪啊)这种。

//父(祖父)组件
export default {
    name: "App",
    data() {
        return {
          a: "123"
        };
      },
      provide() {
        return {
          a: this.a,
          b: "bb"
        };
      }
  }

// 子组件 export default{ inject:['a','b'], created(){ console.log(this.a,this.b) // 123 bb } }

(3)兄弟组件通信方式: bus

兄弟组件之间通信,通过创建一个新的vue实例,作为两者之间的桥梁,然后通过$emit 和 $on去触发接受事件。

ps:$on接受事件之后,记得在beforeDestory移除,即$off。

//首先创建一个文件BUS.js
import Vue from 'vue';
export default new Vue;

// 子组件A
<template>
  <div>
    <div>我是子组件A:{{num}}</div>
    <button @click="add">点击加1</button>
  </div>
</template>
import BUS from "../common/BUS.js";
export default{
    data(){
        return {
            num:0
        }
    },
    methods:{
        add(){
            this.num+=1
            BUS.$emit("getNum",this.num)
        }
    }
}

// 子组件B
<template>
  <div>
    <div>我是子组件:{{num}}</div>
  </div>
</template>
import BUS from "../common/BUS.js";
export default{
    data(){
        return {
            num:0
        }
    },
    created(){
        BUS.$on("getNum",val=>{
            this.num = val
        })
    },
    beforeDestroy() {
        // 记得移除
        BUS.$off("getNum")
    }
}

// 父组件
<templete>
    <div>
        <child-a></child-a>
        <child-b></child-b>
    </div>
</templete>
原文地址:https://www.cnblogs.com/grow-up-up/p/12883399.html