首页 > 解决方案 > 如何实现应用程序范围的搜索栏?

问题描述

在标题中拥有一个应用程序范围的搜索栏似乎是一项非常常见的任务。不幸的是,我还没有找到一些关于如何以正确方式完成它的现成食谱。我的解决方案是使用headerTitle在 React Native Navigation 标头中放置一个自定义SearchBox组件:

static navigationOptions = ({navigation}) => {
     headerTitle: () => (<SearchBox ... />)

它有其缺点,例如使用“静态”变量在应用程序和组件之间传递状态和行为。但它到目前为止工作。现在,在迁移到 RNN 4.1.1 后,由于 RNN 中如何实现标头的具体细节,它停止了工作:

在此处输入图像描述

TextInput 现在不填充标题的宽度并且不正确处理文本输入。

在此处输入图像描述

我正在寻找一种在 RN 中实现应用程序范围的搜索栏的方法,它具有以下属性:

更新

理想情况下,我正在寻找具有以下方面的答案:

标签: androidiosreact-nativemobilereact-navigation

解决方案


你几乎完成了,但不幸的是,我认为这在 react-navigation 4 中是不可能的。在最新的 5.0 中,现在已经可以生产了,你必须重写你的堆栈。

在 5.0 中,您可以使用useFocusEffect很好地检测Back Actions。所以,你的标题是这样的:

function SearchBar(props) {
  return (
    <TextInput />
  );
}

function StackScreen() {
  return (
    <Stack.Navigator>
      <Stack.Screen
        name="Home"
        component={HomeScreen}
        options={{ headerTitle: props => <SearchBar {...props} /> }}
      />
    </Stack.Navigator>
  );
}

问题是,您必须在每个屏幕上重复选项和 useFocusEffect 逻辑。

另一种方法可能是:

  1. 全局禁用所有标头
  2. 在所有屏幕中,创建如下布局:
      <View style={{ flex: 1 }}>
        <MyAppbarHeader title={'PageA'} resetOnBack={false/true} />
        <View style={{ flex: 1, margin: 8 }}>
          <FlatList
            data={someDataOnMyScreen}
            renderItem={renderItem}
          />
        </View>
      </View>

您可以将标题作为MyAppbarHeader道具传递,以及其他道具(如 resetOnBack)并在此功能组件中实现逻辑。


推荐阅读