【发布时间】:2020-07-29 02:25:15
【问题描述】:
我有一个受控的 React 输入组件,我正在格式化输入,如 onChange 代码所示。
<input type="TEL" id="applicantCellPhone" onChange={this.formatPhone} name="applicant.cellPhone" value={this.state["applicant.cellPhone"]}/>
然后我的formatPhone函数是这样的
formatPhone(changeEvent) {
let val = changeEvent.target.value;
let r = /(\D+)/g,
first3 = "",
next3 = "",
last4 = "";
val = val.replace(r, "");
if (val.length > 0) {
first3 = val.substr(0, 3);
next3 = val.substr(3, 3);
last4 = val.substr(6, 4);
if (val.length > 6) {
this.setState({ [changeEvent.target.name]: first3 + "-" + next3 + "-" + last4 });
} else if (val.length > 3) {
this.setState({ [changeEvent.target.name]: first3 + "-" + next3 });
} else if (val.length < 4) {
this.setState({ [changeEvent.target.name]: first3 });
}
} else this.setState({ [changeEvent.target.name]: val });
}
当我尝试在中间某处删除/添加一个数字然后光标立即移动到字符串的末尾时,我开始面临问题。
我在solution by Sophie 看到了一个解决方案,但我认为这不适用于这里,因为 setState 无论如何都会导致渲染。我还尝试通过 setSelectionRange(start, end) 来操纵插入符号的位置,但这也无济于事。 我认为导致渲染的 setState 使组件将编辑的值视为最终值并导致光标移动到末尾。
谁能帮我弄清楚如何解决这个问题?
【问题讨论】:
标签: javascript reactjs cursor-position controlled-component