需要实现点击Derrick的时候显示Jessica,点击Jessica的时候显示Derrick,这时候便需要两个非父子组件之间传递值
<body> <div id="app"> <child content="Derrick"></child> <child content="Jessica"></child> </div> </body> <script> Vue.component('child',{ props:{ content:String }, template:'<div>{{content}}</div>', }) var vm = new Vue({ el:"#app", }) </script>在生成vue实例前,给Vue的原型上添加一个bus属性,这个属性是vue的实例,之后创建的vue实例都具有bus这个属性
Vue.prototype.bus = new Vue()实例上挂载的bus,每个实例都有bus属性,bus又是vue的实例,所以支持$emit,通过这个方法向外触发事件
this.bus.$emit('change',this.selfContent)利用钩子函数绑定监听事件,因为this的指向发生了变化,不用箭头函数的话就要先把this保存起来,监听bus触发的事件,会触发两次,因为上面两个组件都会进行监听
mounted:function(){ //function里面作用域变化 var this_= this //监听bus触发的事件,会触发两次,因为上面两个组件都会进行监听 this.bus.$on('change',function(msg){ this_.selfContent = msg }) }整体代码如下:
<body> <div id="app"> <child content="Derrick"></child> <child content="Jessica"></child> </div> </body> <script> //把prototype挂载的bus属性指向Vue的实例 Vue.prototype.bus = new Vue() Vue.component('child',{ data:function(){ return { //单项传值,避免下面修改父组件的传值 selfContent:this.content } }, props:{ content:String }, template:'<div @click="handleClick">{{selfContent}}</div>', methods:{ handleClick:function(){ //实例上挂载的bus,每个实例都有bus属性,bus又是vue的实例,所以支持$emit //通过这个方法向外触发事件 this.bus.$emit('change',this.selfContent) } }, //钩子 mounted:function(){ //function里面作用域变化 var this_= this //监听bus触发的事件,会触发两次,因为上面两个组件都会进行监听 this.bus.$on('change',function(msg){ this_.selfContent = msg }) } }) var vm = new Vue({ el:"#app", }) </script>