唯品秀前端博客
当前位置: 前端开发 > Vue.js专区 > Vue.js中组件通信之$emit/$on(兄弟、侄叔篇)

Vue.js中组件通信之$emit/$on(兄弟、侄叔篇)

2019-06-14 分类:Vue.js专区 作者:管理员 阅读(4823) 百度已收录

可能大家对组件数据传递了解最多的就是props父子组件之间的通信,要么就是万能的Vuex,其实我们还能通过另一种方式解决组件之间数据传递,尤其是在props不能解决的兄弟组件传递数据中,又不想去按照Vuex模块

原理、流程

兄弟组件传参数据通过$emit/$on方法解决,先说下流程,让你有个基本概念。例如有两个组件A、B和根实例C在B组件中接收到A组件传过来的数据,首先开辟个新的Vue根实例,它是纯洁无瑕的,然后我们在A组件中通过$emit方式去定义一个自定义事件方法,然后B组件通过$on去接收A组件自定义的事件传过来的值,数据是从A到C,C再到B,其实这个和vuex里的{ root: true }修改兄弟模块数据非常像,果然,大道殊途同归。

首先创建一个vue的空白实例C

1
2
import Vue from 'vue'
export default new Vue()

子组件A

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<template>
    <div>
        <span>A组件->{{msg}}</span>
        <input type="button" value="把a组件数据传给b" @click ="send">
    </div>
</template>
<script>
import vmson from "../../../util/emptyVue"
// 上面就是创建的Vue实例C,其实不通过新创建实例我们也可以通过根实例来做这件事,那么用起来应该是this.$root.$emit/$on
export default {
    data(){
        return {
            msg:{
                a:'111',
                b:'222'
            }
        }
    },
    methods:{
        send:function(){
            vmson.$root.$emit("aevent",this.msg);
            //直接$emit只能向父组件传,想状态提升,必须要带上.$root
        }
    }
}
</script>

这讲的啥?这就是定义个子组件A,并且定义一个自定义事件aevent通过$emit传过去,传哪儿去了?很明显是传到我们最开始定义的那个纯洁的vue实例vmson里面去了

子组件B

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<template>
 <div>
    <span>b组件,a传的的数据为->{{msg}}</span>
 </div>
</template>
<script>
      import vmson from "../../../util/emptyVue"
      export default {
         data(){
                return {
                    msg:""
                }
            },
         mounted(){
                vmson.$root.$on("aevent",(val)=>{//监听事件aevent,回调函数要使用箭头函数;
                    console.log(val);//打印结果:我是a组件的数据
                    this.msg = val;
                })
          }
    }
</script>

这段又是嘛?这就是说同样定义一个B组件,然后通过$on方式去监听到来自vmson实例中的自定义方法aevent,到这里你是不是大致就明白了,vmson是通信桥梁,aevent就是两个组件之间通信密码,两个组件之所以能传递数据,莫过于这点小伎俩。

父组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<template>
     <div>
      <childa></childa>
      <br />
      <childb></childb>    
     </div>
</template>
<script>
   import childa from './childa.vue';
   import childb from './childb.vue';
   export default {
    components:{
        childa,
        childb
    },
    data(){
        return {
            msg:""
        }
    },
    methods:{
       
    }
   }
</script>

这段代码其实就没多少好说的,就是A、B两个组件放在父组件中去注册并渲染

小结

综合这个简单实际项目案例来充分说明Vue.js组件传参数据之$emit/$on具体用法,相信你不会比我还蠢,应该已经能基本掌握。

赞(7) 打赏

谢谢你请我吃鸡腿*^_^*

支付宝
微信
7

谢谢你请我吃鸡腿*^_^*

支付宝
微信

「梦想一旦被付诸行动,就会变得神圣,如果觉得我的文章对您有用,请帮助本站成长」

分享到:

上一篇:

下一篇:

你可能感兴趣

0 条评论关于"Vue.js中组件通信之$emit/$on(兄弟、侄叔篇)"

最新评论

    暂无留言哦~~

博客简介

一个关注Web前端开发技术、关注用户体验、坚持更多原创实战教程的个人网站,梦想一旦被付诸行动,就会变得神圣,愿景:成为宇宙中最具有代表性的前端技术类博客。主题源码 

精彩评论

友情链接

他们同样是一群网虫,却不是每天泡在网上游走在淘宝和网游之间、刷着本来就快要透支的信用卡。他们或许没有踏出国门一步,但同学却不局限在一国一校,而是遍及全球!申请交换友链

站点统计

  • 文章总数: 268 篇
  • 草稿数目: 0 篇
  • 分类数目: 16 个
  • 独立页面: 7 个
  • 评论总数: 956 条
  • 链接总数: 14 个
  • 标签总数: 471 个
  • 注册用户: 2 人
  • 访问总量: 9508526 次
  • 最近更新: 2020年10月20日
服务热线:
 173xxxx7240

 QQ在线交流

 旺旺在线