Vue之组件通信方式浅析

Vue组件通信方式

一.组件之间的通信方式

两个组件或者多个组件进行一些数据传递等操作

1.组件关系

组件关系的确定不是在定义时,而是在调用时确定的

 		 <div id="app">
            <!--  调用parent组件  -->
            <parent></parent>
         </div>

		// 定义一个名为 parent的组件
        Vue.component('parent', {
            //这里使用了son组件,才可以确定这两个组件的关系,son是parent的子组件
            template: 
            `<div>
                <p>parent</p>
				<son></son>
            </div>`
        })

        //定义一个名为son的组件
        Vue.component('son',{
            template:
            `<div>   
            <p>son</p>    
            </div>`
        });

        //根组件
        var vm = new Vue({
            el: '#app'
        });

上面组件的关系是,只有在调用的时候,才可以确定,根组件是最顶级的, root>parent>son 这样关系就确定了

2.组件通信

1.父组件通信子组件 父->子

父组件通信子组件,一般都是使用props,通过自定义属性的形式传递参数到子组件

	<div id="app">
        <parent></parent>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
    <script>
        Vue.component('parent', {
            //父通子  使用属性的方式,向下传递给子组件
            template: `
                <div>
                    我是父组件
                    <son :parms='msg'></son>
                </div>
            `,
            data() {
                return {
                    msg: '父组件向子组件传递过来的数据'
                }
            }
        });


        //子组件通过props接收
        Vue.component('son', {
            props: {
                parms: {
                    type: String,
                    required: true
                }
            },
            template: `
                <div>
                    我是子组件
                    <h1 v-text='parms'></h1>
                </div>
            `,
        });

        const vm = new Vue({
            el: '#app'
        });
    </script>
2.子组件通信父组件 子->父

子组件通信父组件,一般是使用 e m i t ( 使 emit 通过自定义事件回传数据(在子组件中使用 emit触发)

 	<div id="app">
        <parent></parent>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
    <script>
        Vue.component('parent', {
            //子通父,使用自定义事件回传数据  $emit(在子组件中使用)
            template: `
                <div>
                    我是父组件
                    <son @change='handle'></son>
                    <h1 v-text='abc'></h1>
                </div>
            `,
            data(){
                return{
                    abc:'123'
                }
            },
            methods:{
                handle(value){
                    this.abc=value;
                }
            }
        });

     
        //子组件通过$emit传递到父组件
        Vue.component('son', {
            data(){
                return {
                    msg: '子组件向父组件传递过来的数据'
                }
            },
            template: `
                <div>
                    我是子组件
                    <h1></h1>
                    <button @click="sonHandle">点我,向父组件传值</button>
                </div>
            `,
            methods:{
                sonHandle(){
                    this.$emit('change', this.msg)
                }
            }
        });

        const vm = new Vue({
            el: '#app'
        });
    </script>
3.兄弟之间通信 兄->弟 弟->兄

兄弟组件通信方式,也就是非父子的通信,兄弟组件通信可以使组件之间相互操作,相互联动

1.最简单的方式:找他们的爹(状态提升)
 <div id="app">
        <child-one @change="handle"></child-one>
        <child-two :msg='msg'></child-two>

    </div>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
    <script>
        //要实现兄弟组件的通信  child-one=====>child-two
        Vue.component('child-one', {
            template: `
                <div>
                    <h1>我是子组件一号</h1> 
                    <button @click='handle'>我要向子组件二号传递值</button>
                </div>
            `,
            data(){
                return{
                    oneWorld: '我是来自子组件一号'
                }
            },
            methods: {
                handle() {
                    //通过$emit 回传给父组件 
                    this.$emit('change', this.oneWorld);
                }
            }

        });

        Vue.component('child-two', {
            //接收父组件传递过来的参数
            props: {
                msg:String
            },
            template: `
                <div>
                    <h1>我是子组件二号</h1> 
                    <span>我是子组件一号传递过来的参数:</span><span v-text='msg'></span>
                </div>
            `
        });

        const vm = new Vue({
            el: '#app',
            data: {
                msg: ''
            },
            methods: {
                //父组件接收子组件回传的参数
                handle(value) {
                    this.msg = value;
                }
            }
        });
    </script>

上面的这种实现的方式就是通过状态提升,也是最简单粗暴的方式,原理就是找他们的爹,然后他爹在传给另个子组件

要实现兄弟组件的通信 child-one=====>child-two

实现流程是: 父组件的方法中监听一个接收子组件(child-one)回传的参数函数, 然后在页面中,通过自定义事件,传递给子组件(child-one)所监听的函数.再使用$emit 把需要传递给child-two组件的数据回传给父组件 , 父组件得到之后,通过props传参形式直接给child-two组件,child-two去接收,然后再使用,这里就实现了一个兄弟组件的通信.

2.中央事件管理器(中央事件总线)

亲兄弟之间或者关系特别复杂的组件之间

 	<div id="app">
        <child-one></child-one>
        <child-two></child-two>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
    <script>
        //要实现兄弟组件的通信  child-one=====>child-two

        //创建一个事件总线
        const bus = new Vue();

        Vue.component('child-one', {
            template: `
                <div>
                    <h1>我是子组件一号</h1> 
                    <button @click="handle">我要向子组件二号传递值</button>
                </div>
            `,
            data() {
                return {
                    oneWorld: '我是来自子组件一号',
                    twoWorld: '我是来自子组件一号的第二个参数',
                }
            },
            methods: {
                handle() {
                    bus.$emit('change', this.oneWorld, this.twoWorld);
                }
            }
        });

        Vue.component('child-two', {
            template: `
                <div>
                    <h1>我是子组件二号</h1> 
                    <span>我是子组件一号传递过来的参数:</span>
                    <span v-text='msg1'></span>
                    <span v-text='msg2'></span>
                </div>
            `,
            data() {
                return {
                    msg1: '',
                    msg2: ''
                }
            },
            //在组件生命周期的created阶段,监听自定义事件
            created() {
                var _this = this;
                /*
                    bus.$on(event, callback)
                    event 监听的事件
                    callback 事件触发时的回调函数
                */
                bus.$on('change', function (value1, value2) {
                    _this.msg1 = value1;
                    _this.msg2 = value2;
                })
            }
        });

        const vm = new Vue({
            el: '#app'
        });

    </script>

这是一个通过事件总线的方式来实现兄弟组件通信的,一般如果没有用到Vuex全局状态管理器的话,使用这个方式,是比较推荐的,

实现流程是:

1. 先创建一个空的vue实例对象。也就是不需要额外配置什么选项。

     const bus = new Vue()

2. A B 两个组件,A 通信 B

      1. 先在 B 组件的 created 中去通过 bus 来监听一个自定义事件

         bus.$on(eventName, callback)

        	eventName 要监听的事件的名字

        	callback 事件触发时的一个回调函数

       				 payload 事件触发时传递过来的 payload 参数

      2.A 组件的某个时候去触发自定义事件

         bus.$emit(eventName, payload)
          eventName 要触发的事件的名字

          payload  触发事件时传递过去的参数
3.Vuex全局状态管理器

猜你喜欢

转载自blog.csdn.net/liuqiao0327/article/details/106694925