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

Redux 核心概念详解

Redux 核心概念详解(Action、Reducer、Store)及简单示例

1. Redux 三大核心概念

(1) Action(动作)

  • 作用:描述发生了什么事件(比如"添加任务"、“删除用户”)
  • 特点
    • 必须是纯对象(plain object)
    • 必须有 type 属性(字符串常量)
    • 可以携带额外数据(通过 payload
// 基本action
{ type: 'ADD_TODO', payload: 'Learn Redux' }// 带更多数据的action
{type: 'ADD_USER',payload: {id: 1,name: 'Alice'}
}

(2) Reducer(归约器)

  • 作用:根据action类型更新state
  • 特点
    • 必须是纯函数(同样的输入必定得到同样的输出)
    • 不能直接修改原state,必须返回新state
    • 不能包含异步操作或副作用
// reducer基本结构
function reducer(state = initialState, action) {switch (action.type) {case 'ADD_TODO':return [...state, action.payload]case 'DELETE_TODO':return state.filter(todo => todo.id !== action.payload)default:return state}
}

(3) Store(仓库)

  • 作用:管理应用状态的核心
  • 职责
    • 保存整个应用的state
    • 提供 getState() 获取当前状态
    • 提供 dispatch(action) 触发状态更新
    • 提供 subscribe(listener) 注册监听器
// 创建store
import { createStore } from 'redux'
const store = createStore(reducer)

2. 完整简单示例:计数器应用

(1) 定义Action Types

// actionTypes.js
export const INCREMENT = 'INCREMENT'
export const DECREMENT = 'DECREMENT'
export const RESET = 'RESET'

(2) 定义Action Creators

// actions.js
import { INCREMENT, DECREMENT, RESET } from './actionTypes'export const increment = () => ({ type: INCREMENT })
export const decrement = () => ({ type: DECREMENT })
export const reset = () => ({ type: RESET })

(3) 定义Reducer

// reducer.js
import { INCREMENT, DECREMENT, RESET } from './actionTypes'const initialState = {count: 0
}export default function counterReducer(state = initialState, action) {switch (action.type) {case INCREMENT:return { ...state, count: state.count + 1 }case DECREMENT:return { ...state, count: state.count - 1 }case RESET:return { ...state, count: 0 }default:return state}
}

(4) 创建Store

// store.js
import { createStore } from 'redux'
import counterReducer from './reducer'const store = createStore(counterReducer)export default store

(5) 在React组件中使用

// Counter.jsx
import React from 'react'
import { useSelector, useDispatch } from 'react-redux'
import { increment, decrement, reset } from './actions'export default function Counter() {const count = useSelector(state => state.count)const dispatch = useDispatch()return (<div><h1>Count: {count}</h1><button onClick={() => dispatch(increment())}>+</button><button onClick={() => dispatch(decrement())}>-</button><button onClick={() => dispatch(reset())}>Reset</button></div>)
}

3. 数据流图示

[用户点击按钮] 
→ [dispatch(action)] 
→ [Redux Store接收action] 
→ [调用reducer函数] 
→ [reducer返回新state] 
→ [Store更新state] 
→ [通知订阅者(如React组件)] 
→ [组件重新渲染]

4. 关键原则总结

  1. 单一数据源:整个应用只有一个store
  2. State只读:唯一改变state的方法是触发action
  3. 使用纯函数修改:Reducer必须是纯函数

5. 扩展:添加中间件(如redux-thunk)

// 配置支持异步action的store
import { createStore, applyMiddleware } from 'redux'
import thunk from 'redux-thunk'
import rootReducer from './reducers'const store = createStore(rootReducer, applyMiddleware(thunk))

这样action creator就可以返回函数而不是对象,用于处理异步操作:

// 异步action示例
export const fetchData = () => {return async (dispatch) => {dispatch({ type: 'FETCH_START' })try {const response = await fetch('/api/data')const data = await response.json()dispatch({ type: 'FETCH_SUCCESS', payload: data })} catch (error) {dispatch({ type: 'FETCH_FAILURE', error })}}
}

这个完整示例展示了Redux的核心概念如何协同工作,从最简单的计数器到支持异步操作的完整流程。

http://www.dtcms.com/a/340367.html

相关文章:

  • Flutter开发 json_serializable json数据解析
  • 关联规则挖掘2:FP-growth算法(Frequent Pattern Growth,频繁模式增长)
  • rsync + inotify 数据实时同步
  • Android 入门到实战(三):ViewPager及ViewPager2多页面布局
  • 性能测试报告深度解析:从冰冷数据到火热洞察
  • android kernel代码 common-android13-5.15 下载 编译
  • Linux系统:C语言进程间通信信号(Signal)
  • RK3576赋能无人机巡检:多路视频+AI识别引领智能化变革
  • deque的原理与实现(了解即可)
  • 基于截止至 2025 年 6 月 4 日,在 App Store 上进行交易的设备数据统计,iOS/iPadOS 各版本在所有设备中所占比例详情
  • 比剪映更轻量!SolveigMM 视频无损剪切实战体验
  • shell变量进阶
  • 基于51单片机自动浇花1602液晶显示设计
  • Ubuntu-安装Epics Archiver Appliance教程
  • 玳瑁的嵌入式日记D21-08020(数据结构)
  • 服务器内存条不识别及服务器内存位置图
  • 认识Node.js及其与 Nginx 前端项目区别
  • 动手学深度学习(pytorch版):第五章节—多层感知机(1)层和块
  • 从异构计算视角审视ARM与FPGA:架构融合驱动智能时代计算范式革新
  • mybatis xml中表名 字段报红解决
  • S32K328(Arm Cortex-M7)适配CmBacktrace错误追踪
  • 生产电路板的公司有哪些?国内生产电路板的公司
  • 05-网关服务开发指南
  • 从零实现自定义顺序表:万字详解 + 完整源码 + 图文分析
  • 虚幻引擎目录结构
  • MYSQL-增删查改CRUD
  • Protobuf
  • AIStarter服务器版深度解析:与桌面版对比,解锁云端AI开发新体
  • STM32F4 外扩SRAM介绍及应用
  • word——如何给封面、目录、摘要、正文设置不同的页码