2017-01-02 95 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.