在自定义组件内调用 useState Hook 时反应 Native TextInput ReRenders

React Native TextInput ReRenders when calling useState Hook inside a custom component

描述 当 TextInput 组件触发 onChangeText 或 onKeyPress 方法然后触发 setState 时,组件将重新渲染并失去焦点。

React Native 版本: 0.62(使用Expo无法升级)

重现步骤 请提供重现该问题的详细步骤列表。

  1. 创建一个像
  2. 一样简单的自定义包装器组件
  3. 声明useStateHook
  4. 通过直接 JSX 或自定义组件将 TextInput 传递给包装器组件
  5. 将 setState 函数绑定到 TextInput 的任何事件侦听器。

预期结果 设置状态但不会失去焦点或重新渲染

快餐、代码示例、屏幕截图或 link 存储库: 世博会范例 https://snack.expo.io/@ksi9302/1f9369

大家好,这是我向 React Native 提交的错误报告。 但是我不确定我这里是不是做错了什么。

到目前为止我已经尝试过但不起作用

  1. 去掉所有样式。
  2. 使用 class 反应组件制作自定义输入组件,禁用 shouldComponentUpdate
  3. 没有绑定值
  4. 制作不同的状态结构并实际在对象内传递{}
  5. 制作虚拟密钥

我所知道的会起作用

糟糕的妥协

取出包装器,因为它会因搜索值更改而不断重新呈现。

import React, { useState } from "react";
import { View, TextInput } from "react-native";

const Test = () => {
  const handleChange = e => {
    setSearch(e);
  };
  const [search, setSearch] = useState(null);

  return (
    <Wrapper>
      <TextInput
        value={search}
        onChangeText={e => {
          handleChange(e);
        }}
        placeholder="type here"
      />
    </Wrapper>
  );
};

const Wrapper = props => {
    return (
      <View
        style={{
          width: "100%",
          height: "100%",
          alignItems: "center",
          justifyContent: "center",
          display: "flex",
        }}
      >
        {props.children}
      </View>
    );
  };

export default Test;