Reactjs 使用异步onChange处理程序重置React.js输入游标
如果我有以下反应组件:Reactjs 使用异步onChange处理程序重置React.js输入游标,reactjs,asynchronous,input,cursor,reset,Reactjs,Asynchronous,Input,Cursor,Reset,如果我有以下反应组件: class Cmpt extends Component { setValue( e ) { this.setState({ value : e.target.value }); } render() { return <input value={this.state.val} onChange={this.setValue.bind(this)}/> } } 类Cmpt扩展组件{ 设定值(e){ this.set
class Cmpt extends Component {
setValue( e ) {
this.setState({ value : e.target.value });
}
render() {
return <input value={this.state.val} onChange={this.setValue.bind(this)}/>
}
}
类Cmpt扩展组件{
设定值(e){
this.setState({value:e.target.value});
}
render(){
返回
}
}
现在,这项工作如预期的那样,编辑文本不会将光标重置到输入的末尾。如果我修改它,使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)}/>
}
}
类Cmpt扩展组件{
设定值(e){
设置超时(()=>
this.setState({value:e.target.value}));
}
render(){
返回
}
}
显然,解决办法是不同步调用setState
,但我不明白为什么异步版本不能正常工作。在我看来,一连串的事件如下:
setState
被调用-将反应组件的状态从ACD更改为ABCDrender
调用-React diffing算法将DOM节点值(ABCD)与this.state.value
(ABCD)的值进行比较。它会看到两者都是相同的,因此不会触发重画,并且会保留光标谢谢 状态更改将始终触发新的
render
调用。之后,React自己决定重新渲染什么。但它总是通过改变状态来触发。即使你这样做了
this.setState({})
它将调用
render
方法。状态更改将始终触发新的render
调用。之后,React自己决定重新渲染什么。但它总是通过改变状态来触发。即使你这样做了
this.setState({})
它将调用
render
方法。抱歉,伙计们,找到了一个重复的问题,回答了我的问题:
很遗憾,我不知道如何将我自己的问题标记为重复问题:(
我对事件顺序的心理模型是错误的。显然,react会在每个事件处理程序的末尾触发同步重新渲染,因此在DOM更改之后调用render,但在react状态更改之前调用render,导致重新绘制和光标重设
谢谢大家
T抱歉,伙计们,找到了一个重复的问题,回答了我的问题: 很遗憾,我不知道如何将我自己的问题标记为重复问题:( 我对事件顺序的心理模型是错误的。显然,react会在每个事件处理程序的末尾触发同步重新渲染,因此在DOM更改之后调用render,但在react状态更改之前调用render,导致重新绘制和光标重设 谢谢大家
T当然,但我的问题是,为什么当setState被称为async vs Syncy时,React会选择重新呈现文本输入(导致光标重置),但我的问题是,当setState被称为async vs Syncy时,React会选择重新呈现文本输入(导致光标重置),因为setState可能重复