【发布时间】:2021-07-06 13:20:59
【问题描述】:
在我的 React Native 应用程序中,实际上我需要使用导航和 redux 实现一个简单的注销,但是当我从我的主页 (按下注销按钮)发送注销操作时出现错误,因为在 Home 中,我呈现当前用户,并且在那一刻不存在。
我需要调度 Logout(删除当前用户)并导航到登录页面而不再次渲染 Home 或知道如何在渲染之前实现 componentWillMount.... 如何?
我的简历代码: (登录有效,我没有输入登录代码)
App.tsx
import React, {useState} from 'react';
import { NavigationContainer, StackActions } from '@react-navigation/native';
//... many imports
const store = createStore(rootReducer);
export default class App extends React.Component {
constructor(props) {
super(props);
this.state = { loading: true };
}
async componentDidMount() {
//... some code
}
render(){
if (this.state.loading) {
return (
<Root>
<AppLoading />
</Root>
);
}
else {
return (
<Provider store={store}>
<Root>
<NavigationContainer>
<Navigator/>
</NavigationContainer>
</Root>
</Provider>
);
}
}
}
Navigator.tsx
import React from 'react'
import { createStackNavigator } from '@react-navigation/stack'
import {connect} from 'react-redux'
import Login from '../Views/Login'
import Home from '../Views/Home'
const Stack = createStackNavigator();
const Navigator= (props) =>{
const {users} = props;
return (
<Stack.Navigator>
{console.log('Navigator here, '+users.current)}
{users.current ===null ?
(<>
<Stack.Screen name="Login" component={Login} options={{headerShown:false}}/>
</>)
: (<>
<Stack.Screen name="Home" component={Home} options={{headerShown:false}}/>
</>)
}
</Stack.Navigator>
);
}
const mapStateToProps=(state)=>{
const {users} = state;
return {users};
}
export default connect(mapStateToProps)(Navigator);
Home.tsx(在注销后导航?)
import React from 'react'
import {Text, Container, Content, View, Button, Icon} from 'native-base'
import Styles from './Styles/HomeStyles'
import {connect} from 'react-redux'
import {Auth} from '../Services/Auth/AuthService'
const Home =(props) => {
const {navigation, users} = props;
return(
<Container >
<Content >
<View style={Styles.content}>
<Text>Hi {users.current.id}</Text>
<Button onPress={()=>Logout(users.current.id)} >
<Icon name='exit' />
</Button>
</View>
</Content>
</Container>
);
async function Logout(id:string){
console.log('Function start');
await Auth.LogoutUser(id, props);
navigation.navigate('Login');
}
}
const mapStateToProps=(state)=>{
const {users} = state;
return {users};
}
export default connect(mapStateToProps)(Home);
UserReducer.tsx
const Initial_State={
current:null
}
export function UserReducer(state=Initial_State, action:any){
switch (action.type){
case 'ADD_USER':
return{
...state,
current: action.user
};
case 'DELETE_USER':
return{
...state,
current: null
};
default:
return state;
}
}
AuthService.tsx(这里是调度)
export const Auth={
LoginUser,
LogoutUser
}
async function LogoutUser(id: string, props: any){
await props.dispatch({type : 'DELETE_USER', id});
}
async function LoginUser(AuthData:IAuthData, props: any){
//...some code
}
【问题讨论】:
标签: react-native redux react-navigation logout dispatch