React Native 屏幕上有大量内容时,文本输入在清除时变慢

wgeznvg7  于 2023-10-22  发布在  React
关注(0)|答案(2)|浏览(131)

我有一个问题,当我在一个文本输入垃圾邮件输入,并点击一个按钮提交和清除文本,它变得滞后,它不清除文本输入中的文本马上 *。这种情况发生时,我有很多内容**在屏幕上(如存有文本).
这对我来说是一个问题,因为我正在开发一个聊天应用程序,每当聊天记录很大,用户快速输入和提交消息时,它不会立即被清除,仍然会留在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>
  );
};

有人知道为什么屏幕上有大量内容会发生这种情况吗?

mwyxok5s

mwyxok5s1#

基于以上的想法,我使用debounce为setMessages。它防止TextInput的值不被清除

but5z9lq

but5z9lq2#

由于当敲击键盘和单击“提交”按钮同时发生时,submitonChangeText回调会同时触发,因此我已经取消了submit回调的运行,延迟了100 ms。
请参见expo snack
use-debounce库提供了一个优雅的解决方案来处理这样的用户输入事件。
我还通过传递value={text}属性来控制TextInput,从而消除了对ref的需要。
至于为什么TextInput没有clear(),而addMessage()被成功调用(没有去抖动),我目前没有解释。我很想知道是否有人可以指出。

无法解决问题

在我的物理设备上进行了几次测试后,我偶尔会观察到不必要的行为。

相关问题