官方教程里有分别介绍父子组件之间的传值方式,其中父组件向子组件传值方式是通过子组件的props属性接收数据完成,父组件模板内向子组件标签绑定的一个属性传值,然后再在子组件构造器内通过props接收这个属性。而子组件向父组件传值则是通过子组件emit(向父组件弹射通知)向父组件发出一个事件通知,告诉父组件,我这有个事情会发生的并且会带一些数据,父组件则在父组件的模板内on(监听这个事件)事件,并且针对这个事件针对性绑定一个父组件自己的方法(处理函数),这个函数就是用来对传递过来的数据进行处理的。
而兄弟组件之间的传值,其实是将父子传值的一些特点进行了结合,子组件之一将数据给到BUS,这个BUS在给到子组件之二。在不使用vuex的前提下,用到了一个第三方BUS:兄弟组件共同使用的一个插件(模块),这个Bus组件也是一个Vue实例对象。具体操作如下(SFC模式下):
-
首先实例化这个Bus
import Vue from 'vue' export default new Vue()
将上面的代码写入一个文件,不如bus.js
2. 分别在子组件内引入这个模块,路径请根据实际情况配置
import Bus from '@/plugins/bus.js'
3.这一步就是分别写哪个组件发送数据,哪个组件接收数据了。
发送数据方,一定是某个动作引发数据发送:
//sender: <template> <div class="sender"> ... <!-- fromSender 参数代表需要传递出去的值 --> <button @click="passDataToSbling(fromSender)"></button> </div> </template> <script> import Bus from '@/plugins/bus.js' .... methods:{ // fromSender 参数代表需要传递出去的值 passDataToSbling:function(fromSender){ // send 这里是string类型的,表示触发的事件,名称自定义,必须和接受方的名字一致。 Bus.$emit('send',fromSender) } } </script>
核心部分是
Bus.$emit(自定义事件名称,数据)
然后是另外一个兄弟组件去接收这个数据,然后进行后面的处理:
//accepter: <template> <div class="accepter"> ... </div> </template> <script> import Bus from '@/plugins/bus.js' .... created:function { // 这个组件的生命周期内接受到数据,然后处理 // send 字符串类型 是自定义事件名称必须和发送方的一致 Bus.$on('send',function(fromSender){ //这里对fromSender这个数据进行处理 }) } </script>
核心部分是
Bus.$on(自定义事件名称,匿名方法)
匿名方法的参数是fromSender,这个方法会处理这个参数。