一、问题:
当通过Props给子组件绑定editData对象时,直接将editData对象传递给子组件的标签,会产生父子组件数据联动问题
父组件:
<parkingLotEdit v-if="parkingLotEdit" @closeAddDialog="closeAddDialog" :editData="editData" ref="parkingLotEdit"></parkingLotEdit>
<!--给数据赋值-->
this.editData = data
子组件:
export default {
name: "ParkingLotEdit",
props: {
editData: {
type: Object,
default: {}
}
},
data() {}
<el-form-item label-width="120px" label="寻车链接参数:">
<el-input v-model="editData.searchLinkParameters" clearable></el-input>
</el-form-item>
数据联动:
二、原因分析
该方法是由于 “ = ” 传递的是data对象的内存地址,类似于指针操作,所以当它绑定在子组件标签上时,父子组件的对象指向同一个内存地址,即实际操作同一个对象,因此子组件改变的时候,父组件的值也会发生改变,即产生父子组件数据联动问题。
三、解决方法
网上可以找到解决父子组件数据联动问题的方法有几个可以参考这个地址。
我的解决方式:
1.父组件通过v-model将editData对象绑定给子组件,子组件通过props接收对象
父组件:
<parkingLotEdit v-if="parkingLotEdit" @closeAddDialog="closeAddDialog" :editData="editData" ref="parkingLotEdit"></parkingLotEdit>
子组件:
props: {
editData: {
type: Object,
default: {}
}
}
2.自组件在mouted()函数中调用初始化方法,把editData的参数值一个一个赋值给新的parkLotFrom对象
mounted() {
this.getPropertyProjectList()
},
methods: {
getPropertyProjectList() {
ListFormSelectItemApi().then(res => {
const {
id,
searchLinkParameters,
searchSystemId,
paymentLinkParameters,
parkingSystemId,
propertyProjectId,
parkingLotName
} = this.editData
this.parkLotFrom.id = id
this.parkLotFrom.searchLinkParameters = searchLinkParameters
this.parkLotFrom.searchSystemId = searchSystemId
this.parkLotFrom.paymentLinkParameters = paymentLinkParameters
this.parkLotFrom.parkingSystemId = parkingSystemId
this.parkLotFrom.propertyProjectId = propertyProjectId
this.parkLotFrom.parkingLotName = parkingLotName
})
}
3.把parkLotFrom对象绑定给子组件的标签上,此时就不会产生父子联动问题。
<el-form-item label-width="120px" label="寻车链接参数:">
<el-input v-model="parkLotFrom.searchLinkParameters" clearable></el-input>
</el-form-item>
四、遇到的坑
父组件调用子组件时候的属性v-if="parkingLotEdit"是必须的,因为赋值给子组件对象的操作是在子组件的mouted()函数中调用的,如果不使用v-if=“parkingLotEdit”,由于mouted()函数只在渲染的时候执行一次,所以只有第一次会传递参数成功。此时使用v-if会反复渲染子组件,即触发子组件mouted()函数给对象进行赋值。