javascript - 无法设置更新对象属性的状态
问题描述
我有一个处理程序,旨在更新我的“选定”数组状态的“数量”属性。对于不同的项目,我有多个字段,用户必须更新其数量。但是,当我尝试更新状态时,我发现已达到最大深度。当我使用console.log 时,不知何故我收到了超过1000 个处理程序的调用。也许有人可以指导我做错了什么。这是代码:
{
this.state.purchase.selected.map(item => {
return (
<Grid item xs={4}>
<OrderItemsCard
item={item}
onChange={this.handleSelectedItemChange(item)} />
</Grid>
)
})
}
this.state = {
purchase: {
selected: [],
comments: ''
},
}
this.state.purchase.selected = []
for (let i = 0; i <= data.length - 1; i++) {
for (let j = 0; j <= items.length - 1; j++) {
if (this.props.data[i] === this.props.items[j]._id) {
this.state.purchase.selected.push(this.props.items[j])
}
}
}
handleSelectedItemChange = (item) => {
let selected = Object.assign([], this.state.purchase.selected)
selected.forEach(selectedItem => {
selectedItem.quantity = item.quantity
})
this.setState({selected})
}
解决方案
代替:
onChange={this.handleSelectedItemChange(item)}
它直接调用处理程序并将其结果作为事件处理程序传递,您想要传递一个函数:
onChange={() => this.handleSelectedItemChange(item)}
而不是浅拷贝:
let selected = Object.assign([], this.state.purchase.selected)
你想在那里深拷贝:
let selected = this.state.purchase.selected.map(selected => {...selected});
推荐阅读
- sql - 如何在 oracle apex 中实现 APP_USER 变量
- c - 遍历缓冲区设计问题
- angular - 如何在 debounceTime 中调用函数
- javascript - 单击时添加事件侦听器但立即运行?
- javascript - 通知同意未保存
- artificial-intelligence - 如何从 COCO 数据集中过滤类?
- java - Firebase 推送通知云消息传递如何访问附加数据作为通知
- octobercms - 如何配置 octobercms 插件设置?
- java - 在 JsonArray 中插入新元素
- javascript - 将表单数据发送到 firebase 函数