У меня есть контролируемый компонент ввода 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 });
}
Я начинаю сталкиваться с проблемой, когда пытаюсь удалить/добавить цифру где-то посередине, а затем курсор сразу перемещается в конец строки.
Я видел решение на странице sophie, но я думаю, что оно здесь не применимо, поскольку setState в любом случае вызовет рендеринг. Я также пытался манипулировать положением каретки с помощью setSelectionRange(start, end), но это тоже не помогло. Я думаю, что setState, который вызывает рендеринг, заставляет компонент рассматривать отредактированное значение как окончательное значение и заставляет курсор двигаться в конец.
Может ли кто-нибудь помочь мне выяснить, как решить эту проблему?