javascript - 在 React 中动态更新“状态”会覆盖整个状态
问题描述
好的,所以我正在尝试在 React 中构建一个表单,在其中我可以在多个输入中输入值,然后提交并让值填充表格中的指定单元格。我正在尝试使用“onChange”来更新状态,但是当我输入值时,我的初始状态会被完全覆盖。
所以,如果我设置:
state = {
Jan012019: {
first: null,
second: null
}
};
然后尝试通过在“first”的输入中输入“3”来更新状态:
this.setState(
{
Jan012019: {
[e.target.name]: e.target.value
}
},
function() {
console.log(this.state);
}
);
状态显示为:
Jan012019 {
first: '3'
}
从状态中完全删除“第二”,如果我尝试将值也输入到“第二”输入中,它会从状态中删除“第一”。这里发生了什么?我已经看过其他示例和解决方案,并且我相当确定我的代码与此处另一个问题的解决方案完全一样,但仍然无法正常工作。完整代码如下。
import React from "react";
class InputForm extends React.Component {
state = {
Jan012019: {
first: null,
second: null
}
};
updateTable = e => {
this.setState(
{
Jan012019: {
[e.target.name]: e.target.value
}
},
function() {
console.log(this.state);
}
);
};
onClick = e => {
e.preventDefault();
console.log(this.state);
};
render() {
return (
<form className="ui form" style={{ marginTop: "50px" }}>
<div className="inline field">
<label style={{ marginRight: "27px" }}>First Input</label>
<input
name="first"
type="number"
placeholder="Enter value"
onChange={this.updateTable}
/>
</div>
<div className="inline field">
<label>Second Input</label>
<input
name="second"
type="number"
placeholder="Enter value"
onChange={this.updateTable}
/>
</div>
<button onClick={this.onClick}>Click</button>
</form>
);
}
}
export default InputForm;
我还尝试将输入值设置为:
value={this.state.Jan012019.first}
看看这是否有什么不同,但没有去。
解决方案
那是因为您正在重置 setState 中的整个 Jan012019 对象。
Jan012019: {
[e.target.name]: e.target.value
}
您需要先传播原始 Jan012019 对象,以保留其他字段
this.setState({
Jan012019: {
...this.state.Jan012019, [e.target.name]: e.target.value
}
})
推荐阅读
- node.js - 无法安装幽灵本地安装
- javascript - 如何将 VB.net 代码中定义的字符串变量的值传递到 CefSharp 浏览器并使用 Javascript 以它们的名称调用它们?
- python-3.x - Python交错两个列表
- asp.net-core - 我是否在我的代码中正确执行/处理 GDPR 隐私警报
- file - 用于 SVN 的 Oneliner 在未版本化的子文件夹中添加文件
- java - 带有springboot控制器的Java枚举的Json请求正文
- angular - 通过 Azure 托管代理 Chromedriver 运行 Angular Protractor 测试
- ros - 两个物体接触时的 Gazebo 奇怪行为
- python - Python if 语句语法无效
- angular - 静默登录身份服务器 4 出现不适当的错误响应问题