Динамическое изменение вкладки «Вход» на вкладке «Мой профиль» после входа пользователя в систему

#ios #reactjs #react-native #react-redux #react-navigation

#iOS #reactjs #react-native #реагирование-сокращение #реакция-навигация

Вопрос:

При запуске приложения отображается нижняя вкладка «Вход». Чего я пытаюсь добиться, так это изменить отображаемую вкладку «Вход» на вкладку «Мой профиль» после того, как пользователь вошел в приложение.

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

Вот две объявленные вкладки:

 // MainTabNavigator.js

const LoginStack = createSwitchNavigator({
  Login: LoginScreen,
});

LoginStack.navigationOptions = {
  tabBarVisible: true,
  tabBarLabel: 'Login',
  tabBarIcon: ({ focused }) => (
    <TabBarIcon
      focused={focused}
      name={Platform.OS === 'ios' ? 'ios-link' : 'md-link'}
    />
  ),
}

const MyProfileStack = createSwitchNavigator({
  MyProfile: HomeScreen,
});

MyProfileStack.navigationOptions = ({navigation}) => ({
  tabBarVisible: true,
  tabBarLabel: 'My Profile',
  tabBarIcon: ({ focused }) => (
    <TabBarIcon
      focused={focused}
      name={Platform.OS === 'ios' ? 'ios-person' : 'md-person'}
    />
  ),
})

export default createBottomTabNavigator({ LoginStack })
  

Я попытался создать другой компонент и подключить его, а затем импортировать его в файл страницы tabs, но я не могу использовать возвращаемое значение isLoggedIn().

 // IfLoggedIn.js

function IsLoggedIn(props) {
  return props.loginState.isLoggedIn ? true : false
}

const mapStateToProps = ({ loginState }) => ({
  loginState
});

const mapDispatchToProps = (dispatch) => bindActionCreators({
  setLoginState
}, dispatch);

export default connect(mapStateToProps,mapDispatchToProps)(IsLoggedIn)
  

Я думал, что могу использовать это в файле страницы tabs следующим образом:

 // MainTabNavigator.js

const InterChangeTab = IsLoggedIn ? MyProfileStack : LoginStack
export default createBottomTabNavigator({ InterChangeTab })
  

Но это не сработало, потому что isLoggedIn является компонентом, а не обычной функцией.

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

1. переводим ее в состояние с помощью rerender.

2. @SnehaBharti Я думаю, что у нас такая же проблема с использованием state: github.com/react-navigation/react-navigation/issues/1171 , Как вы повторно настраиваете навигацию react?

3. ДА.. функция сборки 2.. 1 для входа в систему и один после входа в систему и заставить их работать, используя условие

4. @SnehaBharti Извините, я не понимаю, где мне создать эти 2 функции?

Ответ №1:

Почему бы не вернуть свой LoginStack или MyProfileStack прямо на свой IfLoggedIn ?

 function IsLoggedIn(props) {
  return ({props.loginState.isLoggedIn ? <MyProfileStack /> : <LoginStack />})
}
  

На самом деле, IMO, я предпочитаю использовать другой SwitchNavigator для переключения между экраном входа в систему и экранами моего содержимого, проверьте этот react navigation docs в потоке аутентификации

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

1. Я пробовал это, но он говорит: «Для этого навигатора отсутствует элемент навигации. В react-navigation 3 вы должны настроить контейнер вашего приложения напрямую ‘

2. Использовали createAppContainer свой root navigator ?

3. Я полагаю, вы пытаетесь выполнить проверку подлинности в документах? Можете ли вы поделиться всеми имеющимися у вас стеками navigator, а также откуда вы пытаетесь вызвать navigation prop?

4. Эй, я только что просмотрел ваш код. У меня есть 1 совет: вы можете полностью избавиться от своего IfLoggedIn.js и включить как свой логин, так и стек профилей MainTabNavigator .

5. Для навигации вы можете либо проверить свое состояние на componentDidUpdate своем login экране, а затем перейти к профилю , либо (ИМО еще лучше) отправить действие навигации в вашем redux action, где вы проверяете и подтверждаете, что вход в систему выполнен успешно.