当前位置: 首页 > news >正文

react reducx的使用

安装依赖

在React项目中,需要安装@reduxjs/toolkitreact-redux两个包:

npm install @reduxjs/toolkit react-redux

创建Redux相关文件

  1. 创建slice

    • 使用createSlice创建slice,它会自动生成action creator和reducer。例如:

      import { createSlice } from '@reduxjs/toolkit';const counterSlice = createSlice({name: 'counter',initialState: {count: 0},reducers: {increment(state) {state.count++;},decrement(state) {state.count--;},addToNum(state, action) {state.count += action.payload;}}
      });export const { increment, decrement, addToNum } = counterSlice.actions;
      export default counterSlice.reducer;
  2. 创建store

    • 使用configureStore创建store,它会自动配置中间件和Redux DevTools:

      import { configureStore } from '@reduxjs/toolkit';
      import counterReducer from './counterSlice';const store = configureStore({reducer: {counter: counterReducer}
      });export default store;

在React应用中使用Redux

  1. 提供store

    • 在React应用的顶层组件中,使用<Provider>组件将store提供给整个应用:

      import React from 'react';
      import ReactDOM from 'react-dom';
      import { Provider } from 'react-redux';
      import store from './store';
      import App from './App';ReactDOM.render(<Provider store={store}><App /></Provider>,document.getElementById('root')
      );
  2. 在组件中使用Redux

    • 在React组件中,可以使用useSelectoruseDispatch两个Hooks来读取state和分发action

      import React from 'react';
      import { useSelector, useDispatch } from 'react-redux';
      import { increment, decrement, addToNum } from './counterSlice';function Counter() {const count = useSelector(state => state.counter.count);const dispatch = useDispatch();return (<div><p>Count: {count}</p><button onClick={() => dispatch(increment())}>Increment</button><button onClick={() => dispatch(decrement())}>Decrement</button><button onClick={() => dispatch(addToNum(20))}>Add 20</button></div>);
      }export default Counter;

2. 创建异步Thunk

使用createAsyncThunk创建一个异步Thunk,它会自动生成pendingfulfilledrejected的action类型。例如,假设你有一个API接口https://jsonplaceholder.typicode.com/users,你想要获取用户数据并更新state:

// src/thunks/userThunks.js
import { createAsyncThunk } from '@reduxjs/toolkit';export const fetchUserById = createAsyncThunk('users/fetchById',async (userId) => {const response = await fetch(`https://jsonplaceholder.typicode.com/users/${userId}`);if (!response.ok) {throw new Error('Failed to fetch user');}return response.json();}
);

3. 创建Slice

createSlice中处理异步Thunk的pendingfulfilledrejected状态。你可以使用extraReducers来监听这些状态并更新state:

// src/slices/userSlice.js
import { createSlice } from '@reduxjs/toolkit';
import { fetchUserById } from '../thunks/userThunks';const initialState = {user: null,status: 'idle', // 'idle' | 'loading' | 'succeeded' | 'failed'error: null
};const userSlice = createSlice({name: 'user',initialState,reducers: {},extraReducers: (builder) => {builder.addCase(fetchUserById.pending, (state) => {state.status = 'loading';}).addCase(fetchUserById.fulfilled, (state, action) => {state.status = 'succeeded';state.user = action.payload;}).addCase(fetchUserById.rejected, (state, action) => {state.status = 'failed';state.error = action.error.message;});}
});export default userSlice.reducer;

4. 创建Store

store.js中配置store,引入你的slice和Thunk:

// src/store.js
import { configureStore } from '@reduxjs/toolkit';
import userReducer from './slices/userSlice';export const store = configureStore({reducer: {user: userReducer}
});

5. 在React组件中使用

在React组件中,你可以使用useDispatch来触发异步Thunk,并使用useSelector来读取state:

// src/components/UserComponent.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { fetchUserById } from '../thunks/userThunks';function UserComponent() {const dispatch = useDispatch();const { user, status, error } = useSelector((state) => state.user);const handleFetchUser = () => {dispatch(fetchUserById(1)); // 假设用户ID为1};return (<div><button onClick={handleFetchUser}>Fetch User</button>{status === 'loading' && <p>Loading...</p>}{status === 'succeeded' && (<div><h2>User Details</h2><p>Name: {user.name}</p><p>Email: {user.email}</p></div>)}{status === 'failed' && <p>Error: {error}</p>}</div>);
}export default UserComponent;

