reactjs - React - 如何设置动态构建的许多输入控件的值?
问题描述
我正在使用许多输入动态构建一个组件,我需要处理这些输入上的 onChange ...
所以我厌倦的是为每个输入控件设置一个名称,然后在 onChange 调用中设置一个具有该控件名称的状态变量,然后从状态中使用它来填充输入控件的“值”属性:
else if (element.Type === TEXT) {
elements.push(
<td className="view-cell" align="left">
{element.Name}<br/>
<Input key={element.Id}
name={element.Name.toLowerCase().replace(" ","")}
// label={element.Name}
// defaultValue={element.Value}
value={this.state.valueOf(element.Name.toLowerCase().replace(" ",""))}
disabled={!element.Editable}
onChange={(e) => {
this.onInputValueChange(e)
}}
/>
</td>
)
}
onInputValueChange(e) {
this.setState({[e.target.name]: e.target.value})
console.log(this.state.valueOf(e.target.name))
}
但是我可以看到状态没有更新为我试图通过输入名称动态添加的新值!
我怎样才能实现它?
更新
当我尝试从控制台访问状态值时,我得到:
解决方案
我注意到您的代码中有两件事:
您正在尝试从
valueOf
状态变量中获取值。但是您缺少valueOf
在 onchange 处理程序中设置对象中的值。如果添加缺少的位,应该没问题。onInputValueChange(e) { this.setState({ [e.target.name]: e.target.value }, () => { console.log(this.state[e.target.name]); // use [] to access value instead of () }); }
此外,您必须使用方括号 [] 表示法从对象动态访问值。
if (element.Type === TEXT) { const inputName = element.Name.toLowerCase().replace(" ",""); elements.push( <td className="view-cell" align="left"> {element.Name}<br/> <Input key={element.Id} name={inputName} label={element.Name} defaultValue={element.Value} value={this.state[inputName]} disabled={!element.Editable} onChange={this.onInputValueChange} /> ) }
这应该可以解决您的问题。
推荐阅读
- c++ - 具有 N 列和 N 行的矩阵,列必须具有 N-1 , N-2 等值
- notifications - PWA关闭时如何接收点击通知数据?
- javascript - 使用 JQuery 和 Ajax 淡化 html 页面的问题
- rest - 在 http 请求中设置 grpc 元数据
- flutter - 没有材料设计或库比蒂诺定制的颤振?
- python - tkinter 中的打包和网格
- android - 使 NestedScrollView 中的工具栏不可滚动
- ios - stackView 的轴更改导致布局错误
- excel - R1C1,方程中的变量和数学
- javascript - 如何知道条码扫描器何时完成扫描 Javascript?