2020/08/02 组件间的数据交互

目录

 

一,子组件向父组件传值

 二,兄弟组件之间的交互


一,子组件向父组件传值

上篇说到,子组件直接通过props来拿到父组件的数据,再在数据上添加新数据,实现了子组件向父组件传值,但是这是不被推荐的vue组件间数据传递

上篇也提到想用父组件的方法,可通过$emit()触发,还可以带参数,那不就可以通过参数来让父组件获取子组件的数据吗?,利用参数将子组件的数据传递过去,就可以实现父组件获取子组件的数据

<body>
    <div id="app">
        <com1 :arr='arr' @aaa='hand'></com1>
    </div>
    <template id="com1">
        <div>
            <ul>
                <li v-for='(item,i) in arr' :key='i'>{{item}}</li>
            </ul>
            <button @click="add">添加</button>
        </div>
    </template>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            arr: ["aa", 'bb']
        },
        methods: {
            hand(item) {
                this.arr.push(item)
            }
        },
        components: {
            com1: {
                template: '#com1',
                props: ['arr'],
                methods: {
                    add() {
                        this.$emit('aaa', this.sonmsg)
                    }
                },
                data() {
                    return {
                        sonmsg: "子组件调用show方法传递过去的数据",
                    }
                }
            },

        }
    })
</script>

 二,兄弟组件之间的交互

  1. 通过事件中心来完成触发与监听 组件A,B分别通过设置自己的监听函数,和触发事件
  2. 如下面例子 先new一个vue实列对象作为事件中心,
  3. son1组件通过hub.$on()  来设置自己的监听事件,val 就是兄弟组件触发改监听函数传递过来的值
  4. son1组件设置触发事件 通过hub.$emit() 第一个参数是兄弟组件的名,后面参数是要传递给兄弟组件的数据
  5. 注意是用hub这个事件中心调用 要与父子组件的中使用this.$emit()区别开来
  6. 既然可以接收兄弟组件的的参数,那就实现了,可以使用兄弟组件数据以及方法
  7. 注销事件 hub.$off("绑定的事件名") 就可以销毁事件 

<body>
    <div id="app">
        <button @click="del">销毁事件</button>
        <son1></son1>
        <son2></son2>
    </div>

</body>
<script>
    var hub = new Vue(); //提供事件中心来监听事件
    Vue.component("son1", {
        data() {
            return {
                num: 1,
                aa: 88,
            }
        },
        template: `
        <div>son1 :<button @click="fun">加son2</button>----------{{num}}</div>
        `,
        methods: {
            fun() {
                //来触发对方的监听事件
                hub.$emit("son2-event", this.num, this.aa); //触发对方的监听事件,并将2带过去
            }
        },
        mounted() {
            //数据已经挂载到页面上去了  可以监听事件
            //事件监听
            hub.$on("son1-event", val => {
                //val 是兄弟组件传递过来的数据
                this.num += val;
            })
        }
    });

    Vue.component("son2", {
        data() {
            return {
                num: 1,
            }
        },
        template: `
        <div>son2:<button @click="fun">加son1</button>----------{{num}}</div>
        `,
        methods: {
            fun() {
                hub.$emit("son1-event", this.num); //触发对方的监听事件,并将1带过去
            }
        },
        mounted() {
            //数据已经挂载到页面上去了  可以监听事件
            //事件监听
            hub.$on("son2-event", (val, aa) => { //可以接收多个参数
                //val 是兄弟组件传递过来的数据
                this.num += val;
                console.log(aa);
            })
        }
    });
    var vm = new Vue({
        el: '#app',
        data: {

        },
        methods: {
            del() {
                hub.$off('son1-event');
                hub.$off("son2-event")
            }
        },
        components: {

        },


    })
</script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太想进步了

新人菜鸡一枚,相互学习进步啊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值