Как создать настраиваемые параметры заголовка для каждого экрана.

Я ищу способ установить пользовательские параметры заголовка (стиль, значки, включение / отключение кнопки возврата, левый и правый параметры для заголовка) для каждого экрана в стеках, сохраняя при этом многостековую архитектуру для моего приложения в ответ родные? Так сейчас выглядит мой App.js, и я готов изменить его, если потребуется.

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;



Ответы (2)


Не уверен, что это то, что вам нужно, но вот как я настраиваю значение "borderColor" для моего компонента заголовка.

Вы можете передать любые параметры, которые захотите, с помощью метода setOptions компонента navigation. Он будет заполнен параметром scene.descriptor.options.

Ниже приведен пример того, как я использую его в своем приложении.

header опции для моего экрана / навигатора.

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}
        />;
    }

И в любом из компонентов экрана я могу использовать

useLayoutEffect(() => {
    navigation.setOptions({
        borderColor: 'orange'
    })
}, [ navigation ])

Теперь мой <HeaderBar> компонент получит свойство borderColor, значение которого - «оранжевый».

export const HeaderBar = ({ options, title, previous, navigation, borderColor = 'yellow' }) => {
    [...]
    console.log(borderColor); // orange
}

Как видите, мой компонент HeaderBar также получает полные параметры в качестве опоры, поэтому я мог бы пропустить опору borderColor и проверить параметры внутри самого компонента заголовка.

Вот так

export const HeaderBar = ({ options, title, previous, navigation }) => {
    const { borderColor } = options;
    [...]
}

Надеюсь, это поможет вам, если не поздно.

person paul b.    schedule 12.06.2020

Хорошо. Вы можете скрыть заголовок по умолчанию для реакции-навигации в своем стеке.

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>

Затем вы можете настраивать компонент заголовка и импортировать его на каждый свой экран. Извините, потому что мой EL. надеюсь помочь U.

person Trịnh Đức Duy    schedule 29.04.2020
comment
На самом деле это не помогает, поскольку всегда можно использовать отдельный заголовок. Я бы хотел добиться этого, реагируя на сам навигатор - person Nata Vacheishvili; 29.04.2020