reactjs - 当最大长度充满第一个输入时,将焦点从一个输入移动到反应 js 中的另一个输入
问题描述
当第一个输入的最大长度已满时,将焦点从一个输入移动到反应 js 中的另一个输入
<div className="col-2">
<div className="form-group">
<input type="text" className="form-control text-center" maxLength={1} ref={this.vc1} returnkeytype={'next'} value={this.state.v1} onSubmitEditing={this.maxLength?1:() => this.focusNextField('2')} />
</div>
</div>
<div className="col-2">
<div className="form-group">
<input type="text" className="form-control text-center" maxLength={1} ref={this.vc2} returnkeytype={'next'} value={this.state.v2} onSubmitEditing={(event) => this.focusNextField('3')}/>
</div>
</div>
项目清单
解决方案
refs
通过使用帮助聚焦逻辑,您有正确的想法。一种简单的方法是跟踪 的数组refs
,并在输入更改时更新与ref
. 使用 state 来跟踪该索引。
然后在componentDidUpdate()
状态更改时触发哪个,您可以识别它ref
并检查其输入值的长度是否与其最大长度匹配。如果是这样,那么您只需将注意力集中在下一个 (+1) 索引处的 ref 上。
这是一个工作沙箱:https ://codesandbox.io/s/sharp-fast-yo4mg
import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";
class App extends React.Component {
state = {
v1: "",
v2: "",
v3: "",
currentRefIndex: null
};
vc1 = React.createRef();
vc2 = React.createRef();
vc3 = React.createRef();
onChange = (e, index) => {
this.setState({
[e.target.name]: e.target.value,
currentRefIndex: index
});
};
componentDidUpdate() {
const refs = [this.vc1, this.vc2, this.vc3];
const { currentRefIndex } = this.state;
//get current ref attributes
const currentRef = refs[currentRefIndex].current;
const currentRefMaxLength = currentRef.maxLength;
const currentRefValue = currentRef.value;
if (
currentRefValue.length === currentRefMaxLength &&
currentRefIndex < refs.length - 1
) {
refs[currentRefIndex + 1].current.focus();
}
}
render() {
return (
<div>
<div className="col-2">
<div className="form-group">
<input
type="text"
className="form-control text-center"
maxLength={1}
ref={this.vc1}
returnkeytype={"next"}
name="v1"
value={this.state.v1}
onChange={e => this.onChange(e, 0)}
/>
</div>
</div>
<div className="col-2">
<div className="form-group">
<input
type="text"
className="form-control text-center"
maxLength={3}
ref={this.vc2}
returnkeytype={"next"}
name="v2"
value={this.state.v2}
onChange={e => this.onChange(e, 1)}
/>
</div>
</div>
<div className="col-2">
<div className="form-group">
<input
type="text"
className="form-control text-center"
maxLength={2}
ref={this.vc3}
returnkeytype={"next"}
name="v3"
value={this.state.v3}
onChange={e => this.onChange(e, 2)}
/>
</div>
</div>
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
推荐阅读
- ruby-on-rails - 使用 Rails 如何在给定时间段内查找用户预订的课程
- c# - 重构代码以不使用绝对路径或 URI
- html - 在节点 js 中,req.body 未定义
- clojure - Clojure 减少参数解构
- javascript - 如何使用基本的 javascript 代码平滑打开下拉菜单?
- three.js - 什么是推荐的方式,在三个 js 中,渲染(大部分)静态场景
- mysql - MySQL:如何制作拒绝未成年员工的触发器?
- python - Django过滤器内的条件
- python - 要在 Sagemaker 中使用的 tf.distribute.cluster_resolver.TPUClusterResolver(tpu_name) 的替代方案?
- android - Flutter 应用程序未在任何编辑器上运行