2017-01-02 59 views
0

這是我的問題。推送功能改變道具反應

當我使用push()函數時,它會改變我的道具反應。

const prioship = (this.props.orders.prioshipping === false ? {'name':`Regular Shipping`,'price':'0','currency':'EUR','quantity':1, 'description': ''} : {'name':`Priority Shipping`,'price': this.props.prices.shipping['A'].toString() ,'currency':'EUR','quantity':1, 'description': ''}) 
console.log('#### TOKEN ORDER #####1', this.props.orders.warenkorb) 
const orders = this.props.orders.warenkorb 
const order2 = this.props.orders.warenkorb 

orders.push(prioship) 
console.log('#### TOKEN ORDER #####2',order2, this.props.orders.warenkorb) 

因此,即使在控制檯日誌的級別「TOKEN令1」這個道具在它的「prioship」即使在後面的代碼發生。我不明白如何使它停止。我只想要一個變量'訂單',其中有prioship,我不想讓我的道具改變。

請幫忙

回答

1

不要改變你在這裏做的道具。

改爲創建一個新數組,而不要修改原始數組。

const orders = this.props.orders.warenkorb.concat(prioship); 

Array.push()「改變」(改變/修改)原始數組。 Array.concat()返回一個新數組,並且不會修改原始數組。

1

正如Andy Ray所說,不要直接改變道具。

正確的方法是使用const orders = this.props.orders.warenkorb.slice(),它會給你一個道具中數組的副本,並允許你稍後使用這個數組而不用改變原來的道具。

最後,你的第一個console.log('#### TOKEN ORDER #####1', this.props.orders.warenkorb)顯示你後面的值的原因是因爲控制檯將通過引用顯示值。如果你想在你打印的地方得到確切的價值,你可以使用:console.log('#### TOKEN ORDER #####1', JSON.stringify(this.props.orders.warenkorb));

1

這裏發生了兩件事情。

首先你要修改對象中的道具。即使您將該屬性保存在另一個變量中,您所做的只是保存對該屬性的引用。如果你想避免這種情況,你可以像Andy Ray指出的那樣使用concat。

第二件事。即使在TOKEN ORDER 1中你也看到了變化,因爲console.log可能有點棘手。由於對象存儲對其屬性的引用,因此如果稍後更改對象,它將顯示最新的更新。 More on this here.