组件之间传值有这么几种数据传递方式,vuex、props、eventBus和特殊的eventBus。html
我就传两个数据,vuex真是太麻烦了。用是不可能用的,理解又理解不了。vue
父子组件传值,官方api,只写个demo。vuex
父组件segmentfault
// 将事件绑定至子组件
<son :info="info" @update="updateHandler"/>
// data
info: 'sendToSon'
// methods
updateHandler (newVal) {
this.info = newVal
}
复制代码
子组件api
// props
props: ['info']
// 触发绑定在组件上的事件,向上传值,在父组件某个方法中使用
this.$emit('update', 'got')
复制代码
父向子传值-->props
子向父传值-->子组件绑定事件回调定义在父组件,子组件触发此事件。 因不推荐子组件内直接修改父组件传入的props,需使用自定义事件。bash
父子组件。架构
bus皆为导入的bus实例ide
// bus
const bus = new Vue()
// 数据接收组件
// 当前组件接收值则
bus.$on('event1', (val)=>{})
// 数据发出组件
// 当前组件发出值则
bus.$emit('event1', val)
复制代码
能够看出本质是一个vue实例充当事件绑定的媒介。 在全部实例中使用其进行数据的通讯。ui
双(多)方使用同名事件进行沟通。this
$emit
时,必须已经$on
,不然将没法监听到事件,也就是说对组件是有必定的同时存在的要求的。(注:路由切换时,新路由组件先created
,旧路由组件再destoryed
,部分状况能够分别写入这两个生命周期,见此问题)。$on
在组件销毁后不会自动解除绑定,若同一组件屡次生成则会屡次绑定事件,则会一次$emit
,屡次响应,需额外处理。$emit
后生效。 因此是否有一种更适用的方案呢?咱们先来看个代码,线上代码。
bus皆为导入的bus实例。
// bus
const bus = new Vue({
data () {
return {
// 定义数据
val1: ''
}
},
created () {
// 绑定监听
this.$on('updateData1', (val)=>{
this.val1 = val
})
}
})
复制代码
// 数据发出组件
import bus from 'xx/bus'
// 触发在bus中已经绑定好的事件
bus.$emit('update1', '123')
复制代码
// 数据接收组件
{{val1}}
// 使用computed接收数据
computed () {
val1 () {
// 依赖并返回bus中的val1
return bus.val1
}
}
复制代码
其实应该是为何不能直接添加到data上,如data1: bus.data1
?咱们能够再看一段代码,线上代码。
将bus修改成
data () {
return {
// 多一层结构
val: {
result: 0
}
}
},
created () {
this.$on('update1', val => {
console.log('触发1', i1++)
this.val.result = val
})
}
复制代码
数据接收组件改成
// template
data中获取直接修改值:{{dataResult}}
data中获取直接修改值的父层:{{dataVal}}
computed中依赖直接修改值:{{computedResult}}
// js
data () {
return {
// 获取直接修改值
dataResult: bus.val.result,
// 获取直接修改值的父层
dataVal: bus.val
}
},
computed: {
computedResult () {
// 依赖直接修改值
return bus.val.result
}
}
复制代码
能够看到,data中获取直接修改值时值的数据是没法动态响应的。
其实不用$emit
触发,使用bus.val = 1
直接赋值也是能够的,那么为何不这么作呢?
其实这种eventBus就是简化版的vuex。
vue文档中有这样一段话:
组件不容许直接修改属于 store 实例的 state,而应执行 action 来分发 (dispatch) 事件通知 store 去改变,咱们最终达成了 Flux 架构。这样约定的好处是,咱们可以记录全部 store 中发生的 state 改变。
那么能够用vuex中store
对应bus
实例,state
对应data
,action
对应事件
,dispatch
对应$emit
。 同时vuex中组件获取数据的方式正是经过计算属性,那么其实vuex和Flux架构的理解和使用也没有那么难。