无法使用 react-native 应用程序中的 redux-persist 检查 index/main 文件中是否已加载持久状态
Unable to check if the persisted state has been loaded or not on index/main file using redux-persist in react-native app
我正在使用 redux 和 redux-persist 来保存和持久化状态。
在我的应用程序中,我需要根据 redux 中保存的状态来决定默认屏幕。
例如 - 如果用户已经登录,那么他在打开应用程序时不应再次看到登录屏幕。我需要直接跳转到下一个屏幕。
但即使我在 PersistGate 中渲染我的组件,我也会得到在我的 User reducer 中定义的初始状态,并且用户是总是被重定向到登录屏幕。在登录屏幕上,我得到了持久状态。唯一的问题是我找不到任何方法来在 index.js 文件中获得持久化状态。
这是我的 index.js 文件,我在其中添加了一个警报语句,我正在获取初始状态而不是持久状态 -
import React, { Component } from "react";
import { Provider } from "react-redux";
import { StyleProvider } from "native-base";
import reduxStore from "./setup/Store";
import { PersistGate } from "redux-persist/integration/react";
import Navigator from "./setup/Routes";
import SplashScreen from "react-native-splash-screen";
import Walkthrough from "./screens/Walkthrough/Walkthrough";
export default class Main extends Component {
componentWillMount() {
SplashScreen.hide();
}
render() {
const Login = Navigator("CustomerLogin");
const Profile = Navigator("Profile");
const Home = Navigator("CustomerHome");
return (
<Provider store={reduxStore.store}>
<PersistGate persistor={reduxStore.persistor}>
{alert(JSON.stringify(reduxStore.store.getState().User))}
{reduxStore.store.getState().User.is_logged_in &&
!reduxStore.store.getState().User.is_registered ? (
<Profile />
) : reduxStore.store.getState().User.is_registered ? (
<Home />
) : reduxStore.store.getState().User.walkthrough_visible ? (
<Walkthrough navigation={Login} />
) : (
<Login />
)}
</PersistGate>
</Provider>
);
}
}
这是我的 Store.js 文件 -
import { createStore, applyMiddleware, compose } from "redux";
import storage from "redux-persist/lib/storage"; // defaults to localStorage for web and AsyncStorage for react-native
import Reducers from "./Reducer";
import createSagaMiddleware from "redux-saga";
import rootSaga from "./Sagas";
import { persistStore, persistReducer } from "redux-persist";
const sagaMiddleware = createSagaMiddleware();
const middleWare = [sagaMiddleware];
const persistConfig = {
key: "root",
storage
};
const persistedReducer = persistReducer(persistConfig, Reducers);
// Add the autoRehydrate middleware to your redux store
const store = createStore(
persistedReducer,
compose(applyMiddleware(...middleWare))
);
sagaMiddleware.run(rootSaga);
let persistor = persistStore(store);
// Enable persistence
export default { store, persistor };
我该如何解决这个问题?
状态是异步加载的,需要等到完成。
对于类似情况,请参阅 PersistGate loading
或 onBeforeLift
props
https://github.com/rt2zz/redux-persist/blob/master/docs/PersistGate.md
<PersistGate
loading={<CircularIndicator message={"loading"} />}
onBeforeLift={onBeforeLift}
persistor={persistor}
>
<Router />
</PersistGate>
更新2:
更好的是二手状态,从PersistGate
传下来的。
您可以创建连接的分支组件:
const Branch=({User})=><View>{
!User.is_registered ? (
<Profile />
) : User.is_registered ? (
<Home />
) : User.walkthrough_visible ? (
<Walkthrough navigation={Login} />
) : (
<Login />
)}</View>
const mapStateToProps = (state) => {
return {
User: state.User/// get user
}
}
const BranchWithUser = connect(
mapStateToProps,
)(Branch)
export default class Main extends Component {
componentWillMount() {
SplashScreen.hide();
}
render() {
const Login = Navigator("CustomerLogin");
const Profile = Navigator("Profile");
const Home = Navigator("CustomerHome");
return (
<Provider store={reduxStore.store}>
<PersistGate
loading={<CircularIndicator message={"loading"} />}
onBeforeLift={onBeforeLift}
persistor={persistor}
>
<BranchWithUser />
</PersistGate>
</Provider>
);
}
}
我正在使用 redux 和 redux-persist 来保存和持久化状态。 在我的应用程序中,我需要根据 redux 中保存的状态来决定默认屏幕。
例如 - 如果用户已经登录,那么他在打开应用程序时不应再次看到登录屏幕。我需要直接跳转到下一个屏幕。
但即使我在 PersistGate 中渲染我的组件,我也会得到在我的 User reducer 中定义的初始状态,并且用户是总是被重定向到登录屏幕。在登录屏幕上,我得到了持久状态。唯一的问题是我找不到任何方法来在 index.js 文件中获得持久化状态。
这是我的 index.js 文件,我在其中添加了一个警报语句,我正在获取初始状态而不是持久状态 -
import React, { Component } from "react";
import { Provider } from "react-redux";
import { StyleProvider } from "native-base";
import reduxStore from "./setup/Store";
import { PersistGate } from "redux-persist/integration/react";
import Navigator from "./setup/Routes";
import SplashScreen from "react-native-splash-screen";
import Walkthrough from "./screens/Walkthrough/Walkthrough";
export default class Main extends Component {
componentWillMount() {
SplashScreen.hide();
}
render() {
const Login = Navigator("CustomerLogin");
const Profile = Navigator("Profile");
const Home = Navigator("CustomerHome");
return (
<Provider store={reduxStore.store}>
<PersistGate persistor={reduxStore.persistor}>
{alert(JSON.stringify(reduxStore.store.getState().User))}
{reduxStore.store.getState().User.is_logged_in &&
!reduxStore.store.getState().User.is_registered ? (
<Profile />
) : reduxStore.store.getState().User.is_registered ? (
<Home />
) : reduxStore.store.getState().User.walkthrough_visible ? (
<Walkthrough navigation={Login} />
) : (
<Login />
)}
</PersistGate>
</Provider>
);
}
}
这是我的 Store.js 文件 -
import { createStore, applyMiddleware, compose } from "redux";
import storage from "redux-persist/lib/storage"; // defaults to localStorage for web and AsyncStorage for react-native
import Reducers from "./Reducer";
import createSagaMiddleware from "redux-saga";
import rootSaga from "./Sagas";
import { persistStore, persistReducer } from "redux-persist";
const sagaMiddleware = createSagaMiddleware();
const middleWare = [sagaMiddleware];
const persistConfig = {
key: "root",
storage
};
const persistedReducer = persistReducer(persistConfig, Reducers);
// Add the autoRehydrate middleware to your redux store
const store = createStore(
persistedReducer,
compose(applyMiddleware(...middleWare))
);
sagaMiddleware.run(rootSaga);
let persistor = persistStore(store);
// Enable persistence
export default { store, persistor };
我该如何解决这个问题?
状态是异步加载的,需要等到完成。
对于类似情况,请参阅 PersistGate loading
或 onBeforeLift
props
https://github.com/rt2zz/redux-persist/blob/master/docs/PersistGate.md
<PersistGate
loading={<CircularIndicator message={"loading"} />}
onBeforeLift={onBeforeLift}
persistor={persistor}
>
<Router />
</PersistGate>
更新2:
更好的是二手状态,从PersistGate
传下来的。
您可以创建连接的分支组件:
const Branch=({User})=><View>{
!User.is_registered ? (
<Profile />
) : User.is_registered ? (
<Home />
) : User.walkthrough_visible ? (
<Walkthrough navigation={Login} />
) : (
<Login />
)}</View>
const mapStateToProps = (state) => {
return {
User: state.User/// get user
}
}
const BranchWithUser = connect(
mapStateToProps,
)(Branch)
export default class Main extends Component {
componentWillMount() {
SplashScreen.hide();
}
render() {
const Login = Navigator("CustomerLogin");
const Profile = Navigator("Profile");
const Home = Navigator("CustomerHome");
return (
<Provider store={reduxStore.store}>
<PersistGate
loading={<CircularIndicator message={"loading"} />}
onBeforeLift={onBeforeLift}
persistor={persistor}
>
<BranchWithUser />
</PersistGate>
</Provider>
);
}
}