1. 程式人生 > >vue2.0父子組件以及非父子組件如何通信

vue2.0父子組件以及非父子組件如何通信

tty rep create pla eve 16px markup div ont

1.父組件 >>> 子組件

父組件數據如何傳遞給子組件呢?可以通過props屬性來實現

父組件:

<parent>
    <child :child-msg="msg"></child>  //這裏必須要用 - 代替駝峰
</parent>

data(){
    return {
        msg: [1,2,3]
    };
}

子組件通過props來接收數據:
方式1:

props: [‘childMsg‘]

方式2 :

props: {
    childMsg: Array   //這樣可以指定傳入的類型,如果類型不對,會警告
}

方式3:

props: {
    childMsg: {
        type: Array,
        default: [0,0,0] //這樣可以指定默認的值
    }
}

這樣呢,就實現了父組件向子組件傳遞數據.

2.子組件 >>> 父組件通信

那麽,如果子組件想要改變數據呢?這在vue中是不允許的,因為vue只允許單向數據傳遞,這時候我們可以通過觸發事件來通知父組件改變數據,從而達到改變子組件數據的目的.

子組件:
<template>
    <div @click="up"></div>
</template>

methods: {
    up() {
        this.$emit(
‘upup‘,‘hehe‘);   //主動觸發upup方法,‘hehe‘為向父組件傳遞的數據 } }

父組件:

<div>
    <child @upup="change" :msg="msg"></child>   //監聽子組件觸發的upup事件,然後調用change方法
</div>
methods: {
    change(msg) {
        this.msg = msg;
    }
}

3.非父子組件通信

如果2個組件不是父子組件那麽如何通信呢?這時可以通過eventHub來實現通信.
所謂eventHub就是創建一個事件中心,相當於中轉站,可以用它來傳遞事件和接收事件.

let Hub = new Vue();   //創建事件中心

組件1觸發:

<div @click="eve"></div>
methods: {
    eve() {
        Hub.$emit(‘change‘,‘hehe‘);   //Hub觸發事件
    }
}

組件2接收:

<div></div>
created() {
    Hub.$on(‘change‘, () => {   //Hub接收事件
        this.msg = ‘hehe‘;
    });
}

這樣就實現了非父子組件之間的通信了.原理就是把Hub當作一個中轉站!

vue2.0父子組件以及非父子組件如何通信