javascript - 输入表单 - 改变 onChange 和 isDisabled 的运行顺序
问题描述
我在 React 中实现了一个包含 3 个输入字段的网页,每个输入字段都具有以下属性
onChange={this.handleChange} 和 disabled={this.isDisabled()}
期望的行为是当输入字段包含 2 个数字时,焦点将移动到下一个输入字段。只要字段不包含 2 位数字,旁边的字段就必须 禁用。
实际发生的情况是,当我在第一个字段中键入第二个数字时,它运行 handleChange 函数,该函数检查该字段是否包含 2 个数字,确定是,然后将焦点移动到下一个输入字段。
但是下一个字段被禁用!(因为 isDisabled 函数还没有运行!)所以光标没有移动..我想改变发生的顺序,或者任何其他方式来解决它。
你有什么建议吗?
解决方案
几天前我也遇到过同样的问题。然而,我的方法是使用反应状态并通过从状态中获取的 id 来关注输入;
因此,为了方便起见,我们首先制作一张input - id
地图。并使用document.getElementById(this.state.active).focus()
功能。我们通过更改处理程序更改状态。
render() {
this.setInputFocus();
return (
<div className="App">
<input id="1" onChange={this.onChange} />
<input id="2" onChange={this.onChange} />
<input id="3" onChange={this.onChange} />
</div>
);
}
setInputFocus = () => {
if (document.getElementById(this.state.active)) {
document.getElementById(this.state.active).focus();
}
};
onChange = e => {
if (e.target.value.length === 2) {
this.setState({ active: this.state.active + 1 });
}
};
推荐阅读
- c++14 - 将 std::string 索引转换为 std::vector 中的整数
- firebase - 如何从 Firestore Flutter 中读取数据
- amadeus - 艾玛迪斯付款分配流程工作流程
- grafana - Grafana 条宽度太小
- flutter - 将 setState 分配给 Flutter 中的变量
- laravel - 如何从语义 UI 开始
- python - 执行 keras fit_generator 时 Python 崩溃
- django - 使用 docker 构建坠落
- mysql - 表中有 2 个相同 ID 的元组,并且这两行的其他一些列的值不同
- python - 无法在 python 3.6.9 上安装 logpy 包