2 回答
TA贡献1802条经验 获得超5个赞
问题
您没有正确地为状态和反应协调创建新的数组引用。
您还改变了模板引用对象。
代码
createInvoice = idx => {
let newUserData = this.state.userData; // <-- saved state reference
let template = UsersJSON[0].invoices[0];
template.invoiceID = idx + 1; // <-- template mutation
newUserData.invoices.push(template); // <-- mutated state
this.setState({
userData: newUserData // <-- saved state reference back into state
});
}
解决方案
创建您打算更新的所有状态的浅表副本。
createInvoice = idx => {
let newInvoices = [...this.state.userData.invoices]; // <-- create a new array reference
let template = {
...UsersJSON[0].invoices[0], // <-- create new template object reference
};
template.invoiceID = idx + 1;
newInvoices.push(template);
this.setState({
userData: {
...state.userData,
invoices: newInvoices,
}
});
}
添加到状态的一种稍微更反应性的方法是映射来自先前状态的数据并在模板中传播,这样您也不会改变它。
createInvoice = idx => {
this.setState(prevState => ({
userData: {
...prevState.userData,
invoices: [
...prevState.userData.invoices,
{
...UsersJSON[0].invoices[0],
invoiceID: idx + 1,
},
],
},
}));
}
TA贡献1810条经验 获得超4个赞
你想在更新之前复制一个状态对象(在 JS 数组中是对象)。也许let newUserData = [...this.state.userData]
是避免此错误的方法,但您可能需要“深拷贝”。
添加回答
举报