实现非父子组件之间的通信,有以下几种方式
Bus总线。创建一个空的Vue对象作为Bus中央事件总线(中间组件)。
vuex(适合大型项目,小项目效果不明显)
provide/inject(同根往下派发)
本地存储
第一种是最常用的,此处只介绍第一种。
bus总线实现非父子组件之间的通信
<div id="app">div> <script>// 创建一个空的Vue对象作为bus中央事件总线 Vue.prototype.$bus=new Vue(); Vue.component('MyHeader',{ template:`<div><p>this is the header area</p><button @click="send">向body传递数据</button> </div> `, methods:{ send(){ //可带参数this.$bus.$emit("received","hello") //触发一个自定义事件,该事件可以携带0、1、多个数据。事件、数据都放在bus总线中 } } }) Vue.component('MyBody',{ template:`<div><p>this is the body area</p><p>来自header的数据:{{msg}}</p> </div> `, data(){return{ msg:''} }, created(){ //在created(){}中写监听//写法一//var self=this; //直接用this没效果,需要把this赋给一个临时变量,使用临时变量代替this//在bus总线中注册一个事件监听,当指定的事件发生时会调用对应的函数//self.$bus.$on('received',function(val){ //此处使用匿名函数// self.msg=val; //});//写法二this.$bus.$on('received',val=>{ //使用ES6的箭头函数,这种方式可以直接使用this。更简洁,推荐。this.msg=val; }) } }) new Vue({ el:'#app', template:`<div><my-header></my-header><my-body></my-body></div> `, }); script>
说明
第一种写法原本是这样的:
this.$bus.$on('received',function(val){ this.msg=val; });
我们想要的是2个this都应该是指向当前组件的,这样this.msg才能获取到当前组件的msg变量。
但实际上,第二个this(函数体中的那个this),指向的bus总线,this.$bus 当前对象已经变成了bus总线,所以要借助一个临时变量。
第二种写法:
箭头函数不改变作用域,2个this都是指向当前组件,可以直接使用this。
Copyright © 2004-2024 Ynicp.com 版权所有 法律顾问:建纬(昆明)律师事务所 昆明市网翼通科技有限公司 滇ICP备08002592号-4