Вы должны переписать componentDidUpdate
, как показано ниже, чтобы заставить его работать (безобразно):
componentDidUpdate() {
this.priceInput.current.selectionEnd = this.pricePosition + 1; //tried like this
}
Дело в том, что вы форматируете только значение, отображаемое на экране, а не само состояние, поэтому курсор не соответствует фактической длине.
Я предлагаю вам переписать свой код, как показано ниже:
import React from "react";
import { render } from "react-dom";
import numeral from "numeral";
class App extends React.Component {
priceInput = React.createRef();
constructor(props) {
super(props);
numeral.localeData().delimiters.thousands = " ";
this.state = {
price: 4500000 // comes from props
};
}
handleInputChange = field => ev => {
const formattedValue = numeral(ev.target.value).format("0,0");
this[`${field}Position`] = Number(formattedValue.length);
this.setState({
[field]: Number(ev.target.value.replace(/\D/g, ""))
});
};
render() {
return (
<div>
Price here:
<input
ref={this.priceInput}
value={numeral(this.state.price).format("0,0")}
onChange={this.handleInputChange("price")}
/>
</div>
);
}
}
render(<App />, document.getElementById("root"));
Теперь вы можете избавиться от переменной position
.
Надеюсь, это поможет;)