开发者问题收集

React native 和 redux 仍然无法正常工作

2017-12-19
5746

我正在使用 redux-persist 将数据存储在我的 react-native 应用程序中。 这是代码:

store.js

import { createStore, compose, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import {
  persistStore,
 persistCombineReducers,
} from 'redux-persist';
import { AsyncStorage } from 'react-native';
import { composeWithDevTools } from 'redux-devtools-extension';
import user from './reducers/user';
import auth from './reducers/auth';

const config = {
  key: 'root',
  storage: AsyncStorage,
};

const reducers = persistCombineReducers(config, {
  user,
  auth
});

export const configureStore = () => {
 const store = createStore(
  reducers,
   compose(
    applyMiddleware(thunk),
    )
  );
  const persistor = persistStore(store);

  return { persistor, store };
};

然后在 App.js 中我有这个:

const { persistor, store } = configureStore();
 const onBeforeLift = () => {
  // take some action before the gate lifts
  store.dispatch(startingApp());
}
return (
  <Provider store={store}>
    <PersistGate
      loading={<HomeLoader />}
      onBeforeLift={onBeforeLift}
      persistor={persistor}>
        <RootNav />
      </PersistGate>
  </Provider>

当我从 App.js componentDidMount 调度和操作时,一切都正常。 问题是,当我从组件触发操作时,状态不会被存储,因此当我重新启动应用程序时,状态就会消失。

我所做的只是调用操作并传递数据:

this.props.onSetAuthData(data.credentials);

正如我在控制台中看到的那样,状态已更新,但如果我重新启动应用程序,则只会保存 App.js 中操作创建的状态,而不会保存

也许这与 RootNav 组件有关?

也许我导出了错误的 Reducer? 我有 const user = (state = initialState, action = {}) => {} export default user。 其他 Reducer 也一样: const auth = (state = initialState, action = {}) => {} 导出默认身份验证。

然后我使用 CombineReducers({auth, user}) 导出

这有错吗?

3个回答

使用 Reacttotron 等工具查看您的商店是否已持久化。

https://github.com/infinitered/reactotron

如果它已经持久化,您的组件应该等到商店在应用启动时重新水化。有时我无法使用 redux persist 使用 persistgate 等待持久存储重新水化。因此,我在 async componentWillMount 上将存储和持久器设置为状态,然后在渲染中检查存储是否不为空(null)并且已经重新水化,然后加载您的应用程序。

constructor(){
    super();
    this.state = {store: null, persistor: null}
  }
  async componentWillMount () {
    const store = configureStore();
    this.setState({ store: store.store })
    this.setState({ persistor: store.persistor })
  }
  render(){
    return (
    if (this.state.store === null) {
      return (
        <View>
          <Text>Loading...</Text>
        </View>
        );
    }
    <Provider store={this.state.store} persistor={this.state.persistor}>
          <RootNav />
    </Provider>

还尝试将您的存储从 AsyncStorage 更改为 storage

const config = {
  key: 'root',
  storage,
};

首先导入存储 import storage from 'redux-persist/es/storage';

DennisFrea
2017-12-20

有时它会使用 persistConfig 中的键调用错误。尝试键:' primary '

const primary = {
key: 'root',
storage: AsyncStorage,
blacklist: [],
whitelist: ['user'],
};
Muhammad Haidar
2021-09-01

就我而言,这实际上是 AsyncStorage 库本身的问题(另请参阅此 问题 )。

我最终编写了自己的 Nativemodule,其中包含 getItem、setItem 和 removeItem 等方法,之后它就可以无缝运行了。

我在朋友的博客 这里 中添加了更多详细信息>

希望它能对某人有所帮助。

Adarsh Kumar
2023-03-27