vue之父子组件之间的通信(传值)

vue.js之父子组件之间的通信(传值)

vue 中,组件与组件之间是可以互相通信的,但是与传统的 Java 不同,vue 中的子组件没有继承这一说,所以和Java中类与类之间的传值可以说没有任何关系。组件之间的通信包括父子组件之间、兄弟组件之间等等,都可以互相通信,因为兄弟组件之间的传值是子组件传给父组件,再由父组件传给另一个子组件,因此下面只讨论父子组件之间通信问题。

子组件获取父组件数据

vue 中,组件实例的作用域是孤立的,默认情况下,父子组件的数据是不能共享的,也就是说,子组件是不能直接访问父组件的数据的。为此,vue 给我们提供了一个数据传递的选项 prop,用来将父组件的数据传递给子组件。具体操作如下:

<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8" />
	<title>父组件传给子组件</title>
	<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>

<body>
	<div id="wrapper">
		<aaa></aaa>
	</div>

	<script type="text/javascript">
		let vm = new Vue({
			el: "#wrapper",
			components: {
				aaa: {
					//父组件
					template: `	<div>
									<h3>这是父组件组件的显示:{{str}}</h3>
									<br />
									<subcom v-bind:abc="str"></subcom> 
									<hr />
								</div>`, //自定义属性'abc'

					components: {
						//子组件
						subcom: {
							template: `<h5>这是子组件显示的内容:{{abc}}</h5>`,
							props: ["abc"], //自定义属性'abc'
						},
					},

					data() {
						return {
							str: "hello world!",
						};
					},
				},
			},
		});
	</script>
</body>

</html>

上面实例中,子组件获取父组件传递的数据的步骤为:

  1. 在子组件标签中,声明 abc 属性,属性值即为父组件向子组件传递的值。
  2. 在子组件中,使用 props 选项,声明接收父组件向子组件传递值的载体,即 abc
  3. 子组件中就可以使用 abc 获取父组件向子组件传递的值了。

父组件获取子组件数据

和上面不一样的是,父组件想要获取子组件的数据时,需要经过子组件的同意,数据不是你想要,想要就能要…咳,需要子组件通过 vue 提供的 emit 方法,主动将自己的数据发送给父组件。具体操作如下:

<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<title>子组件传给父组件</title>
	<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>

<body>
	<div id="wrapper">
		<aaa></aaa>
	</div>

	<script type="text/javascript">
		let vm = new Vue({
			el: '#wrapper',
			components: {
				aaa: {
					//父组件  当然你也可以写在html的<template>标签里
					template: `	<div>
								<h3>这是父组件组件的显示:{{str}}</h3><br />
								<subcom @abc='get'></subcom>
								<hr />
								</div>`, //自定义事件'abc'
					components: {
						subcom: {
							//子组件
							template: `	<div>
										<h5>这是子组件显示的内容:{{str}}</h5>
										<button @click="send">点我发送数据给父组件</button>
										</div>`,
							data() {
								return {
									str: 'hello world!'
								}
							},
							methods: {
								send() {
                                    //通过emit主动将自己的数据发送给父组件。
									this.$emit('abc', this.str); 
								}
							}
						}
					},

					data() {
						return {
							str: ''
						}
					},
					methods: {
						get(value) {
							this.str = value;
						}
					}
				}
			}
		})
	</script>
</body>

</html>

上面实例中,子组件获取父组件传递的数据的步骤为:

  1. 在子组件中触发一个主动发送数据的事件,上面的例子中是一个点击事件send
  2. 在点击事件中使用emit方法,这个emit接收两个参数:传递数据的事件和需要传递的数据,这个传递数据的事件也是自定义的;
  3. 在父组件中引用子组件,并在引用的子组件中使用on监听上一步传递数据的事件,上面的例子中是 abc;
  4. 在父组件中使用这个事件,这个事件带有一个参数,就是从子组件发送过来的数据。

你学废了吗?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅小伙er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值