如果我有以下反应组分:React.js输入光标复位
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改变它来甲乙 CD
- 输入DOM节点的值改变为ABCD以反映这一
- 经过一段时间
setState
称为 - 改变从ACD的反应成分的状态,以ABCD- 一个
render
呼叫被触发 - 所述阵营版本比较算法将DOM节点值(ABCD),以值为this.state.value
(ABCD)。它看到两者是相同的,因此不会触发重绘,并且光标被保留。
很明显,我的心智模型是错误的,因为正在触发重绘 - 导致游标重置。
请任何人都可以解释为什么?
谢谢!
可能的复制[在ReactJS,为什么\'的setState \'同步调用时不同的表现?(HTTP://计算器。com/questions/28922275/in-reactjs-why-does-setstate-behave-different-when-called-synchronous) – maambmb