【问题标题】:React Native TextInput ReRenders when calling useState Hook inside a custom component在自定义组件中调用 useState Hook 时反应本机 TextInput ReRenders
【发布时间】:2020-11-19 01:16:54
【问题描述】:

说明 当 TextInput 组件触发 onChangeText 或 onKeyPress 方法中的操作然后触发 setState 时,组件将重新渲染并失去焦点。

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

复制步骤 提供重现问题的详细步骤列表。

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

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

小吃、代码示例、屏幕截图或存储库链接: 世博会示例 https://snack.expo.io/@ksi9302/1f9369

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

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

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

我知道会起作用的

  • 摆脱自定义包装器并使用纯 JSX(换句话说,不将 TextInput 作为子组件传递)//当应用程序变大时几乎不可能

恶意妥协

  • 使用 AutoFocus={true} //在 Web 上工作正常,但在移动设备上,键盘闪烁很多。

【问题讨论】:

    标签: javascript reactjs react-native expo textinput


    【解决方案1】:

    取出包装器,因为它会由于搜索值的变化而不断重新渲染。

    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;
    

    【讨论】:

    • 您好 D10S,非常感谢您的回答。是的,然后它工作正常。但是,在我的实际项目中,这种方法存在很多问题,因为在 Wrapper 组件中,如果我必须将所有这些组件移出父组件,那么还有另一个客户组件利用了在顶层组件中声明的许多函数,我将不得不传递一堆道具,基本上失去了在父组件中声明子组件的最佳优势。这只是在 React 编程中不鼓励使用的方式,还是您希望这个问题在未来得到解决?
    • 传递大量道具有什么问题??无论如何,如果我说对了,您需要使用 HOC。请注意,如果 parent 和 child 位于同一个组件中,则拆分它们是没有逻辑的,
    • 感谢您提供宝贵的信息,我会关注 HOC。我现在不知何故让它工作了。在我的代码中,Wrapper 有
      并且在
      内部,然后我有我的 ,其中包括 TextInput,现在,我已经将 Wrapper 移到外面,并且 Header 从一开始就是一个导入的组件,对于这个 FunctionButtons组件,我只是将 JSX 移到 Header 中,问题就消失了,我真的不明白为什么从嵌套的子组件返回完全相同的 JSX,因为它是相同的代码。好吧,我想我得做些功课了。再次感谢您的帮助!
    • @D10S 我遇到了同样的问题。确实,删除“包装器”对我有用。我不明白为什么这是一件事。为什么我不能同时使用 useState 包装我的 TextInput?我没有连接点...
    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2020-08-03
    • 2021-11-27
    • 2016-10-24
    • 2019-10-21
    相关资源
    最近更新 更多