vue 组件间的通信

前言:
最近做了购物车模块,对于组件的使用以及组件间的通信进行了摸索。实现了购物车全选、数量选择,总价计算。

总结:
一、由于vue遵循单项数据流,因此子组件是不允许修改父组件的属性,有可能报错如下:
[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "result" (found in component )
解决方法:
1. 父组件:
<carTemplate name= "carTemplate" v-bind:carItem=" carItem" v-bind:carIndex=" index"
v-bind:carInfo=" carInfo" v-on:carMethod=" carChange( $event)" ></ carTemplate >
methods: {
carChange( msg){ //获取子组件传过来的数据
this. carInfo = msg;
}
}

子组件:
< img src= '/static/assets/icon/chooseGreen.png' class= 'icon-choose' @click=' chooseAll()' v-if=' all' >
methods: {
chooseAll () {
this. copyAll = ! this. all;
this. $emit( 'allChoosed', this. copyAll); //将数据传给父组件
}
}

2.这种方法我没有试过
Vue 2.3.0已回归sync修饰符。子组件想要更改父组件传入的属性,必须显式的update那个值:this.$emit('update: AttrFromParent', someVal);

二、对象不能简单被watch监听,必须深度
watch: {
carInfo:{
handler ( newValue){
var allCar = 0;
var all = false;
var allPrice = 0;
for ( var i = 0; i < newValue. length; i++) {
if ( newValue[ i]. checked== true){
allCar++;
allPrice = newValue[ i]. price * newValue[ i]. num + allPrice;
}
}
if ( allCar == newValue. length) {
all = true;
}
this. all = all;
this. allPrice = allPrice;
},
deep: true //深度
}
},

三、改变子组件中从父组件获取的数据,如果是对象或者数组。
注意在 JavaScript 中对象和数组是引用类型,指向同一个内存空间,如果 prop 是一个对象或数组,在子组件内部改变它 会影响 父组件的状态。

四、Vue 不能检测到对象属性的添加或删除。
Vue不能直接在对象上添加或删除属性,必须使用Vue.set(Object,key,value)这种方式来添加属性
chooseGood () {
var carItem = this. carItem;
var checked = this. carItem. checked? false: true;
this. $set( this. carItem, 'checked', checked); //添加属性
},

















猜你喜欢

转载自blog.csdn.net/qq_32439381/article/details/79454392