#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, где вы проверяете и подтверждаете, что вход в систему выполнен успешно.