Является ли навигационный реквизит неизменяемым / чистым? — react navigation v4

#javascript #reactjs #react-native #react-navigation

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

Вопрос:

Я использую React Navigation v4, и мне нужно знать navigation , является ли элемент неизменяемым, потому что я хочу обернуть свой компонент с React.memo

Для контекста вот мой (надеюсь) чистый компонент React:

     // notice the React.memo and the usage of navigation.state.routes and navigation.navigate
    const TabBarComponent: React.FC<Props> = React.memo(({ navigation }) => {
      const onSelect = (index) => {
        const { [index]: selectedTabRoute } = navigation.state.routes
        navigation.navigate(selectedTabRoute.routeName)
      }
    ...
   }
  

Комментарии:

1. Для будущих читателей здесь был дан ответ на вопрос: twitter.com/icookandcode/status/1312134830625153026

Ответ №1:

Я собираюсь ответить на свой собственный вопрос, основываясь на этом твите Сатьяджита Саху.

Он не является неизменяемым, но меняется только тогда, когда это необходимо (например, navigation.state изменяется). В v5 navigation.state перемещается в отдельный реквизит маршрута (или, в случае панели вкладок, реквизит состояния). Итак, да, вы можете обернуть компоненты, принимающие его, в React.memo.

Однако панель вкладок также принимает дополнительные реквизиты, такие как объект descriptors, содержащий параметры для каждого экрана. Так что это зависит от того, будет ли это иметь большое значение в зависимости от того, когда изменятся эти другие реквизиты.

По умолчанию все экраны обернуты в React.memo.

По сути, React Navigation не изменяет реквизит, когда в этом нет необходимости.

И это не делает ничего неизменным (например, с Object.freeze ), но они не рассматриваются как изменяемые внутренне, и вы не должны их изменять, подобно другим вещам в экосистеме React.