在 TextInput 中写入一个字符后键盘隐藏问题(Flatlist 标题内的文本输入)

Ous*_* Nm 3 lost-focus reactjs react-native react-native-flatlist react-native-textinput

我花了两天时间解决这个问题,问题是:

当我将 TextInput 放入 Flatlist 中时,TextInput 的行为发生了变化,键盘在写入每个字符后失去焦点。

版本React-native:0.63.2,react:16.13.1,react-dom:16.13.1,expo:~42.0.1,

重现步骤

  • 我创建了一个名为 ==> [inputSearch, setInputSearch] 的状态变量
  • 我在 Flatlist 的 ListHeaderComponent 中编写了一个文本输入

---> 问题是:在键盘中按下每个字符后,键盘隐藏

国家声明:

const [inputSearch, setInputSearch] = useState(null);
Run Code Online (Sandbox Code Playgroud)

TextInput 位于 Flatlist 内:

    <View style={styles.container}>
    <StatusBar
         backgroundColor="#11131B"
         barStyle="light-content"
    />

    <View style={{width: '100%', flex: 1 , backgroundColor: 'white', marginTop: 5}}>

        <FlatList 
            contentContainerStyle={{alignItems: 'center',paddingHorizontal: 20}}
            keyExtractor={(item) => (Object.keys(item).length === 0) ? "" : item.id.toString()}
            width= {width}
            numColumns={2}
            ListHeaderComponent={() =>
                <View  style={{flexDirection:'column',justifyContent:'space-between'}}>

                   <Text style={{color:Colors.dark1, fontSize:14, marginBottom: 5}}>Search :</Text>
                   <TextInput style={styles.input} value={inputSearch} onChangeText={setInputSearch} placeholder="Username"/>

                </View>
            }
            data={SIMPLE_DATA}
            renderItem={renderItemRow}
        >

        </FlatList>
    </View>

  <View>
Run Code Online (Sandbox Code Playgroud)

Gio*_*ero 14

我将扩展我在评论中所写的内容,因为它写得很快而且不够清晰。

让我们以以下内容为起点(我删除了无用的信息):

function YourComponent() {
  const [inputSearch, setInputSearch] = useState('');

  return (
    <View>
      <StatusBar backgroundColor="#11131B" barStyle="light-content" />

      <View>
        <FlatList
          ListHeaderComponent={() => (
            <>
              <Text>Search :</Text>
              <TextInput
                value={inputSearch}
                onChangeText={setInputSearch}
                placeholder="Username"
              />
            </>
          )}
          data={[]}
          renderItem={() => <View />}
        />
      </View>
    </View>
  );
}
Run Code Online (Sandbox Code Playgroud)

每次调用setInputSearch组件时都会再次呈现,但这意味着每次都会调用您在 ListHeaderComponent 中内联传递的箭头函数,并且将再次创建内容(键盘已关闭,因为焦点所在的输入不会发生)不再存在,因为它已被新的取代)。

你怎么解决这个问题?ListHeaderComponent 接受构造函数和 ReactElement,因此您要么传递 ReactElement,要么创建一个“独立”组件(没有特定含义,它只是一个独立的组件,而不是在另一个组件内)。


这里有几个解决方案:

  1. ReactElement 示例(注意,组件是直接传递的,ListHeaderComponent 中没有函数;如果需要,您也可以将其提取为另一个组件):
function YourComponent() {
  const [inputSearch, setInputSearch] = useState('');

  return (
    <View>
      <StatusBar backgroundColor="#11131B" barStyle="light-content" />

      <View>
        <FlatList
          ListHeaderComponent={
            <>
              <Text>Search :</Text>
              <TextInput
                value={inputSearch}
                onChangeText={setInputSearch}
                placeholder="Username"
              />
            </>
          }
          data={[]}
          renderItem={() => <View />}
        />
      </View>
    </View>
  );
}
Run Code Online (Sandbox Code Playgroud)
  1. 独立组件(将构造函数传递给 ListHeaderComponent):
function YourComponent() {
  return (
    <View>
      <StatusBar backgroundColor="#11131B" barStyle="light-content" />

      <View>
        <FlatList
          ListHeaderComponent={ListHeaderComponent}
          data={[]}
          renderItem={() => <View />}
        />
      </View>
    </View>
  );
}

function ListHeaderComponent() {
  const [inputSearch, setInputSearch] = useState('');

  return (
    <>
      <Text>Search :</Text>
      <TextInput
        value={inputSearch}
        onChangeText={setInputSearch}
        placeholder="Username"
      />
    </>
  );
}
Run Code Online (Sandbox Code Playgroud)

但这不允许您在 YourComponent 中使用 inputSearch 值。


我希望这有助于解决问题。

  • 这是第一个解决方案示例,即使用 ReactElement 的示例。在“这里有几个解决方案:”之后,我为同一问题提出了两个不同的解决方案,第一个将 inputSearch 保留在 YourComponent 中 (2认同)