【发布时间】:2017-04-09 11:55:42
【问题描述】:
如果我有以下反应组件:
class Cmpt extends Component {
setValue( e ) {
this.setState({ value : e.target.value });
}
render() {
return <input value={this.state.val} onChange={this.setValue.bind(this)}/>
}
}
现在这可以按预期工作,编辑文本不会将光标重置到输入的末尾。如果我修改它以使 setState 异步发生,则会发生光标重置:
class Cmpt extends Component {
setValue( e ) {
setTimeout( () =>
this.setState({ value : e.target.value }) );
}
render() {
return <input value={this.state.val} onChange={this.setValue.bind(this)}/>
}
}
显然解决方法是不同步调用setState - 但我不明白为什么异步版本不能正常工作。在我的脑海中,事件链如下:
- 用户将字符添加到输入字段,将其从 ACD 更改为 ABCD
- 输入 DOM 节点的值更改为 ABCD 以反映这一点
- 一段时间过去了
-
setState被调用 - 将反应组件的状态从 ACD 更改为 ABCD - 触发了
render调用 - React 差异算法将 DOM 节点值 (ABCD) 与this.state.value(ABCD) 的值进行比较。它看到两者是相同的,因此不会触发重绘并保留光标
显然我的心智模型是错误的,因为正在触发重绘 - 导致光标重置。
谁能解释一下原因?
谢谢!
【问题讨论】:
标签: reactjs asynchronous input cursor reset