首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
1.1构建Product Hunt项目
1.2设置开发环境
1.3针对Windows用户的特殊说明
1.4JavaScript ES6/ES7
1.5什么是组件
1.6构建Product组件
1.7让数据驱动Product组件
1.8应用程序的第 一次交互:投票事件响应
1.9更新state和不变性
1.10用Babel插件重构transform-class-properties
2.1计时器应用程序
2.2开始计时器应用程序
2.3将应用程序分解为组件
2.4从头开始构建React应用程序的步骤
2.5第(2)步:构建应用程序的静态版本
2.6第(3)步:确定哪些组件应该是有状态的
2.7第(4)步:确定每个state 应该位于哪个组件中
2.8第(5)步:通过硬编码来初始化state
2.9第(6)步:添加反向数据流
2.10更新计时器
2.11删除计时器
2.12添加计时功能
2.13添加启动和停止功能
3.1组件和服务器介绍
3.2server.js
3.3服务器API
3.4使用API
3.5从服务器加载状态
3.6client
3.7向服务器发送开始和停止请求
3.8向服务器发送创建、更新和删除请求
3.9下一步
4.1React使用了虚拟DOM
4.2为什么不修改实际的DOM
4.3什么是虚拟DOM
4.4虚拟DOM片段
4.5ReactElement
4.6JSX
5.1props、state和children介绍
5.2如何使用本章
5.3ReactComponent
5.4props是参数
5.5PropTypes
5.6使用getDefaultProps()获取默认props
5.7上下文
5.8state
5.9无状态组件
5.10使用props.children与子组件对话
6.1表单101
6.2文本输入
6.3远程数据
6.4异步持久性
6.5Redux
6.6表单模块
7.1JavaScript模块
7.2Create React App
7.3探索Create React App
7.4Webpack基础
7.5对示例应用程序进行修改
7.6创建生产构建
7.7弹出
7.8Create React App和API服务器一起使用
7.9Webpack总结
8.1不使用框架编写测试
8.2Jest是什么
8.3使用Jest
8.4React应用程序的测试策略
8.5使用Enzyme测试基本的React组件
8.6为食物查找应用程序编写测试
8.7编写FoodSearch.test.js
当前位置:
首页>>
技术小册>>
React全家桶--前端开发与实例(上)
小册名称:React全家桶--前端开发与实例(上)
### 6.5 Redux:构建可预测状态管理的基石 在React应用的开发中,随着应用规模的扩大和功能的复杂化,组件间的状态管理成为了一个不可忽视的挑战。Redux作为一个专为JavaScript应用设计的状态容器,提供了可预测化的状态管理方案,使得跨组件间的状态共享与更新变得既清晰又高效。本章将深入探讨Redux的核心概念、工作原理、以及如何在React项目中集成和使用Redux。 #### 6.5.1 Redux简介 Redux是由Dan Abramov创建的,旨在解决JavaScript应用中复杂状态管理的问题。它遵循三个基本原则: 1. **单一真实数据源**(Single source of truth):整个应用的状态被存储在一个对象树中,并且这个对象树只存在于唯一的store中。 2. **状态是只读的**(State is read-only):唯一改变状态的方法是触发action,action是一个用于描述已发生事件的普通对象。 3. **使用纯函数来执行修改**(Changes are made with pure functions):为了指定state树如何通过actions转换成新的state树,你需要编写reducers。Reducers是纯函数,它接收先前的state和一个action,返回新的state。 这三个原则共同确保了Redux应用的状态变化是可预测和易于跟踪的。 #### 6.5.2 核心概念 ##### 6.5.2.1 Action Action是一个普通JavaScript对象,用于描述应用中发生的事件。它必须有一个`type`属性来指示这个action的类型,其他属性则根据type的不同而不同。例如,一个添加待办事项的action可能如下: ```javascript { type: 'ADD_TODO', text: 'Learn Redux' } ``` ##### 6.5.2.2 Reducer Reducer是一个纯函数,它接收当前的state和一个action作为参数,返回一个新的state。Reducer的纯净性(即不修改传入的state,且总是返回同一个输入的新对象)保证了应用的状态变化是可预测的。Reducer函数的基本形式如下: ```javascript function todoApp(state = initialState, action) { switch (action.type) { case 'ADD_TODO': return [...state, { id: state.reduce((maxId, todo) => Math.max(todo.id, maxId), -1) + 1, text: action.text, completed: false }]; // 其他case处理... default: return state; } } ``` ##### 6.5.2.3 Store Store是Redux中管理应用状态的唯一地方。它包含整个应用的状态树,并提供了一个方法来获取状态、分发action和注册监听器。Redux通过`createStore(reducer)`来创建store,其中reducer是一个定义应用状态如何响应不同类型action的函数。 ```javascript import { createStore } from 'redux'; const store = createStore(todoApp); ``` #### 6.5.3 React-Redux集成 为了在React组件中使用Redux的状态,我们通常需要`react-redux`库,它提供了`Provider`组件和`connect`函数等工具来简化Redux与React的集成。 ##### 6.5.3.1 Provider组件 `Provider`组件使得整个应用中的任何组件都可以访问到Redux store。你只需在应用的顶层组件上包裹`<Provider store={store}>`即可。 ```jsx import React from 'react'; import ReactDOM from 'react-dom'; import { Provider } from 'react-redux'; import { createStore } from 'redux'; import todoApp from './reducers'; const store = createStore(todoApp); ReactDOM.render( <Provider store={store}> <App /> </Provider>, document.getElementById('root') ); ``` ##### 6.5.3.2 connect函数 `connect`函数用于将React组件与Redux store连接起来。它允许你将Redux state映射到React组件的props上,并允许你将action creators作为props传递给组件。 ```jsx import React, { Component } from 'react'; import { connect } from 'react-redux'; import { addTodo } from './actionCreators'; class TodoList extends Component { render() { return ( <ul> {this.props.todos.map(todo => <li key={todo.id}> {todo.text} </li> )} <button onClick={() => this.props.dispatch(addTodo('Learn More Redux'))}> Add Todo </button> </ul> ); } } const mapStateToProps = state => ({ todos: state.todos }); export default connect(mapStateToProps)(TodoList); ``` 但通常,为了更清晰地表达意图,我们会使用`Object.assign`或展开运算符来同时传入`mapStateToProps`和`mapDispatchToProps`。 ```jsx export default connect( state => ({ todos: state.todos }), { addTodo } // 假设addTodo是一个action creator )(TodoList); ``` #### 6.5.4 Redux中间件 Redux中间件提供了一种强大的机制来扩展Redux的功能,比如添加日志、崩溃报告、调用异步API等。中间件允许你在action被发送到reducer之前拦截、修改或替代这些action。 `redux-thunk`是Redux官方推荐用于处理异步逻辑的中间件之一。通过它,你可以编写返回函数的action creators,这些函数可以接收`dispatch`和`getState`作为参数,从而可以在适当的时候分发action。 ```javascript function fetchTodos(dispatch) { return async function(dispatch, getState) { dispatch({ type: 'FETCH_TODOS_REQUEST' }); try { const todos = await fetchTodosFromServer(); dispatch({ type: 'FETCH_TODOS_SUCCESS', todos }); } catch (error) { dispatch({ type: 'FETCH_TODOS_FAILURE', error }); } }; } ``` #### 6.5.5 Redux DevTools Redux DevTools是一个强大的时间旅行调试工具,它可以让你查看、回滚和实时编辑Redux应用中的actions和state。它极大地简化了Redux应用的开发和调试过程。 要在项目中集成Redux DevTools,你可以使用`redux-devtools-extension`库,它提供了一个简单的封装来连接Redux DevTools。 ```javascript import { createStore, applyMiddleware, compose } from 'redux'; import thunk from 'redux-thunk'; import rootReducer from './reducers'; const store = createStore( rootReducer, compose( applyMiddleware(thunk), window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__() ) ); ``` #### 6.5.6 结论 Redux通过其严格的状态管理原则和丰富的生态系统,为构建大型、复杂的React应用提供了坚实的基础。通过本章的学习,你应该对Redux的核心概念、工作原理、以及如何在React项目中集成和使用Redux有了深入的理解。无论是处理简单的状态同步,还是复杂的异步逻辑,Redux都能提供清晰、可预测的解决方案。随着你对Redux的进一步探索和实践,你将能够更加高效地构建出功能丰富、性能卓越的前端应用。
上一篇:
6.4异步持久性
下一篇:
6.6表单模块
该分类下的相关小册推荐:
React 进阶实践指南
ReactJS面试指南
深入学习React实战进阶
React全家桶--前端开发与实例(下)
剑指Reactjs