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

Posted

技术标签:

【中文标题】React native 和 redux 仍然无法正常工作【英文标题】:React native and redux persist not working 【发布时间】:2018-06-02 06:57:20 【问题描述】:

我正在使用 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 组件有关?

也许我导出错误的减速器? 我有 const user = (state = initialState, action = ) => 导出默认用户。 另一个减速器也一样: const auth = (state = initialState, action = ) => 导出默认身份验证。

然后我导出 combineReducers(auth, user)

这是错的吗?

【问题讨论】:

实际上我发现它根本没有持久化,因为我删除了 store.dispatch(startingApp());现在什么都没有坚持,无法理解我做错了什么。有什么帮助吗? 看起来我导出错误的减速器。 你使用的是哪个 redux-persist 版本? 【参考方案1】:

使用 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';

【讨论】:

我已经创建并尝试像这样只保留商店。但是从最近的应用程序中清除应用程序后,商店获得初始状态意味着我的状态没有保留在存储中。请告诉我会是什么问题。【参考方案2】:

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

const primary = 
key: 'root',
storage: AsyncStorage,
blacklist: [],
whitelist: ['user'],
;

【讨论】:

以上是关于React native 和 redux 仍然无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

错误:无法解析模块 react-redux/native

带有 redux 的 React-Native-Navigation V2 无法传递道具

我无法在带有 redux 的 react-native 中使用地理定位

无法在 react native 中使用 redux 连接多个组件

无法识别的事件 React Native Redux

无法解决 React Native 项目上的模块 redux