React 项目集成 Redux 基础指南:从环境配置到核心概念
本文详细介绍如何在 React 项目中集成 Redux 进行状态管理。内容涵盖 react-redux 和 redux-thunk 等关键库的作用,演示从 state 定义、reducer 编写到 action 创建的完整流程,并通过代码示例展示 store 的创建与应用。最后解析 Redux 的单一数据源、State 只读及纯函数修改三大核心原则,帮助开发者快速掌握 Redux 在 React 中的基础应用。
前言与核心概念
前言
即便当前项目尚未达到必须引入 Redux 的规模,提前了解其机制也颇具价值。本文旨在提供基础认知,并非强制推荐在项目中采用 Redux。
概念
在开始之前,我们需要明确将涉及的核心框架与工具。
React
作为用户界面构建框架。
Redux
这是一个独立的状态管理工具,并不局限于 React,其他 UI 框架同样可以集成使用。
react-redux
这是 React 的官方绑定库,主要作用是简化在 React 组件中连接和使用 Redux 的状态。
react-thunk
作为 Redux 的中间件,它的主要功能是支持异步 Action 的处理。
目录结构
提示:已省略与 Redux 无关的目录
项目目录结构
|--src
|-- store Redux目录
|-- actions.js
|-- index.js
|-- reducers.js
|-- state.js
|-- components 组件目录
|-- Test.jsx
|-- App.js 项目入口
Redux 初始化配置步骤
准备工作
第1步:提供默认值,既然使用 Redux 管理数据,则数据必须具备默认值,因此将 state 的默认值统一放置于 state.js 文件
// state.js
// 声明默认值
// 这里我们列举两个示例
// 同步数据:pageTitle
// 异步数据:infoList(将来用异步接口获取)
export default {
pageTitle: '首页',
infoList: []
}
第2步:创建 reducer,它是最终实际使用的数据,统一放置于 reducers.js 文件
// reducers.js
// 工具函数,用于组织多个reducer,并返回reducer集合
import { combineReducers } from 'redux'
// 默认值
import defaultState from './state.js'
// 一个reducer就是一个函数
function pageTitle (state = defaultState.pageTitle, action) {
// 不同的action有不同的处理逻辑
switch (action.type) {
case 'SET_PAGE_TITLE':
return action.data
default:
return state
}
}
function infoList (state = defaultState.infoList, action) {
switch (action.type) {
case 'SET_INFO_LIST':
return action.data
default:
return state
}
}
// 导出所有reducer
export default combineReducers({
pageTitle,
infoList
})
第3步:创建 action,既然已创建 reducer,但尚未有对应的 action 来操作它们,接下来编写 action
// actions.js
// action也是函数
export function setPageTitle (data) {
return (dispatch, getState) => {
dispatch({ type: 'SET_PAGE_TITLE', data: data })
}
}
export function setInfoList (data) {
return (dispatch, getState) => {
// 使用fetch实现异步请求
window.fetch('/api/getInfoList', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}).then(res => {
return res.json()
}).then(data => {
let { code, data } = data
if (code === 0) {
dispatch({ type: 'SET_INFO_LIST', data: data })
}
})
}
}
最后一步:创建 store 实例
// index.js
// applyMiddleware: redux通过该函数来使用中间件
// createStore: 用于创建store实例
import { applyMiddleware, createStore } from 'redux'
// 中间件,作用:如果不使用该中间件,当我们dispatch一个action时,需要给dispatch函数传入action对象;但如果我们使用了这个中间件,那么就可以传入一个函数,这个函数接收两个参数:dispatch和getState。这个dispatch可以在将来的异步请求完成后使用,对于异步action很有用
import thunk from 'redux-thunk'
// 引入reducer
import reducers from './reducers.js'
// 创建store实例
let store = createStore(
reducers,
applyMiddleware(thunk)
)
export default store
至此,已完成所有使用 Redux 的准备工作,接下来在 React 组件中使用 Redux
React 组件中的 Redux 应用
开始使用
首先,编写应用的入口文件 APP.js
import React from 'react'
import ReactDOM from 'react-dom'
// 引入组件
import TestComponent from './components/Test.jsx'
// Provider是react-redux两个核心工具之一,作用:将store传递到每个项目中的组件中
// 第二个工具是connect,稍后会作介绍
import { Provider } from 'react-redux'
// 引入创建好的store实例
import store from '@/store/index.js'
// 渲染DOM
ReactDOM.render (
(
<div>
{/* 将store作为prop传入,即可使应用中的所有组件使用store */}
<Provider store = {store}>
<TestComponent />
</Provider>
</div>
),
document.getElementById('root')
)
最后是我们的组件:Test.jsx
// Test.jsx
import React, { Component } from 'react'
// connect方法的作用:将额外的props传递给组件,并返回新的组件,组件在该过程中不会受到影响
import { connect } from 'react-redux'
// 引入action
import { setPageTitle, setInfoList } from '../store/actions.js'
class Test extends Component {
constructor(props) {
super(props)
}
componentDidMount () {
let { setPageTitle, setInfoList } = this.props
// 触发setPageTitle action
setPageTitle('新的标题')
// 触发setInfoList action
setInfoList()
}
render () {
// 从props中解构store
let { pageTitle, infoList } = this.props
// 使用store
return (
<div>
<h1>{pageTitle}</h1>
{
infoList.length > 0 ? (
<ul>
{
infoList.map((item, index) => {
<li>{item.data}</li>
})
}
</ul>
):null
}
</div>
)
}
}
// mapStateToProps:将state映射到组件的props中
const mapStateToProps = (state) => {
return {
pageTitle: state.pageTitle,
infoList: state.infoList
}
}
// mapDispatchToProps:将dispatch映射到组件的props中
const mapDispatchToProps = (dispatch, ownProps) => {
return {
setPageTitle (data) {
// 如果不懂这里的逻辑可查看前面对redux-thunk的介绍
dispatch(setPageTitle(data))
// 执行setPageTitle会返回一个函数
// 这正是redux-thunk的所用之处:异步action
// 上行代码相当于
/*dispatch((dispatch, getState) => {
dispatch({ type: 'SET_PAGE_TITLE', data: data })
)*/
},
setInfoList (data) {
dispatch(setInfoList(data))
}
}
}
export default connect(mapStateToProps, mapDispatchToProps)(Test)
Redux 三大核心原则
Redux 核心架构
1、单一数据源
整个应用程序的状态被存储在一个单一的 object tree 中,且该 object tree 仅存在于唯一的 store 实例中。
2、State 是只读的
修改 State 的唯一途径是触发 Action,而 Action 是一个描述已发生事件的普通对象。
3、使用纯函数来执行修改
为了描述 Action 如何改变 State tree,需要编写 Reducers 来处理状态更新逻辑。
结语
以上展示了在 React 项目中集成 Redux 的基础示例。文中代码可能存在疏漏,欢迎指正。希望本文能对您有所帮助,感谢支持。
React 18 新特性解读:并发模式与自动批处理
2026-11-05 15:19:34
UmiJS 快速上手:从零创建项目与目录结构解析
2026-11-05 09:01:18
React 开发常见报错排查:Invalid Hook Call 与 Key 警告
2026-11-03 12:42:51
Next.js 预期错误与未捕获异常的处理策略
2026-10-31 19:36:37
React实现页面状态缓存(keep-alive)的示例代码
2026-10-31 11:10:26








