我有一个问题,当我在一个文本输入垃圾邮件输入,并点击一个按钮提交和清除文本,它变得滞后,它不清除文本输入中的文本马上 *。这种情况发生时,我有很多内容**在屏幕上(如存有文本).
这对我来说是一个问题,因为我正在开发一个聊天应用程序,每当聊天记录很大,用户快速输入和提交消息时,它不会立即被清除,仍然会留在TextInput中,这是一个糟糕的可用性。我尝试了ref和controlled TextInput(没有区别)。
你可以在我的gif中看到这个问题:
下面是一个小吃世博会再现的问题:https://snack.expo.io/s22hVf140
这是我的代码:
MyMessages:
const MyMessages = () => {
const [messages, setMessages] = useState([]);
const addMessage = (text) => {
const arr = [text, ...messages];
setMessages(arr);
};
return (
<View>
<MyTextInput addMessage={addMessage}></MyTextInput>
{messages.map((msg, i) => {
return <Text key={i}>{msg}</Text>;
})}
<Text>
Lorem ipsum.......
</Text>
</View>
);
};
MyTextInput:
const MyTextInput = ({ addMessage }) => {
const [text, setText] = useState("");
const myRef = useRef();
const submit = () => {
myRef.current.clear();
addMessage(text);
};
return (
<View>
<TextInput
ref={myRef}
style={{
width: "100%",
height: 50,
backgroundColor: "lightgrey",
marginTop: 50,
}}
onChangeText={(text) => setText(text)}
></TextInput>
<Button title="submit" onPress={submit}></Button>
</View>
);
};
有人知道为什么屏幕上有大量内容会发生这种情况吗?
2条答案
按热度按时间mwyxok5s1#
基于以上的想法,我使用debounce为setMessages。它防止TextInput的值不被清除
but5z9lq2#
由于当敲击键盘和单击“提交”按钮同时发生时,
submit
和onChangeText
回调会同时触发,因此我已经取消了submit
回调的运行,延迟了100 ms。请参见expo snack。
use-debounce库提供了一个优雅的解决方案来处理这样的用户输入事件。
我还通过传递
value={text}
属性来控制TextInput
,从而消除了对ref
的需要。至于为什么
TextInput
没有clear()
,而addMessage()
被成功调用(没有去抖动),我目前没有解释。我很想知道是否有人可以指出。无法解决问题
在我的物理设备上进行了几次测试后,我偶尔会观察到不必要的行为。