Vue组件传值

172 阅读2分钟

我们将Vue中的组件传值分为三种:

  • 父组件传值给子组件
  • 子组件传值给父组件
  • 平级组件传值(理解为兄弟组件传值吧)

一、父组件传值给子组件

在父组件中给子组件绑定自定义属性,属性值为所要传递的值。子组件通过props来接收属性

<my-son :pmsg='message'> </my-son> 
...data(){return { message:111 }}


//子组件
data(){return {}},
props:['pmsg']

注意嗷,props接收的属性数值,不要改变嗷。

非要改变的话,拷贝一份到子组件自己的data中去,在去修改,记住如果 父组件 传递的是像 对象 这种引用类型的数据,要进行深拷贝,因为引用类型的数据,普通拷贝在修改时候,父组件同样的数据也会跟着改变。但是深度拷贝不会改变父组件中同样的数据。

lodash进行深拷贝


二、子组件传值给父组件

	// 父组件 注册事件和事件处理函数, 并把 事件绑定给子组件。
	// 子组件 通过 $emit 调用事件 给 事件处理函数 传值
	// 父组件就拿到了 子组件传递的值

要收到值的一方要注册事件和事件处理函数----------@pmsg='test'(事件名字和事件处理函数名字随便取哈~) 父

要发送值的一方要调用注册事件并传值--------$emit 子


这是父组件的,其中pmsg是注册的事件。testpmsg的处理函数,当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传给 弟弟 的事件处理函数。这样弟弟就拿到了哥哥传递的数据。