6. 提供Store

确保在顶层组件中使用<Provider>来提供store:

// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { store } from './store';
import App from './App';ReactDOM.render(<Provider store={store}><App /></Provider>,document.getElementById('root')
);

2.多个reducer时, 使用combineReducers组合reducer

store.js中,使用combineReducers将多个reducer组合成一个根reducer,然后传递给store。

// src/store.js
import { configureStore, combineReducers } from '@reduxjs/toolkit';
import userReducer from './slices/userSlice';
import counterReducer from './slices/counterSlice';const rootReducer = combineReducers({user: userReducer,counter: counterReducer
});export const store = configureStore({reducer: rootReducer
});

文章转载自:

http://omwgrm6W.bkqrj.cn
http://ihoxUvne.bkqrj.cn
http://m9p0DdmX.bkqrj.cn
http://prVpIBu3.bkqrj.cn
http://8b4dxB7E.bkqrj.cn
http://R0sdgMrl.bkqrj.cn
http://5I5moH8o.bkqrj.cn
http://0BgIzrAw.bkqrj.cn
http://44S7wyTK.bkqrj.cn
http://8k4cROzN.bkqrj.cn
http://pn6gN0dB.bkqrj.cn
http://IeDiRI0p.bkqrj.cn
http://hMjz5nfH.bkqrj.cn
http://zANY36Pg.bkqrj.cn
http://FWOvKe6f.bkqrj.cn
http://zcx5t2Al.bkqrj.cn
http://w8zlyeMU.bkqrj.cn
http://iaTjDKBM.bkqrj.cn
http://0LlaGGNV.bkqrj.cn
http://5KGvDgMm.bkqrj.cn
http://YxHTPqvc.bkqrj.cn
http://huMSLhiT.bkqrj.cn
http://kEmp4wzO.bkqrj.cn
http://27n41ik0.bkqrj.cn
http://RHAPYEYv.bkqrj.cn
http://ril3XvTB.bkqrj.cn
http://BXyFkDhx.bkqrj.cn
http://s6ioqsxf.bkqrj.cn
http://5xgmnBxo.bkqrj.cn
http://3nYgBYaS.bkqrj.cn
http://www.dtcms.com/a/378402.html

相关文章:

  • 基于STM32设计的智慧路灯(华为云IOT)_281
  • 智慧水库综合管理系统平台御控物联网解决方案
  • react基础篇
  • 子数组最大累加和dp问题I(保姆级!)
  • Win10和Win11打开IE浏览器
  • 解锁Python超能力:面向对象编程之类继承完全指南
  • 【openGLES】纹理
  • 什么是OCSP装订(OCSP Stapling)?它如何加速SSL握手?
  • 微硕WINSOK MOS管WSF3089,赋能汽车转向系统安全升级
  • Matplotlib 动画显示进阶:交互式控制、3D 动画与未来趋势
  • 立体校正原理
  • CAD球体密堆积_圆柱体试件3D插件 球体颗粒在圆柱容器内的堆积建模
  • 西门子 S7-200 PLC SMART 模拟量指令库(Scale)添加与实战使用指南
  • 后端Web实战-Spring原理
  • 计算机网络---内网穿透
  • QTDay1 图形化界面
  • Flutter 中的 Isolate
  • 将容器连接到默认桥接网络
  • 探索AI工具宝库:Awesome AI Tools - 让AI成为你的超级助手
  • UEC++学习(十八)使用TAutoConsoleVariable<T> / FAutoConsoleCommand自定义控制台变量/命令
  • 2.9Vue创建项目(组件)的补充
  • MasterGo蒙版
  • 一次.dockerignore设置错误导致的docker build排查
  • 第六节,探索 ​​CSS 的高级特性、复杂布局技巧、性能优化以及与现代前端工作流的整合​​
  • Flink on YARN 实战问题排查指南(精华版)
  • Java全栈学习笔记34
  • 进程控制(1)
  • 操作系统进程管理——同步与互斥的基本概念
  • 灰色关联分析笔记
  • CAD文件坐标系未知?用Bigemap Pro自动计算中央子午线,准确定位!