父传子是单向的,子会因父的改变而改变,但父并不会因子的改变而改变。这是由于Vue.js怕父的数据会被使用者在不知情的情况下改变。
但是,子还是可以绕一个圈,把自己的数据传给父。
途径:自定义事件。
在解释子数据传给父之前,必须先要对事件有一个了解。
所谓事件,就是触发JS代码的“动作”,比如,点击(click),
输入(input)等等。
Vue.js 使用v-on来
监听事件,事件名被加在v-on
的后面,以这样的形式表示:v-on:click = "doFn"
,后面的doFn是事件触发的方法。
准备好了,开始传递数据吧。
首先,先定义一个组件:
//js
Vue.component('my-button',{
template:'<button v-on:click="childCount">{{counter}},</button>'
data:function(){ //组件的data只能是以函数的形式存在
return{
counter:0
}
},
methods:{
childCount:function(){
this.counter = this.counter+1;
var value = this.counter;
this.$emit('shijian',value); //value就是子要传的数据
}
}
})
var app4 = new Vue({
el:'#app4',
data:{
total:0
},
methods:{
faterCount:function(value){ //value就是父组件从子组件拿到的数据
this.total = this.total+value
}
}
})
//html
<div id="app4">
<p>{{total}}</p>
<my-button v-on:shijian="faterCount"></my-button>
</div>
这样,就完成了一次子数据传给父。
过程是这样的:
子组件<button>
被点击了,于是触发了click事件所指向的childCount
方法。
该方法有两个行为,一个是自增,另一个使用了$emit
创建一个自定义事件shijian
并且传了一个参数value
,这个事件和参数可以被父组件拿到。
于是我们看到了v-on:shijian="faterCount"
这行代码,其中,faterCount
是Vue的实例app4的方法,他的作用是让一个变量自增。同时,自定义事件shijian
带有一个来自子组件的参数,这个参数可以传给app4的任意方法。
我们可以看到,点击了一次<my-button>
(实际上是点击了他里面的子组件button
), 自定义事件就会被父捕获,从而触发指向的父的方法。
根本思路是:子抛出了一个自定义事件,并传参,让父捕获,从而执行自己的带有来自子参数的方法。
好处是:子组件和父组件解耦了。子组件只需要抛出一个事件,然后完成自己的逻辑就好,无须关心父组件的行为。
当然,你也可以不使用自定义事件,转而使用原生的事件,比如这里是click
这也是没问题的,但是要添加相应的后缀native:
v-on:click.native="faterCount
但是,这样就如何传参我还在学习当中。