React 持久化全局数据状态管理(reduxreact-reduxredux-persistimmer)

Posted усил

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React 持久化全局数据状态管理(reduxreact-reduxredux-persistimmer)相关的知识,希望对你有一定的参考价值。

一、创建 store 仓库(数据持久化)

store 入口文件(redux/index.js)

// 导入各个模块的 reducer
import global from './modules/global/reducer';
import auth from './modules/auth/reducer';

import  persistStore, persistReducer  from "redux-persist";
import storage from 'redux-persist/lib/storage';

import  
    legacy_createStore as createStore
    combineReducers,
    applyMiddleware,
    compose
 from redux;

import reduxThunk from "redux-thunk";
import reduxPromise from "redux-promise";

// 创建 reducer (将各个模块的 reducer 进行整合)
const reducer = combineReducers(
    global, auth
);

// -- 配置 redux 持久化
const persistConfig = 
    key: 'redux-state',
    storage: storage

const persistReducerConfig = persistReducer(persistConfig, reducer);

// 创建 redux 中间件
const middleWares = applyMiddleware(reduxThunk, reduxPromise);
// 开启 redux-devtools
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;

// 创建 store
const store = createStore(persistReducerConfig, composeEnhancers(middleWares));

// 创建持久化 store
const persistor = persistStore(store);

export  store, persistor ;

上述代码实现了

  • reducer 进行切片(分别引入 global 模块、auth 模块)
  • redux 数据持久化 (结合 redux-persist)
  • 开启 redux 调试工具(结合中间件)

二、创建模块的 reducer 和 action

global 模块下的 reducer(redux/modules/global/reducer)

import produce from "immer";
const globalState = 
    themeConfig: 
        // 默认 primary 主题颜色
        primary: "#1890ff",
        // 深色模式
        isDark: false,
        // 色弱模式(weak) || 灰色模式(gray)
        weakOrGray: "",
        // 面包屑导航
        breadcrumb: true,
        // 标签页
        tabs: true,
        // 页脚
        footer: true
    
    // ....


// 创建 global 模块的 reducer
const global = (state = globalState, action) => 
    produce(state, draftState => 
        switch(action.type) 
            case 'SET_THEME_CONFIG':
                draftState.themeConfig = action.themeConfig
                break;
            // .....
            default:
			   return draftState;
        
    )

export default global;

global 模块下的action (redux/modules/global/action)

export const setThemeConfig = (themeConfig: ThemeConfigProp) => (
	type: types.SET_THEME_CONFIG,
	themeConfig
);

auth 同理(照猫画虎)

redux/modules/auth/reducer

redux/modules/auth/action


三、对 reudx 进行注册

项目入口文件 (main.jsx / main.tsx)

import ReactDOM from 'react-dom';
import  Provider  from "react-redux";
import  PersistGate  from "redux-persist/integration/react";
import  store, persistor  from "@/redux/index.js";
ReactDOM.render(
   <Provider store=store>
        <PersistGate persistor=persistor>
            <App />
        </PersistGate> 
   </Provider>,
   document.getElementById("root")
)

四、使用 redux

创建修改主题色组件

import  setThemeConfig  from "@/redux/modules/global/action";
import  connect  from "react-redux";

const SwitchDark = (props) => 
    const  setThemeConfig, themeConfig  = props;
    const onChange = (checked) => 
        // setThemeConfig 方法是来自 模块 global action 下的 setThemeConfig
        setThemeConfig(...themeConfig, isDark: checked)
    
    return (
       <Switch
            className="dark"
            defaultChecked=themeConfig.isDark
            checkedChildren=<>🌞</>
            unCheckedChildren=<>🌜</>
            onChange=onChange
	   />
    )
 
// 将 redux 中的 state 映射到 prop 中
const mapStatetoProps = (state) => state.global;
// 将 redux 中的 action 映射到 prop 中            
const mapDispatchProps =  setThemeConfig  
export default connect(mapStatetoProps, mapDispatchToProps)(SwitchDark)

总结

上述例子主要是结合 reduxreact-reduxredux-persistimmer 实现的 react 全局数据状态管理(持久化)

以上是关于React 持久化全局数据状态管理(reduxreact-reduxredux-persistimmer)的主要内容,如果未能解决你的问题,请参考以下文章

React通过redux-persist持久化数据存储

React 状态管理:上下文 API 作为全局存储

在 React 中,将获取的 Firebase 数据存储在本地还是全局状态?

React 入门Redux

React-5-状态管理器Redux

[react] 什么时候使用状态管理器?