在vue中,父組件傳值給子組件通過,v-bind,眾所周知,子組件要想改變父組件傳的值,都要向父組件發送一下信號,即$emit(),但是我最近發現,有時候,子組件不emit,都可以改變父組件傳來的變量的值,哪怕把父組件傳的變量的值再賦值給另一個變量,改變該變量,也會改變父組件的對應變量的值,這是為啥呢,根據
vue 父子組件傳值 子組件修改父組件值的解決辦法中提到的,我才發現,原來
在 JavaScript 中對象和數組是引用類型,指向同一個內存空間,如果 prop 是一個對象或數組,在子組件內部改變它會影響父組件的狀態。
而我現在的需求是,在子組件改變變量的值,在父組件不會發生響應的改變,我是這樣做的
子組件
this.copyScreenList = new Array() //這樣賦值,在子組件改變值的時候,父組件不會響應改變
this.screenList.forEach(item => { //screenList為父組件傳的變量
let tempObj = {
name: item.name,
value: item.value,
choose: item.choose
}
this.copyScreenList.push(tempObj)
})
這樣就等於,新開辟了一塊內存空間,用於放子組件的數組變量,但是不能這樣做哈
this.copyScreenList = new Array() //這樣賦值,在子組件改變值的時候,父組件不會響應改變
this.screenList.forEach(item => { //screenList為父組件傳的變量
this.copyScreenList.push(item)
})
更不能這樣做
this.copyScreenList = new Array() //這樣賦值,在子組件改變值的時候,父組件不會響應改變
this.copyScreenList = this.screenList
這樣都會導致新的變量指向同一個內存空間;
對象的改變也是這個道理