我和我目前的一個項目有同樣的問題。這是我如何找到一個好的解決方案。我相信我的一些代碼可以更好地重構......但它應該有助於給你一個想法。基本上,我使用基於令牌的身份驗證,並檢查應用程序在本地存儲器中是否存在令牌時呈現的內容,如果是,則該用戶被「驗證」。這個用戶對服務器發出的任何請求都會附加該令牌,後端可以驗證該令牌是否有效,如果不是,那麼我可以返回一個動作來刪除該令牌,然後將令牌記錄下來。
我有一個索引頁是這樣的:
import React, { Component } from 'react';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import reducers from './reducers';
import ReduxThunk from 'redux-thunk';
import Content from './app';
class App extends Component {
render() {
const store = createStore(reducers, {}, applyMiddleware(ReduxThunk));
return(
<Provider store={store}>
<Content />
</Provider>
);
}
}
export default App;
這讓我Redux的使用與我處存放...然後我得到我的實際應用內容從我的app.js文件看起來像這樣:
import React, { Component } from 'react';
import { View, StatusBar, Platform, AsyncStorage, ActivityIndicator } from 'react-native';
import { Tabs, Drawer, LoginStack } from './config/router';
import { connect } from 'react-redux';
import { checkLogin } from './actions';
class Content extends Component {
componentWillMount() {
this.props.checkLogin();
}
render() {
if (this.props.checkingUser) {
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<ActivityIndicator size="large" />
</View>
);
}
if (this.props.token) {
if (Platform.OS === 'ios') {
return <View><StatusBar barStyle="light-content" /><Tabs /></View>;
}
return <Drawer />;
}
return <View><StatusBar barStyle="light-content" /><LoginStack /></View>;
}
}
const mapStateToProps = ({ auth }) => {
const { token, checkingUser } = auth;
return { token, checkingUser };
}
export default connect(mapStateToProps, { checkLogin })(Content);
然後,我有我的checkLogin行動,看起來像這樣:
export const checkLogin =() => {
return (dispatch) => {
doCheck(dispatch);
}
}
const doCheck = async dispatch => {
let token = await AsyncStorage.getItem('token');
if (token) {
dispatch({ type: LOGGED_IN, payload: token });
} else {
dispatch({ type: LOGGED_OUT });
}
}