使用Redux-persist保留应用程序状态时,重置应用程序启动时的reducer状态

凯姆·西迪基(Qaim Siddiqui)

我正在使用redux-persist和async存储将数据持久保存在我的react-native-application中。
这是我的redux商店的配置

import AsyncStorage from '@react-native-community/async-storage';
import {applyMiddleware, createStore} from 'redux';
import {composeWithDevTools} from 'redux-devtools-extension';
import {persistReducer, persistStore} from 'redux-persist';
import createSagaMiddleware from 'redux-saga';
import rootReducer from '../reducers';
import rootSaga from '../sagas';

const sagaMiddleware = createSagaMiddleware();
// Middleware: Redux Persist Config
const persistConfig = {
  // Root
  key: 'root',
  // Storage Method (React Native)
  storage: AsyncStorage,
  // Whitelist (Save Specific Reducers)
  whitelist: ['authReducer',],
  // Blacklist (Don't Save Specific Reducers)
  blacklist: [''],
};
// Middleware: Redux Persist Persisted Reducer
const persistedReducer = persistReducer(persistConfig, rootReducer);
// Redux: Store
const store = createStore(
  persistedReducer,
  composeWithDevTools(applyMiddleware(sagaMiddleware)),
);
sagaMiddleware.run(rootSaga);
// Middleware: Redux Persist Persister
let persistor = persistStore(store);
// Exports
export {store, persistor};

当我向服务器发出请求时,我使用三种类型的动作分派

LOGIN_REQUEST
LOGIN_SUCCESS
LOGIN_FAILURE

并在请求LOGIN_REQUEST上分派动作(将加载状态设置为true以加载动画并禁用登录按钮),在成功请求分派LOGIN_SUCCESS动作,并在请求失败时LOGIN_FAILURE设置(并将加载状态设置为false),这里是精简

...
    case LOGIN_SUCCESS: {
      return {
        ...state,
        user: action.payload,
        loading : false
      };
    }
    case LOGIN_REQUEST: {
      return {
        ...state,
        loading: true,
      };
    }
    case LOGIN_FAILURE: {
      return {
        ...state,
        loading: false,
      };
    }
...

通过这种方式加载动画效果很好。
如果在请求进行过程中应用程序关闭并且加载状态仍然为true(因为未调度LOGIN_FAILURE或LOGIN_SUCCESS操作),问题就来了,下一次应用程序打开时,加载状态为true,并且加载动画出现了,我查看了一些解决方案,例如自动更新状态在开始时派遣的动作持续/ REHYDRATE,例如

...
    case "persist/REHYDRATE": {
      return {
        ...state,
        loading : false
      };
    }
...

要么

黑名单状态,如reducerName.loading之

...
storage: AsyncStorage,
// Whitelist (Save Specific Reducers)
whitelist: ['authReducer',],
// Blacklist (Don't Save Specific Reducers)
blacklist: ['authReducer.loading'],
...

有没有更好的方法来解决这种情况,谢谢

文伟

您可以AppState用来检查并禁用加载。

import {AppState} from 'react-native';

useEffect(() => {
    AppState.addEventListener("change", _handleAppStateChange);

    return () => {
      AppState.removeEventListener("change", _handleAppStateChange);
    };
  }, []);

  const _handleAppStateChange = (nextAppState) => {
    if (appState.current === 'active' && nextAppState.match(/inactive|background/)) {
      //check if loading is true, set is to false if it is
    }

    appState.current = nextAppState;
    setAppStateVisible(appState.current);
  };

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Spring MVC在应用程序启动时执行Java类

使用alwaysRetainTaskState和lauchMode保留android应用程序状态

使用Spring Boot在应用程序启动时在null中定义的'jpaAuditingHandler'

Redux中的应用程序与本地状态

Redux-应用程序状态以reducer的名称为键

使用视觉状态时WPF应用程序崩溃

在react-redux应用程序中导航到其他路由时删除redux状态?

Redux-依赖应用程序状态

(与Redux反应导航向导)应用程序在启动时崩溃

如何在启动时使用Flutter启动应用程序?

在React Redux应用程序中手动导航时状态丢失

当您使用应用程序重置工具时,Kafka状态存储会发生什么?

当应用程序处于前台状态时,如何计算应用程序使用时间?

使用Pyinstaller启动时Kivy应用程序崩溃

如何使用提供程序在应用启动时加载状态

使用任务计划程序在启动时启动时,AutoHotkey无法启动ClickOnce应用程序

使用Spring Data MongoDB在应用程序启动时加载初始数据

应用程序在启动时崩溃-“ onCreate()之前活动无法使用系统服务”

在应用程序启动时使用Entity Framework核心运行数据库迁移

在Web应用程序启动时使用Spring AMQP创建新队列

可以在应用程序启动时已经在运行的进程上使用EnableRaisingEvents吗?

当应用程序通过通知启动时使用推送通知负载

(Xamarin Forms) 启动时应用程序崩溃(使用应用程序属性登录/注销)

当需要恢复应用程序的状态时,使用哪种模式?

如何使用 WKWebView / WKHTTPCookieStore 在应用程序重新启动时保留 cookie

当 redux 更改商店中的状态时,我的 reactJS 应用程序不会重新呈现

使用 Firebase 数据库的 Android 应用程序在启动时总是崩溃?

Provider 在应用程序启动时使用 SharedPreferences

尝试使用 AlertDialog 但应用程序在启动时崩溃