单向数据流:
数据从父级组件传递给子组件,只能单向绑定。
子组件内部不能直接修改从父级传递过来的数据。
解决方法: 可以使用data将父组件传递过来的数据拷贝一份存放起来,再修改拷贝的数据就可以了
//用data来解决不能修改父组件传递的数据的问题,
// 我们新增一个number保存父组件传递过来的数据,这样就可以修改数据的值了
data:function(){
return {
number: this.count
}
},
数据就可以修改了:
methods:{
handleclick:function() {
this.number=this.number+2;
this.$emit('change',2);//子组件向父组将传递参数,触发change事件
}
}
我们使用$emit触发chang方法,在父组件的模版中监听chang方法,最后在Vue实例中调用
(1)
this.$emit('change',2);//子组件向父组将传递参数,触发change事件
(2)
<counter :count="1" @change="handleIncreae"></counter>
(3)
var vm=new Vue({ el:'#shuju', data:{ total:3 }, components:{ counter:counter }, methods:{ handleIncreae:function(step) { this.total+=step; } } })
完整代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>父子组件传值</title> <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> </head> <body> <div id="shuju" > <counter :count="2" @change="handleIncreae"></counter> <counter :count="1" @change="handleIncreae"></counter> <div>{{total}}</div> </div> <script> var counter={ props:['count'], //用data来解决不能修改父组件传递的数据的问题, // 我们新增一个number保存父组件传递过来的数据,这样就可以修改数据的值了 data:function(){ return { number: this.count } }, template:'<div @click="handleclick">{{number}}</div>', methods:{ handleclick:function() { this.number=this.number+2; this.$emit('change',2);//子组件向父组将传递参数,触发change事件 } } }; var vm=new Vue({ el:'#shuju', data:{ total:3 }, components:{ counter:counter }, methods:{ handleIncreae:function(step) { this.total+=step; } } }) </script> </body> </html>
效果: