【问题标题】:React Native: React Navigation - use the same header component in every screen?React Native:React Navigation - 在每个屏幕中使用相同的标题组件?
【发布时间】:2019-07-02 02:54:26
【问题描述】:

所以,我正在尝试使用 React Navigation,并且我想在我的所有屏幕上使用相同的 Header 组件。

我使用expo-cli 创建项目。

在我的MainTabNavigator.js 文件中,我有一个HomeStackSettingsStack,它们看起来像这样:

const config = Platform.select({
  web: { headerMode: "screen" },
  default: {}
});

const HomeStack = createStackNavigator(
  {
    Home: HomeScreen
  },
  config
);

HomeStack.navigationOptions = {
  tabBarIcon: ({ focused }) => (
    <NavButton
      focused={focused}
      name={focused ? "star" : "create"}
      label={focused ? "Save" : "New"}
    />
  )
};

HomeStack.path = "";

在文件的底部,我有我的tabNavigator

const tabNavigator = createBottomTabNavigator(
  {
    HomeStack,
    SettingsStack
  },
  {
    tabBarOptions: {
      inactiveTintColor: "#fff",
      labelStyle: {
        fontSize: 14
      },
      showLabel: false,
      style: {
        backgroundColor: "#fff",
        borderTopColor: "#fff",
        height: 70,
        paddingBottom: 10,
        paddingTop: 10
      }
    }
  }
);

tabNavigator.path = "";

export default tabNavigator;

我尝试在createBottomTabNavigator 函数中的tabBarOptions 上方的navigatorOptionsdefaultNavigationOption 中添加一个&lt;Header /&gt; 组件。

与此类似:

...
  {
    navigationOptions: {
      header: <Header />
    },
    tabBarOptions: {
      inactiveTintColor: "#fff",
      labelStyle: {
        fontSize: 14
      },
 ...

但这只是给了我一个空白标题...没有使用我的组件。

我目前有我想要的功能,但我必须进入每个Screen 文件并添加:

HomeScreen.navigationOptions = {
  header: <Header />
};

目前使用"react-navigation": "^3.11.0"

感谢任何帮助!

【问题讨论】:

    标签: react-native react-native-navigation


    【解决方案1】:

    这就是我实现这一目标的方式。 像这样创建一个 CustomHeader 组件:

    const MyHeader = (navigation) => {
    return {
        header: props => <MyCustomHeader {...props} />,
        headerStyle: { backgroundColor: '#fff' },
        headerTintColor: '#000',
    };
    }
    

    然后将其包含在堆栈导航器的defaultNavigationOptions

    const AppNavigator = createStackNavigator(
    {
        Launch: {
            screen: LaunchComponent,
        }
    },
    {
        initialRouteName: "Launch",
        defaultNavigationOptions: ({ navigation }) => {
            return MyHeader(navigation)
        }
    }
    )
    

    【讨论】:

    • 嘿,谢谢哈姆扎,我用你的回答让事情变得有效。本质上是一样的,但是,由于我有多个 createStackNavigator 调用,我只是将您的建议添加到配置对象并将配置添加到每个方法调用。我也会在这里发布涵盖我独特细节的答案。
    • 您能否解释一下为什么会这样?
    • 嘿 Daltron,React 官方文档很好地解释了这一点。经历一次,这将是一笔巨大的时间投资。 reactnavigation.org/docs/en/…
    • return 关键字是我所缺少的
    【解决方案2】:

    将您的 StackNavigator 设置为您的 BottomTabNavigator 的父级,这样您就可以为所有的 bottomTabs 提供一个标题。 如果您使用这种方法,并且由于某种原因需要在您的标题上添加 backButton,您必须自己手动更改它。

    const bottomTabNavigator = createBottomTabNavigator(bottomRoutesConfig, bottomNavigatorConfigs)
    
    createStackNavigator:({ tabNavigator : bottomTabNavigator },{ defaultNavigationOptions :{ header : <Header/> }})
    

    这样做,您可以为所有屏幕使用一个全局标题,但如前所述,要根据屏幕更改标题上的某些内容,您必须自己更改它,使标题知道用户当前所在的位置。

    【讨论】:

      【解决方案3】:

      我想为 DrawerNavigator 实现类似的解决方案。这样做的唯一方法是创建 HOC 组件。

      import React, {Fragment} from 'react';
      
      const NavHeader = props => {
       // ... NavHeader code goes here 
      };
      
      export const withHeader = Component => {
        return props => {
          return (
            <Fragment>
              <NavHeader {...props} />
              <Component {...props} />
            </Fragment>
          );
        };
      };
      

      然后在你的抽屉里做:

      <Drawer.Navigator>
          <Drawer.Screen
            name={ROUTES.DASHBOARD}
            component={withHeader(DashboardContainer)} // <--- Wrap it around component here.
          />
      </Drawer.Navigator>
      

      【讨论】:

        【解决方案4】:

        在每个屏幕中将header 设置为null 并在每个屏幕上加载您的组件

        class HomeScreen extends Component {
            static navigationOptions = {
                header: null,
            };
        
            render(){
            return(
              <View style={{flex:1}}>
                  <Header />
              </View>
             )
           }
        }
        

        所以,react-navigation 的默认 header 将是 null,您可以将自定义组件加载为标题

        class HomeScreen extends React.Component {
          static navigationOptions = {
            // headerTitle instead of title
            headerTitle: <Header />,
          };
        
          /* render function, etc */
        }
        

        使用headerTitle 而不是title 来加载您的自定义组件

        【讨论】:

        • 此方法的缺点是您无法访问标题内的导航道具 - 这会阻止您执行返回操作
        猜你喜欢
        • 1970-01-01
        • 2019-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-21
        • 1970-01-01
        相关资源
        最近更新 更多