我建议不要在状态中存储和更新 JSON/XML 数据,而是将其映射到更容易识别和更新的更简单的对象。反应状态应该是minimal代表您的信息所需的数据量,仅存储您需要的数据。
const proddescriptions = descriptions.map(({ attributes, value }) => ({
id: attributes["description-id"],
sequence: attributes["display-sequence"],
value
}));
this.setState({ proddescriptions });
绘制地图时state.proddescriptions
对于输入,使用id
作为输入name
更新时用于标识的属性值。
{this.state.proddescriptions.map((item) => (
<li key={item.id}>
<label>
{item.id}
<input
type="text"
name={item.id} // <-- name attribute
size="5"
maxLength="3"
value={item.sequence}
onChange={this.handleChange}
/>
</label>
{item.value}
</li>
))}
实施handleChange
浅复制先前的状态并通过 id 更新匹配的数组元素。
handleChange = (event) => {
const { name, value } = event.target;
this.setState((prevState) => ({
proddescriptions: prevState.proddescriptions.map((el) =>
el.id === name
? {
...el,
sequence: value
}
: el
)
}));
};
In the handleSubmit
回调使用onSubmit
事件对象阻止默认表单操作并访问当前state.proddescriptions
并将其映射回您的 API 期望的任何格式。
handleSubmit = (event) => {
event.preventDefault();
console.log(this.state.proddescriptions);
// manipulate `state.proddescriptions` into a request payload
};