Недавно я заметил очень странное поведение Redux в моем приложении, которым я хотел бы поделиться с вами. Когда я нажимаю эту TouchableOpacity в моих настройках, чтобы отключиться, я получаю следующую ошибку:
TypeError: Невозможно прочитать свойство first_name of null
с Homepage.js
Итак, мой код выдает ошибку для того компонента, который находится на странице, куда я не должен идти.
Homepage.js
<AppText textStyle={styles.title}>
Welcome {userReducer.infos.first_name}
</AppText>
Рабочий процесс, который должен произойти, заключается в том, что пользователь нажимает кнопку разъединения, затем вызывается функция tryLogout, которая запускает действие с типом «ВЫХОД». Затем это действие устанавливает в ноль пользовательские данные и информацию с некоторыми дополнительными логическими значениями. Состояние обновляется, затем пользовательский интерфейс должен быть повторно обработан и вызвана componentWillUpdate (). Там я проверяю свое состояние, чтобы перенаправить пользователя на приземляющуюся / не подключенную навигацию.
Я попытался прокомментировать infos: null
в моем редукторе, и мой код обрабатывает без ошибок.
Эта переменная нигде в моем приложении не просит перенаправить на любую страницу.
Отладка может показаться сложной, поскольку проблема должна быть глубже, чем кажется. В любом случае, возможно, у кого-то уже была подобная проблема, поэтому я привожу здесь потенциальные элементы, чтобы попытаться решить эту проблему.
Settings.js
import { tryLogout } from '@actions/user'
const mapDispatchToProps = dispatch => ({
tryLogout: () => dispatch(tryLogout()),
})
class Settings extends React.Component<Props, State> {
// What should normally happen
componentDidUpdate(prevProps: Props) {
const { userReducer, navigation } = this.props
if (
prevProps.userReducer.isSignedUp !== userReducer.isSignedUp ||
prevProps.userReducer.isLoggedIn !== userReducer.isLoggedIn
) {
if (!userReducer.isSignedUp && !userReducer.isLoggedIn) {
navigation.navigate('Landing')
}
}
}
// Inside my render() method
<AppTouchableOpacity
onPress={() => tryLogout()}
style={styles.touchableOpacity}
>
Disconnect
</AppTouchableOpacity>
}
действия / user.js
export const tryLogout = (): Function => (dispatch: Function) => {
const logout = () => ({
type: LOGOUT,
})
dispatch(logout())
}
редукторы / user.js
case LOGOUT:
return {
...state,
data: null,
infos: null,
isLoggedIn: false,
isSignedUp: false,
}
App.js (я использую React Navigation)
const LandingScenes = {
Welcome: { screen: WelcomeScreen },
{ /* Some other screens */ }
}
const LandingNavigator = createStackNavigator(LandingScenes, {
initialRouteName: 'Welcome',
defaultNavigationOptions: {
header: null,
},
})
const SecuredScenes = {
Homepage: { screen: HomepageScreen },
Settings: { screen: SettingsScreen },
{ /* Some other screens */ }
}
const SecuredNavigator = createStackNavigator(SecuredScenes, {
initialRouteName: 'Homepage',
defaultNavigationOptions: {
header: null,
},
})
export default createAppContainer(
createSwitchNavigator(
{
Landing: LandingNavigator,
Secured: SecuredNavigator,
},
{
initialRouteName: 'Landing',
}
)
)