Redux介绍(JS可预测状态管理库,通常与React搭配使用)集中式存储、单向数据流、Flux的实现、Reducer、redux-thunk、redux-saga、React-Redux
·
文章目录
Redux 介绍
什么是 Redux?
Redux 是一个用于 JavaScript 应用程序的可预测状态管理库,通常与 React 搭配使用,但也可以与其他框架(如 Angular、Vue)结合。它的核心目标是通过集中式存储和单向数据流,使状态管理更加简单、可预测和易于调试。
核心理念
1. 单一数据源
应用的所有状态都存储在一个唯一的 store 中,避免了分散在多个组件或模块中的混乱。
2. 状态是只读的
状态不能直接被修改,只能通过派发 Action(描述变化的事件)来触发状态更新。
3. 纯函数修改状态
使用 Reducer(纯函数)处理 Action,根据当前状态和 Action 返回新的状态。纯函数确保无副作用,便于测试和调试。
核心概念
1. Store
- 存储整个应用的状态。
- 提供以下方法:
getState():获取当前状态。dispatch(action):分发 Action 以更新状态。subscribe(listener):监听状态变化。
import { createStore } from 'redux';
const store = createStore(reducer);
2. Action
- 描述状态变化的事件对象,包含
type(必填)和payload(可选数据)。 - 示例:
const addTodoAction = { type: 'ADD_TODO', payload: 'Learn Redux' };
3. Reducer
- 纯函数,接收当前状态和 Action,返回新状态。
- 示例:
function counterReducer(state = { count: 0 }, action) { switch (action.type) { case 'INCREMENT': return { count: state.count + 1 }; case 'DECREMENT': return { count: state.count - 1 }; default: return state; } }
工作流程
1. 触发事件:用户操作(如点击按钮)触发 Action。
2. 分发 Action:通过 store.dispatch(action) 将 Action 发送到 Store。
3. 调用 Reducer:Store 调用 Reducer,根据 Action 更新状态。
4. 更新 Store:生成新的状态树。
5. 重新渲染:订阅 Store 的组件重新渲染以反映最新状态。
适用场景
- 需要全局状态共享:多个组件依赖同一份状态(如用户登录信息)。
- 复杂交互或多数据源:如实时数据更新(WebSocket)、表单验证、异步请求。
- 大型项目:状态逻辑复杂,需统一管理和调试。
不适用场景:
- 小型项目或组件间通信简单。
- 数据流单一且无需跨组件共享状态。
优点
- 可预测性:状态变化由纯函数驱动,便于追踪和调试。
- 集中式管理:单一数据源简化状态维护。
- 易于测试:Reducer 是纯函数,可独立测试。
- 开发者工具:支持时间旅行调试(Redux DevTools)。
- 生态丰富:中间件(如 redux-thunk、redux-saga)支持异步操作和日志记录。
Redux Toolkit(推荐)
Redux Toolkit 是官方推荐的简化工具包,减少样板代码,提供以下功能:
- createSlice:自动生成 Action 和 Reducer。
- configureStore:简化 Store 配置。
- Immer 支持:允许直接修改状态(内部自动处理不可变性)。
示例:
import { createSlice, configureStore } from '@reduxjs/toolkit';
// 创建 Slice
const todoSlice = createSlice({
name: 'todos',
initialState: [],
reducers: {
addTodo: (state, action) => {
state.push({ id: Date.now(), text: action.payload });
},
removeTodo: (state, action) => {
return state.filter(todo => todo.id !== action.payload);
}
}
});
// 配置 Store
const store = configureStore({
reducer: {
todos: todoSlice.reducer
}
});
// 使用 Action
store.dispatch(todoSlice.actions.addTodo('Learn Redux'));
与 React 的集成
- React-Redux:提供 useSelector 和 useDispatch 钩子,简化组件与 Store 的交互。
- Provider:将 Store 注入 React 应用的顶层。
示例:
import { Provider, useSelector, useDispatch } from 'react-redux';
function App() {
const count = useSelector(state => state.counter);
const dispatch = useDispatch();
return (
<div>
<p>{count}</p>
<button onClick={() => dispatch({ type: 'INCREMENT' })}>+1</button>
</div>
);
}
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
总结
- 适合:大型应用、全局状态管理、复杂交互场景。
- 不适合:小型项目或简单组件通信。
- 推荐工具:Redux Toolkit + React-Redux,显著提升开发效率。
通过 Redux,开发者可以构建可维护、可扩展的 JavaScript 应用,尤其适合需要精细控制状态的场景。
更多推荐


所有评论(0)