vue--组件传值:子传父和兄弟组件间常见的传值方式

前言

  上篇介绍了我对vue组件化的理解和父组件对子组件传值的方式,这篇介绍下常见的子传父和兄弟组件间的传值方式

目录

  • 子组件向父组件传值
  • 任意组件间的传值方式

正文

  • 子组件向父组件传值

  关键知识点:$emit

<div id="app">
        <child-div @a='handleTotal'></child-div>
        {{total}}
    </div>
    <script>
        //定义子组件
        Vue.component('child-div',{
            data(){
                return{
                    counter:0,
                }
            },
            template:'<span @click="handleCounter">点我加一{{counter}}</span>',
            methods:{
                //点击时候子组件加1,父组件加2
                handleCounter(){
                    this.counter ++
                    console.log('###########');
                    this.$emit('a',2)
                }
            }
        })
        new Vue({
            el:'#app',
            data:{
                total:0,
             },
            methods:{
                handleTotal(e){
                    console.log('@@@@@@@@@@@');
                    console.log(e);
                    this.total+=e
                }
            }
        })
    </script>

  分析:定义子组件,并且定义子组件的点击事件,子组件通过点击事件触发$emit方法,向父组件弹出a方法,父组件通过监听这个a方法定义handleTotal方法,从而父组件接收到子组件传来的值,这样实现了子组件加一父组件加二效果。

  这里遇到的一个坑:我用到的vue.js版本为https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.min.js,在$emit()中注册的给父组件弹出的方法名必须全部用小写字母,只要方法名中存在大写字母就无法实现该效果,但是也不会报错。

  • 任意组件的传值方式

  关键知识点:事件总线EventBus

  任意两个组件之间进行通讯,需要借助事件总线(一个空的vue实例)来触发事件和监听事件,从而实现组件之间的通信。包括父子,兄弟,以及跨级组件都可以使用

 <div id="app">
        <data-a></data-a>
        <data-b></data-b>
        <data-c></data-c>
    </div>
    <template id="a"><div>
        <button @click='atoC'>A将数据传递给C</button>
        我的名字是:{{name}}</div>
    </template>
    <template id="b"><div>
        <button @click='btoC'>B将数据传递给C</button>
        我的年龄是:{{age}}</div>
    </template>
    <template id="c"><div>
        <span>我接受到的参数是</span>
        {{name}}========={{age}}</div>
    </template>
    <script>

        var Event = new Vue();
        var a = Vue.component(
            'data-a', {
            template: '#a',
            data() {
                return {
                    name: 'Tom'
                }
            },
            methods: {
                atoC() {
                    // console.log('aaaaaaaaaaaaaaaaaaaa');
                    Event.$emit('data-a', this.name)
                    // console.log('atoc success');
                }
            }
        }
        )
        var b = Vue.component(
            'data-b', {
            template: '#b',
            data() {
                return {
                    age: 20
                }
            },
            methods: {
                btoC() {
                    Event.$emit('data-b', this.age)
                }
            }
        }
        )
        var c = Vue.component(
            'data-c', {
            template: '#c',
            data() {
                return {
                    name: 'name',
                    age: 'age'
                }
            },
            mounted() {
                // console.log('@@@@@@@@@@@@@@');
                Event.$on(
                    'data-a', name => {
                        this.name = name;//箭头函数不产生新的this,这里如果不用箭头函数,this指代Event
                    }
                )
                Event.$on(
                    'data-b', age => {
                        this.age = age;
                    }
                )
            }
        }
        )
        new Vue({
            el:'#app',
            components:{
                'data-a':a,
                'data-b':b,
                'data-c':c
            }
        })

  分析:定义abc三个组件,注册一个全局的事件总线var Event = new Vue();然后a向c传值的时候通过Event调用$emit(事件名,数据)发送数据,c组件通过Event.$on(事件名,data=>{})接收数据。

  就相当于注册一个事件总线存起来,等触发事件时再调用。定义一个类去处理事件,并挂载到vue实例的this上即可注册和触发事件,也可以扩展一些事件管理。

 总结

  以上就是本文的全部内容,希望给读者带来些许的帮助和进步,方便的话点个关注,小白的成长踩坑之路会持续更新一些工作中常见的问题和技术点。

posted @ 2020-12-01 19:45  zaisy'Blog  阅读(448)  评论(0编辑  收藏  举报