Vue入门—父子组件的数据传递

Vue—父子组件的数据传递

最近在学习Vue,还是个小白入门级,这也是我学习完的笔记吧,有描述不当,希望指正。
好了,下面跟我一起学习吧。

我学习的这节课,它是以计数器counter来讲解,父子组件的数据传递

首先最原先的创建的基础代码如下,有一个父组件

<body>
		<div id="root"></div>
		<script>
			var vm = new Vue({
				el:'#root'
			})
		</script>
</body>

之后我们在其基础上创建一个叫counter的子组件,并在父组件中使用这个子组件,由于它是一个局部组件,所以我们需要通过注册这个组件,写一个对象counter。之后我们在父组件的模板里面使用这个counter

<body>
		<div id="root">
			<counter></counter>
			<counter></counter>
		</div>
		<script>
		    var counter = {
		    template: '<div>0</div>',
			}
			var vm = new Vue({
				el:'#root',
				components:{
					counter:counter    
				}
				
			})
		</script>
</body>

输出结果 为 0 0

父组件通过属性来像子组件传值

<counter :count="3"></counter>
<counter :count="2"></counter>

这里说明一下

:count=“3”此时的3表示的是一个数字
count=“3”此时的3表示的是一个字符串
这里是因为,当你前面加了:,此时“”里面的则是一个js的表达式,数字类型

子组件接受:

props: ['count'],

此时我们可以在子组件的模板里面接受,使用这个count值

template: '<div>{{count}}</div>',

此时我们可以在页面输出结果为 3 2

之后我们来完成一下,这个计数器,子组件累加部分,实验累加,首先我们在count数据上绑定点击事件,

template: '<div @click="handleClick">{{number}}</div>',

当然我们也要写上它实现的方法,既然要实现累加,用以下的方法this.count ++,可以吗?

methods: {
					handleClick:function(){
						this.count ++	
					}
				}

当你运行在页面后,确实是可以实现点击数字累加的效果,但是当我们打开控制台,Vue此时会报一个警告,告诉我们不能直接修改父组件传递过来的数据

在Vue中,有一个单向数据流的说法,,也就是,父组件可以向子组件传递参数,通过属性的方式传值,而且传递的参数也可以随便修改,这个没有问题。但是子组件绝对不能反过来修改父组件传递过来的这个数据。

之所以Vue中有这个单向数据流,是因为一旦子组件接收的数据不是一个基础类型的数据,而是类似于一个对象类型的数据,这样的话,如果你在子组件里改变了这个对象的数据,但同时这个对象还被其他的子组件使用,这样的话,你的这个子组件改的数据,不仅仅会影响你这个子组件,同时还会影响其他的子组件。

但是在我们这里,我是需要改变子组件的数据,当然也是有方法。
此时我们需要在子组件中写一个data,而这个data里面是一个函数,返回一个对象

data: function(){
					return {
						number:this.count
					}
				},

也就是我从父组件里面传过来的数据count,我把它复制一份放在我子组件的data里面
同时我们下面使用的均为number

var counter = {
				props: ['count'],
				data: function(){
					return {
						number:this.count
					}
				},
				template: '<div @click="handleClick">{{number}}</div>',
				methods: {
					handleClick:function(){
						this.number ++
						
					}
				}
			}

到页面刷新,我们可以实现点击数字累加,同时控制台也不会报错 到这里我们完成了两个点击后可以累加的数字,但是我们还要实现的是,能求出它们的和,所以继续吧。
接下来我们是学习子组件如何向父组件传值。

首先在父组件中,我们展示一个div,里面展示的total表示的是前面两个count的和

<div>{{total}}</div>

所以我们需要定义Vue的根实例中的data(在上面在子组件中的data我们使用的是函数,在这里我们可以直接定义)

data: {
			total: 5
	},

可是如果这样,我们会发现,total数据被写死了,但是我们的count是变化的(数据冗余)
我们需要子组件在改变数据的时候,向父组件传递内容,这里我们通过事件的形式来进行传值。
在子组件数据被点击的时候,我们通过this.$emit(‘change’,1)来触发一个change事件,同时它后面携参数.例子如下:
数加一

methods: {
					handleClick:function(){
						this.number ++;
						this.$emit('change',1)
						
					}
				}

数加2

methods: {
					handleClick:function(){
						this.number = this.number + 2;
						this.$emit('change',2)
						
					}
				}

到这里,子组件已经通过事件触发的方式完成了向外触发,父组件则可以实现监听子组件传递过来的事件(change是一个事件名字,你可以自取)

<div id="root">
			<counter :count="3" @change="handleIncrease"></counter>
			<counter :count="2" @change="handleIncrease"></counter>
			<div>{{total}}</div>
		</div>

当change事件被触发,则执行handleIncrease方法
定义方法(根实例中)

methods:{
					handleIncrease: function(step){
						this.total += step
					}
				}

进行到这里,我们到页面刷新,既可以实现点击count累加,同时我们的total 也会随count的改变而改变。

代码不难,只是正在学习,想记录一下。
你也可以尝试一下哦。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>父子组件的数据传递</title>
		<script src="./vue.js"></script>
	</head>
	<body>
		<div id="root">
			<counter :count="3" @inc="handleIncrease"></counter>
			<counter :count="2" @inc="handleIncrease"></counter>
			<div>{{total}}</div>
		</div>
		
		<script>
			var counter = {
				props: ['count'],
				data: function(){
					return {
						number:this.count
					}
				},
				template: '<div @click="handleClick">{{number}}</div>',
				methods: {
					handleClick:function(){
						this.number = this.number + 2;
						this.$emit('inc',2)
						
					}
				}
			}
			
			
			var vm = new Vue({
				el:'#root',
				data: {
					total: 5
				},
				components:{
					counter:counter    
				},
				methods:{
					handleIncrease: function(step){
						this.total += step
					}
				}
			})
		</script>
	</body>
</html>

下次再见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值