Vue组件通信的六种方式,你会几个?

在平时的开发过程中,父子 / 兄弟组件间的通信是肯定会遇到的啦,所以这里总结了 6 种 Vue 组件的通信props / $e$emit / Vuex$attrs / $listeners

  1. $parent / $children 与 ref

  2. provide / inject

前言

如上图所示,A/B,B/C,B/D 组件是父子关系,C/D 是兄弟关系。那如何根据不同的使用场景,选择不同的通信方式呢?所以前提就是我们要了解不同的通信方式的作用和区别。

一. props / $emit

这个是我们平时用得比较多的方式之一,父组件 A 通过 props 参数向子组件 B 传递数据,B 组件通过 $emit 向 A 组件发送一个事件(携带参数数据),A组件中监听 $emit 触发的事件得到 B 向 A 发送的数据。 我们来具体解释下它的实现步骤:

1:父组件向子组件传值

// App.vue 父组件
<template>
    <a-compontent :data-a="dataA"></a-compontent>
</template>
<script>
import aCompontent from './components/A.vue';
export default {
    name: 'app',
    compontent: { aCompontent },
    data () {
        return {
            dataA: 'dataA数据'
        }
    }
}
// aCompontent 子组件
<template>
    <p>{{dataA}}</p> // 在子组件中把父组件传递过来的值显示出来
</template>
<script>
export default {
    name: 'aCompontent',
    props: {
        dataA: {           //这个就是父组件中子标签自定义名字
            type: String,
            required: true  // 或者false
        }
    }
}
</script>
复制代码

2:子组件向父组件传值(通过事件方式)

// 子组件
<template>
    <p @click="sendDataToParent">点击向父组件传递数据</p>
</template>
<script>
export default {
    name: 'child',
    methods:{
        changeTitle() {
            this.$emit('sendDataToParent','这是子组件向父组件传递的数据'); // 自定义事件,会触发父组件的监听事件,并将数据以参数的形式传递
        }
    }
}

// 父组件
<template>
    <child @sendDataToParent="getChildData"></child>
</template>
<script>
import child from './components/child.vue';
export default {
    name: 'child',
    methods:{
        getChildData(data) {
            console.log(data); // 这里的得到了子组件的值
        }
    }
}
</script>
复制代码

二. $emit / $on

这种方式是通过一个类似 App.vue 的实例作为一个模块的事件中心,用它来触发和监听事件,如果把它放在 App.vue 中,就可以很好的实现任何组件中的通信,但是这种方法在项目比较大的时候不太好维护。

举个

(0)

相关推荐