vue是组件式开发,所以组件间通讯是必不可少的。vue提供了一种方式,即在子组件定义props来传递父组件的数据对象。
// 父组件
<v-header :seller="seller"></v-header>
// 子组件 header.vue
props: {
seller: {
type: Object
}
}
如果是子组件想传递数据给父组件,需要派发自定义事件,使用$emit派发,
父组件使用v-on
接收监控(v-on可以简写成@)
// 子组件 RatingSelect.vue,派发自定义事件isContent,将this.onlyContent数据传给父级
this.$emit('isContent', this.onlyContent);
this.$emit('selRatings', this.selectType);
// 父组件 foodInfo.vue 在子组件的模板标签里,使用v-on监控isContent传过来的数据
<v-ratingselect :ratings="food.ratings" :select-type="selectType" :only-content="onlyContent" :desc="desc" @selRatings="filterRatings" @isContent="iscontent"></v-ratingselect>
非父子组件之间通信,vue官方锐减使用vueX,但是这里相较简单,所以采用的是利用给一个空实例eventHub,作为两个组件的中央数据总线,使用this.$root.eventHub.$emit
来派发自定义事件,使用this.$root.eventHub.$on
来监控
这里特别说明$root
,官方解释:表示当前组建树的根实例,如果根实例没有父实例,次实例将会是自己
//main.js
new Vue({
// el: '#app',
router,
template: '<App/>',
components: {
App
},
data: {
eventHub: new Vue() // 给data添加一个 名字为eventHub 的空vue实例,用来传输非父子组件的数据
}
}).$mount('#app'); // 手动挂载,#app
//foodInfo.vue组件派发自定义事件cart.add,传递信息event.target
this.$root.eventHub.$emit('cart.add', event.target); // 传输点击的目标元素
//Shopcart.vue组件监控cart.add
created() {
// 获取按钮组件的点击的元素,用在drop方法里
this.$root.eventHub.$on('cart.add', this.drop);
},
methods:{
drop(element){
//to do ...
}
}