8-4-vue组件间通信
父子组件的通信(通讯) (组件的通信 是vue核心之一) 组件是vue的核心,组件的通信是vue的核心的核心。
通信:数据的“动态的实时的”传递。
通信(访问)--- 一定是 能 拿到 对方的 东西(数据中心的数据,方法中心的方法,计算属性等等)。
vue组件之间通信的8种方式
对于vue来说,组件之间的消息传递是非常重要的,下面是我对组件之间消息传递的常用方式的总结。
(1)$parent($root)和$children($refs和ref)
(2)props和$emit(常用)
(3)中央事件总线(非父子组件间通信)
(4)v-model
(5)provide和inject
(6)$attrs和$listeners
(7)vuex
(8)boradcast和dispatch(vue1.0中提供了这种方式,但vue2.0中没有)
一、$parent和$children ----------------------------------------------------------------------
二、props和$emit(常用) -----------------------------------------------------------------------
三、中央事件总线(非父子组件间通信) --------------------------------------------------------
非父子组件间通信
通过一个"空的vue实例"来进行值传递
组件1--- $emit()---空vue实例---$on---组件2
创建一个空实例(bus中央事件总线,或者叫中间组件)
利用$emit $on的触发和监听事件 实现非父子组件的通信
方法1:
在vue行挂载一个$bus作为中央处理组件
Vue.prototype.$bus = new Vue();
触发自定义事件传递数据
this.$bus.$emit('自定义事件名','传递的数据')
监听自定义事件获取数据
this.$bus.$on('自定义事件名',function(data){
//data接收的数据
})
----
方法2:
var bus = new Vue();
bus.$emit('自定义事件名','传递的数据')
bus.$on('自定义事件名',fn)
例如:
<div id="app"> <my-btn></my-btn> <my-count></my-count> </div> <template id="mybtn"> <div> <p>我是myBtn组件</p> <p> <button @click="addCount">点击,计算</button> </p> </div> </template> <template id="mycount"> <div> <p>我是mycount组件</p> <h1>{{number}}</h1> </div> </template> <script src="js/vue.js"></script> <script> // 非父子组件通信 // 大前提: // 空组件(空vue实例)----中间组件 let bus = new Vue(); // 组件A let myBtn = { data:function(){ return { num:10 } }, template:'#mybtn', methods:{ addCount:function(){ bus.$emit('add',this.num); } } } // 组件B let myCount = { data:function(){ return { number:0 } }, template:'#mycount', mounted:function(){ let _self = this; bus.$on('add',function(data){ _self.number += data; console.log(_self.number); }) } } // 根实例 (根组件) let vm = new Vue({ el:'#app', data:{ }, components:{ myBtn, myCount } }) </script>
预览效果,如下所示:
还没有留言,还不快点抢沙发?