Параметры навигации React v5 / настройки в виде функций

#reactjs #react-native #react-navigation #react-navigation-v5

#reactjs #react-native #react-навигация #react-навигация-v5

Вопрос:

Итак, в документах для React-Navigation V5 говорится, что для добавления параметров в Screen вам необходимо получить доступ к следующему синтаксису

 <SettingsStack.Navigator>
  <SettingsStack.Screen
    name="B"
    component={B}
    options={{ tabBarLabel: 'Settings!' }}
  />
<SettingsStack.Navigator />
  

options Это объект, мой вопрос был бы в том, может ли это сработать, если я попытаюсь сделать это как функцию, то же самое касается setOptions метода навигации, он должен быть передан как

Это помогло бы мне, например, в удалении дублирования кода

 navigation.setOptions({
    headerLeft: () => Platform.select({
      ios: (
        <NavigationHeader.TextButton
          label={t('general.cancel')}
          onPress={navigation.pop(1)} //duplicated
        />
      ),
      android: (
        <NavigationHeader.IconButton
          iconName="times"
          label={t('general.cancel')}
          onPress={navigation.pop(1)} //duplicated 
        />
      )
    })
  });
  

Я дважды пишу одно и то же в onPress

Ответ №1:

Вы могли бы создать функцию, которая принимает функцию в качестве параметра, который определяет, что вы хотели бы сделать при нажатии на левую кнопку заголовка. Затем внутри этой функции вы можете вернуть функцию, которая возвращает ваш компонент headerLeft:

 function leftButton(clickHandler) {
  return () =>
    Platform.select({
      ios: (
        <NavigationHeader.TextButton
          label={t('general.cancel')}
          onPress={clickHandler}
        />
      ),
      android: (
        <NavigationHeader.IconButton
          iconName="times"
          label={t('general.cancel')}
          onPress={clickHandler}
        />
      ),
    });
}

// ...

navigation.setOptions({
  headerLeft: leftButton(() => {
    navigation.pop(1);
  }),
});
  

leftButton является примером функции более высокого порядка:https://en.wikipedia.org/wiki/Higher-order_function.

Таким образом, вы можете настроить clickHandler в одном месте, и onPress он будет обновлен для обеих кнопок.