可能大家对组件数据传递了解最多的就是props父子组件之间的通信,要么就是万能的Vuex,其实我们还能通过另一种方式解决组件之间数据传递,尤其是在props不能解决的兄弟组件传递数据中,又不想去按照Vuex模块
兄弟组件传参数据通过$emit/$on方法解决,先说下流程,让你有个基本概念。例如有两个组件A、B和根实例C在B组件中接收到A组件传过来的数据,首先开辟个新的Vue根实例,它是纯洁无瑕的,然后我们在A组件中通过$emit方式去定义一个自定义事件方法,然后B组件通过$on去接收A组件自定义的事件传过来的值,数据是从A到C,C再到B,其实这个和vuex里的{ root: true }修改兄弟模块数据非常像,果然,大道殊途同归。
1 2 | import Vue from 'vue' export default new Vue() |
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里面去了
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具体用法,相信你不会比我还蠢,应该已经能基本掌握。
下一篇:如何将网站接入百度云加速-免费CDN、网站攻击防护、SEO优化工具
支付宝扫一扫打赏
微信扫一扫打赏
共 0 条评论关于"Vue.js中组件通信之$emit/$on(兄弟、侄叔篇)"
最新评论