Как условно отобразить drawerLabel в DrawerNavigator

Недавно я добавил в приложение новый экран, и этот экран должен быть доступен только определенным пользователям, которые вошли в систему.

class DemoScreen extends Component {
  static navigationOptions = {
    title: 'Title',
    drawerLabel: ({ tintColor, focused }) => {
      return (
        <MainMenuItem
          textKey = {TEXTKEY}
          iconName = "cellphone-settings"
          focused = {focused}
          tintColor = {tintColor}
        />
      );
    }
  };
// Skipping rest of the code
}

Этот компонент подключен к хранилищу redux, поэтому он имеет доступ к информации о пользователях. Но доступ к this.props.<FIELD> внутри navigationOptions невозможен.

Мои маршруты выглядят так

const MainMenu = DrawerNavigator(
  {
    // Other screens here
    Demo: { screen: DemoScreen },
  },
  {
    drawerWidth: 250,
    drawerPosition: 'left',
    contentComponent: MenuDrawerContent,
    contentOptions: drawerContentOptions
  }
);

export const Routes = {
  // Other routes here
  Main: {
    screen: MainMenu,
    navigationOptions: {
      gesturesEnabled: false
    }
  }
};

Я хочу отображать DemoScreen MainManuItem только для определенного типа вошедшего в систему пользователя. Как мне этого добиться? Где должна находиться эта логика?

Спасибо.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
1 111
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Добавьте функцию componentWillMount (которая получает реквизиты) в свой DemoScreen. В этой функции считайте из props, а затем, в зависимости от типа пользователя, вы можете вместо этого создать свои navigationOptions в состоянии объекта. Вы все равно можете передать параметр "gesturesEnabled" в компонент - он также войдет в качестве реквизита в функцию componentWillMount.

componentWillMount вызывается перед монтированием. Чтобы выполнить монтаж, мне нужно щелкнуть по самому пункту меню. Я не хочу этого делать. Я хочу, чтобы мой пункт меню не был виден для определенных типов пользователей.
Andrei Olar 08.06.2018 10:34
Ответ принят как подходящий

Мне удалось решить эту проблему, переместив navigationOptions с экрана на Маршруты. Это выглядит сейчас так

const MainMenu = DrawerNavigator(
  {
    // Other screens here
    Demo: { 
      screen: DemoScreen,
      navigationOptions: {
        title: 'Title',
        drawerLabel: ({ tintColor, focused }) => {
          const id = store.getState().field;
          const valid = [1234, 2345];
          if (!valid.includes(id)) {
            return null;
          }

          return (
            <MainMenuItem
              textKey = {TEXT}
              iconName = "cellphone-settings"
              focused = {focused}
              tintColor = {tintColor}
           />
          );
        }
      }
    },
  },
  {
    drawerWidth: 250,
    drawerPosition: 'left',
    contentComponent: MenuDrawerContent,
    contentOptions: drawerContentOptions
  }
);

export const Routes = {
  // Other routes here
  Main: {
    screen: MainMenu,
    navigationOptions: {
      gesturesEnabled: false
    }
  }
};

Я не уверен, что это лучший подход, но он работает.

У меня есть несколько предупреждений eslint, которые я не знаю, как решить. Это:

1. component definition is missing display name

2. 'focused' and 'tintColor' is missing in props validation

Оба предупреждения находятся в этой строке: drawerLabel: ({ tintColor, focused }) => {. На данный момент я их проигнорировал, но знает ли кто-нибудь, как их исправить в этом случае?

Другие вопросы по теме