Vue2.x中的父子组件相互通信

Posted 铭绘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue2.x中的父子组件相互通信相关的知识,希望对你有一定的参考价值。

原理


在 Vue.js 中,父子组件的关系可以总结为 props down, events up 

父组件通过 props 向下传递数据给子组件,子组件通过 events 给父组件发送消息。看看它们是怎么工作的。

业务场景


这里指的是直接父子级关系的通信

  • 美女(子组件)将消息发送给大群(父组件)
  • 大群(父组件)收到美女发送的消息后再回个信息给美女(子组件)

父组件


template

<template>
    <div>
        <p>群消息girl:</p>
        <div>
            {{ somebody }} 说: 我 {{ age }} 了。
        </div>
        <hr>
        <v-girl-group 
                :girls="aGirls" 
                :noticeGirl="noticeGirl"
                @introduce="introduceSelf"></v-girl-group>
    </div>
</template>

 

注意的点:

  • 这里在父组件使用v-on来监听子组件上的自定义事件($emit的变化),一旦发生变化noticeGirl方法就会触发
<script>
import vGirlGroup from \'./GirlGroup\'

export default {
    name: \'girl\',
    components: {
        vGirlGroup
    },
    data () {
        return {
            aGirls:[{
                name:\'小丽\',
                age:22
            },{
                name:\'小美\',
                age:21
            },{
                name:\'小荷\',
                age:24
            }],
            somebody:\'\',
            age:\'\',
            noticeGirl:\'\'
        }
    },
    methods: {
        introduceSelf (opt) {
            this.somebody = opt.name;
            this.age = opt.age;

            // 通知girl收到消息
            this.noticeGirl = opt.name + \',已收到消息\';
        }
    }
}

</script>

 

注意的点:

  • 这里methods中定义的方法introduceSelf就是父组件接收到子组件发出的$emit的事件处理程序

子组件


template

<template>
    <div>
       <ul>
           <li v-for="(value, index) in girls">
                {{ index }} - {{ value.name }} - {{ value.age }} 
                <button @click="noticeGroup(value.name,value.age)">发送消息</button>
            </li> 
       </ul>
       <div>接收来自大群的消息:{{ noticeGirl }}</div>
    </div>
</template>

 

script

<script>
export default {
    name: \'girl-group\',
    props: {
        girls: {
            type: Array,
            required: true
        },
        noticeGirl: {
            type: String,
            required: false
        }
    },
    methods: {
        noticeGroup (name, age) {
            this.$emit(\'introduce\',{
                name: name,
                age: age
            })
        }
    }
}
</script>

 

注意的点:

  • 子组件使用$emit发出自定义事件

相比于Vue1.x的变化:

  • $dispatch 和 $broadcast 已经被弃用

*官方推荐的通信方式

结果


以上是关于Vue2.x中的父子组件相互通信的主要内容,如果未能解决你的问题,请参考以下文章

前端技能树,面试复习第 46 天—— Vue 生命周期 | 父子组件钩子的执行顺序 | 组件间通信有哪些方式

vue组件父子之间相互通信案例

Vue父子组件之间的相互通信

angularjs2中的非父子组件的通信

Vue中父子组件之间相互传值的方法

React教程:父子组件传值(组件通信)