键入后,FlatList 中的 SearchBar 失去焦点

bdo*_*leu 7 javascript react-native

我正在通过道具使用SearchBar组件并根据搜索值过滤项目列表。问题是,在输入一个字符后,搜索栏失去焦点(键盘被移除)——这几乎就像组件重新渲染一样?我在这里缺少什么?FlastListListHeaderComponent

我使用的是Android的,如果我移动不发生问题SearchBar的外部FlatList

import React from 'react'
import {FlatList, View} from 'react-native'
import { ListItem, SearchBar } from 'react-native-elements'

export const Component = (props) => {
  const [search, setSearch] = React.useState('');
  const [items, setItems] = React.useState([
    { id: 1, name: 'One Thousand' },
    { id: 2, name: 'Two Hundred' },
  ]);

  const filterItems = (items, filter) => {
    return items.filter(item => item.name.toLowerCase().includes(filter.toLowerCase()))
  }

  const renderHeader = () => (
    <SearchBar
      placeholder='Search...'
      onChangeText={setSearch}
      value={search}
    />
  );

  const renderItem = ({ item }) => (
    <ListItem
      title={item.name}
      bottomDivider
      chevron
    />
  );

  return (
    <FlatList
      data={filterItems(items, search)}
      keyExtractor={item => item.id.toString()}
      renderItem={renderItem}
      ListHeaderComponent={renderHeader}
      stickyHeaderIndices={[0]}
    />
  )
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 12

为了轻松解决这个问题,尽量不要使用单独的组件渲染ListHeaderComponent,而是直接使用render

   <FlatList
      ...
      ListHeaderComponent={
        <Searchbar
          placeholder="Search"
          onChangeText={query => {
            setSearch(query);
          }}
          value={search}
        />
      }
    />
Run Code Online (Sandbox Code Playgroud)

  • 这是从根本上理解 React 的一件极其重要的事情:如果一个功能组件没有稳定的引用(比如传递一个箭头函数作为 prop),那么 React 将无法识别它应该是同一个组件呈现。因此,它将每次创建一个新组件,这将丢弃该组件具有的任何状态,并且计算成本也很高。 (3认同)