我们将Vue中的组件传值分为三种:
- 父组件传值给子组件
- 子组件传值给父组件
- 平级组件传值(理解为兄弟组件传值吧)
一、父组件传值给子组件
在父组件中给子组件绑定自定义属性,属性值为所要传递的值。子组件通过props来接收属性
<my-son :pmsg='message'> </my-son>
...data(){return { message:111 }}
//子组件
data(){return {}},
props:['pmsg']
注意嗷,props接收的属性数值,不要改变嗷。
非要改变的话,拷贝一份到子组件自己的data中去,在去修改,记住如果 父组件 传递的是像 对象 这种引用类型的数据,要进行深拷贝,因为引用类型的数据,普通拷贝在修改时候,父组件同样的数据也会跟着改变。但是深度拷贝不会改变父组件中同样的数据。
用 lodash进行深拷贝
二、子组件传值给父组件
// 父组件 注册事件和事件处理函数, 并把 事件绑定给子组件。
// 子组件 通过 $emit 调用事件 给 事件处理函数 传值
// 父组件就拿到了 子组件传递的值
要收到值的一方要注册事件和事件处理函数----------@pmsg='test'(事件名字和事件处理函数名字随便取哈~) 父
要发送值的一方要调用注册事件并传值--------$emit 子
这是父组件的,其中pmsg是注册的事件。test是pmsg的处理函数,当pmsg被使用的时候就调用test这个函数
下面来看子组件的
data(){
return{
message:111
}
},
methods:{
add(){
this.$emit('pmsg',this.message) //vue实例有 $emit 方法来 调用 事件。有$on 来注册事件
}
}
子组件使用**$emit方法,来调用父组件注册的事件,第一个参数pmsg**是父组件注册的事件,第二个参数this.message是子组件要传给父组件的值,this.message传给上面事件处理函数的 value。这样父组件就拿到子组件的值啦
三、兄弟组件传值
兄弟组件传值其实跟上面子传父差不多,多了一个 js 文件罢了。叫这个 js文件为 bus ,哥哥要给弟弟的值交给bus,bus运输给 弟弟 ,既然是要 bus 那就双方都要有bus的信息咯
要收到值的一方要注册事件和事件处理函数 ------弟弟 $on
要发送值的一方要调用注册事件并传值-------------哥哥 $emit
先来看看bus.js的。要知道 $on和$emit是要 Vue实例才可用的,所以bus.js 导出一个 Vue 实例
再来看弟弟的
显然弟弟拿到 bus 导出的vue实例 用 $on 方法注册了一个叫 pInfo 的事件 还有 pInfo 的事件处理函数,data就是事件处理函数收到数值的参数,拿到这个data后呢,想干啥就干啥,这里是赋值给自己data中message
再来看看哥哥的
哥哥拿到bus导出的vue实例用 $emit 方法调用事件 pInfo ,在把自己data中的message传给 弟弟 的事件处理函数。这样弟弟就拿到了哥哥传递的数据。