You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native render方法内不同组件调用方式引发输入框键盘收起问题

问题原因

你遇到的键盘自动收起问题核心原因是:你把Input组件定义在了App组件的内部作用域中。
每当你在输入框输入内容触发setText更新时,App组件都会触发重渲染,此时会重新生成一个全新的Input函数引用。

两种写法的核心区别

  • <Input />写法
    这是React标准的组件实例化写法,React会将其识别为独立组件,走完整的组件挂载/卸载生命周期。当App重渲染生成新的Input函数引用时,React会判定旧的Input组件实例需要销毁,重新挂载新的Input实例,绑定在旧实例上的TextInput原生节点会被卸载,输入框自然失焦,触发键盘收起。
  • {Input()}写法
    这本质是普通的JS函数调用,不会被React识别为独立组件,相当于你把Input函数返回的TextInput元素直接内嵌在App的渲染树中,该输入框的生命周期完全和App绑定,App重渲染时只会更新输入框的内容,不会触发节点销毁重建,因此不会失焦、键盘不会收起。

正确的修复方案

将Input组件移到App组件外部定义,需要用到的text、onChangeText通过props传递即可,示例代码如下:

const Input = ({text, onChangeText}) => {
  return (
    <TextInput
      value={text}
      placeholder="dioporco"
      style={{ fontSize: 50 }}
      onChangeText={onChangeText}
    />
  );
};

export default function App() {
  const [text, setText] = useState("");
  const onChangeText = useCallback((t) => setText(t), []);
  return (
    <View style={styles.container}>
      <Input text={text} onChangeText={onChangeText} />
    </View>
  );
}

内容的提问来源于stack exchange,提问作者PietroPutelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:24:07