首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为每个屏幕创建自定义标题选项,多栈导航react原生?

如何为每个屏幕创建自定义标题选项,多栈导航react原生?
EN

Stack Overflow用户
提问于 2020-04-29 09:10:24
回答 2查看 2.1K关注 0票数 1

我正在寻找一种方法来为堆栈中的每个屏幕设置自定义标题选项(样式,图标,启用/禁用后退按钮,标题的左和右选项),同时在react native中维护我的应用程序的多堆栈架构?这就是我的App.js现在的样子,如果需要的话,我愿意改变它。

代码语言:javascript
复制
const Stack = createStackNavigator();
const App = () => {
  const ref = React.useRef();
  const { getInitialState } = useLinking(ref, {
    prefixes: ['FoodApp://'],
  });

  const AuthStack = createStackNavigator();

  function AuthStackScreen() {
    return (
      <AuthStack.Navigator>
        <AuthStack.Screen name="LogIn" component={LogIn} />
        <AuthStack.Screen name="SignUp" component={SignUp} />
      </AuthStack.Navigator>
    );
  }

  const AppStack = createStackNavigator();

  //I'd like to set different header options for each of the screen here
  function AppStackScreen() {
    return (
      <AppStack.Navigator>
        <AppStack.Screen name="MenuCategoryItems" component={MenuCategoryItems} />
        <AppStack.Screen name="Delivery" component={Delivery} />
        <AppStack.Screen name="Account" component={Account} />
        <AppStack.Screen name="Notification" component={Notification} />
        <AppStack.Screen name="Cart" component={Cart} />
      </AppStack.Navigator>
    );
  }

  //TODO: pass customized bar components
  const Tab = createBottomTabNavigator();

  //I'd like to set different header options for each of the screen here
  function Tabs(){
      return (
          <Tab.Navigator tabBar={props => <BottomMenu {...props} />}>
              <Tab.Screen name="Home" component={Home} />
              <Tab.Screen name="Delivery" component={Delivery} />
              <Tab.Screen name="Account" component={Account} />
              <Tab.Screen name="Notification" component={Notification} />
              <Tab.Screen name="Cart" component={Cart} />
          </Tab.Navigator>
      );
  }

  return (
      <NavigationContainer>
          <Stack.Navigator>
              <Stack.Screen name="Home" component={Tabs} />
              <Stack.Screen name="AppStack" component={AppStackScreen} />
              /*Should I place something else here so that I have access to both AppStack and Tabs navigations?*/
          </Stack.Navigator>
      </NavigationContainer>
  );
};

export default App;
EN

回答 2

Stack Overflow用户

发布于 2020-06-12 16:38:05

我不确定这是否是你需要的,但下面是我如何为我的header组件定制一些"borderColor“值。

您可以通过navigation组件的setOptions方法传递所需的任何选项。它将填充到scene.descriptor.options参数中。

下面是我如何在我的应用程序中使用它的示例。

屏幕/导航器的header选项。

代码语言:javascript
复制
header: ({scene, previous, navigation}) => {
        const {options} = scene.descriptor;

        let borderColor = options.borderColor ?? 'yellow';

        if (scene.route.name.startsWith('Test')) {
             borderColor = 'blue';
        }

        return <HeaderBar options={options}
                          title={title}
                          previous={true}
                          navigation={navigation}
                          borderColor={borderColor}
        />;
    }

在我可以使用的任何屏幕组件中

代码语言:javascript
复制
useLayoutEffect(() => {
    navigation.setOptions({
        borderColor: 'orange'
    })
}, [ navigation ])

现在,我的<HeaderBar>组件将收到一个属性borderColor,它的值是'orange‘。

代码语言:javascript
复制
export const HeaderBar = ({ options, title, previous, navigation, borderColor = 'yellow' }) => {
    [...]
    console.log(borderColor); // orange
}

正如您所看到的,我的HeaderBar组件还接收作为道具的完整选项,因此我可以跳过borderColor道具,检查header组件本身中的选项。

就像这样

代码语言:javascript
复制
export const HeaderBar = ({ options, title, previous, navigation }) => {
    const { borderColor } = options;
    [...]
}

希望它能帮助你,如果不是太晚的话。

票数 3
EN

Stack Overflow用户

发布于 2020-04-29 10:45:45

井。你可以在你的堆栈中隐藏react导航的头部默认设置。

代码语言:javascript
复制
function AppStackScreen() {
return (
  <AppStack.Navigator headerMode={'none'}>
    <AppStack.Screen name="MenuCategoryItems" component={MenuCategoryItems} />
    <AppStack.Screen name="Delivery" component={Delivery} />
    <AppStack.Screen name="Account" component={Account} />
    <AppStack.Screen name="Notification" component={Notification} />
    <AppStack.Screen name="Cart" component={Cart} />
  </AppStack.Navigator>

然后,您可以自定义标题组件并将其导入到每个屏幕中。抱歉因为我的艾尔。希望对你有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61492570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档