【发布时间】:2021-04-11 18:33:53
【问题描述】:
我有一个问题,当我在 TextInput 中输入垃圾邮件并单击按钮以提交并清除文本时,它会变得迟钝,并且不会立即清除 TextInput 中的文本。 当我在屏幕中有大量内容(例如 Lorem Ipsum 文本)时,就会发生这种情况。
这对我来说是个问题,因为我正在开发一个聊天应用程序,每当聊天日志很大并且用户快速输入和提交消息时,它不会立即被清除,并且仍会保留在 TextInput 中,即可用性差。我用 ref 和受控的 TextInput 尝试过(没有区别)。
您可以在我的 gif 中看到问题:
这里有一个小吃供 expo 重现这个问题: https://snack.expo.io/s22hVf140
这是我的代码:
我的消息:
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>
);
};
我的文本输入:
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>
);
};
有人知道为什么屏幕上的大内容会发生这种情况吗?
【问题讨论】:
-
您是否考虑过使用像
FlatList这样的虚拟化列表来呈现日志中的每个聊天项目?这应该会提供一些渲染性能提升。您还应该使用一些开发工具来帮助确定导致“超出预期”的渲染负载的原因。 -
@98sean98 这个问题也发生在 FlatList 上。我不知道如何正确使用配置文件开发工具,但这确实是我的全部代码(请参阅小吃以重现它)
-
您在生产中是否有同样的问题?还是仅在开发模式下?
-
我已经查看了您的零食代码。起初我认为您的渲染可以通过考虑how react's dom diffing algorithm works 来改进。但是,即使在插入数组之前,我已经为每条新消息添加了
id,它仍然具有您所指的“滞后”。在仔细检查该行为后,它只会在您点击提交同时在框中输入另一个字符时发生。这意味着submit和(text) => setText(text)被同时调用。我试图想出一个解决方案,但还没有。 -
@98sean98 是的,你是对的。我很“高兴”你也有这个问题。它是反应原生的错误吗?因为我的代码非常简单,我仍然有这个问题....也感谢您找到解决方案。 :)
标签: reactjs react-native expo textinput