考虑React Native的TextInput组件。它有一个名为value
的道具。我将值设置为this.state.text
。
它还有一个道具onChangeText
,我设置为(text) => {this.setState({text: text})
。
设置状态将导致视图重新渲染,从而触发组件上的setValue
。
这不会导致任何类型的递归或库存组件的不良行为。但是,在构建我自己的文本输入组件时,我发现在state
和value
中使用onChangeText
会导致本机输入事件重新呈现视图并调用{{ 1}}。
即键盘上的用户类型,本机模块发出setValue
事件,JavaScript组件接收事件和更新状态,状态更改导致重新呈现,在本机组件上重新呈现调用setValue,以及本机组件交换掉带有从初始事件接收的值的文本(相同的值)。
问题是,当您在iOS或Android本机文本组件上设置文本时,它会重置光标。所以我尝试输入一个条件onChangeText
,这在你输入慢的时候起作用,但是当你输入很快的时候,事情会变得混乱,你无法预测事件的顺序。
我查看了React Native作者如何在他们自己的文本组件中处理这个问题,他们似乎正在使用某种计数器(here和here)来同步事件,但我无法&# 39;跟上整个地方的逻辑。
目前,我的解决方案是不在渲染功能中使用if(newText != currentText) {setText(newText)}
,但是我的组件依赖于state
未被意外调用才能正常运行,而这只是一场灾难等待发生。
有关如何更好地设计此类组件或RN组件如何解决此问题的任何见解?