📅  最后修改于: 2023-12-03 15:37:29.853000             🧑  作者: Mango
React with Redux 是一种流行的 JavaScript 库和框架组合,用于构建动态 Web 应用程序。 Redux 为 React 应用程序提供了一个可预测的状态管理机制,让开发者可以更容易地在应用程序中处理和管理数据流。在本文中,我们将介绍在 React with Redux 应用程序中典型的数据流以及如何使用 Redux 进行状态管理。
Redux 的数据流可以简单地概括为“动作 → 状态 → 视图”,其中:
动作(Action): 是一个简单的 JavaScript 对象,用于描述应用程序中发生的事件或对 Redux 应用程序的请求。动作必须包含一个类型(Type),以及使用该动作的其他数据 (Payload)。例如,{ type: 'ADD_TODO', payload: { id: 1, text: 'Buy milk' } } 是一个添加新任务的动作。
状态(State): 是一个存储整个应用程序状态的普通 JavaScript 对象。它可以由 Redux Store 中的 Reducer 函数更新。 Reducer 函数采用当前状态和一个指定的动作对象作为参数,并返回一个新的状态。状态通常是不可变的,即每个更改都返回一个新的状态对象。例如,以下状态对象表示一个待办事项列表:{ todos: [{ id: 1, text: 'Buy milk' }, { id: 2, text: 'Clean room' }], visibilityFilter: 'SHOW_ALL' }。
视图(View): 是应用程序中的用户界面,通常使用 React 组件实现。每当状态更改时,组件将重新渲染以反映最新状态。你可以使用 React-Redux 将这些组件连接到 Redux Store 中,以使用状态更新这些组件。
Redux 的流程图如下所示:
Action → Reducer → New State → View → Action
Redux 数据流的优点是数据单向流动,使代码更易于理解和调试。不同的角色具有明确的职责,也降低了应用程序的复杂性。
在 React with Redux 应用程序中,你需要使用一些额外的库来设置 Redux Store、连接 React 组件和执行动作:
Redux: Redux 库本身,用于处理动作和状态操作。
react-redux: 与 Redux 框架集成的 React 组件库,它提供了在 React 组件中使用 Redux 状态管理的功能。
让我们通过一个例子来说明如何在 React with Redux 应用程序中使用数据流。
假设我们正在尝试构建一个简单的待办事项列表应用程序。首先,我们需要创建一个动作类型(Type)来描述我们计划执行的动作。在这种情况下,我们想要添加一个新的待办事项:
const ADD_TODO = 'ADD_TODO';
接下来,我们需要编写一个创建添加新待办事项动作的函数。该函数将接受新待办事项的文本和一个唯一 ID:
function addTodo(text, id) {
return {
type: ADD_TODO,
payload: { text: text, id: id }
};
}
我们还需要编写一个 Reducer 函数,以便在 Store 的状态更改时执行特定的操作。在这种情况下,我们想返回一个新的状态对象,其中包含新待办事项的列表:
function todoReducer(state = { todos: [] }, action) {
switch (action.type) {
case ADD_TODO:
return {
todos: [
...state.todos,
{ id: action.payload.id, text: action.payload.text }
]
};
default:
return state;
}
}
在 React 应用程序中,我们需要将 Redux Store 与我们的 React 组件连接起来。为此,我们使用 react-redux 库,并编写一个容器组件,将 Redux Store 中的状态映射到我们的 React 组件中:
import { connect } from 'react-redux';
function TodoList({ todos }) {
return (
<ul>
{todos.map((todo) => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
);
}
function mapStateToProps(state) {
return { todos: state.todos };
}
export default connect(mapStateToProps)(TodoList);
最后,我们可以在组件中调用添加新待办事项的函数:
import { useSelector, useDispatch } from 'react-redux';
import { addTodo } from './actions';
function TodoInput() {
const dispatch = useDispatch();
function onSubmit(text) {
dispatch(addTodo(text, Date.now()));
}
return (
<form onSubmit={(e) => { e.preventDefault(); onSubmit(e.target.text.value); }}>
<input type="text" name="text" />
<button type="submit">Add Todo</button>
</form>
);
}
在上述代码中,我们使用 useDispatch
hook 获取 dispatch
函数,并调用 addTodo
函数来添加新待办事项。
React with Redux 应用程序中的数据流是单向流动,从动作到状态,最终到用户界面。通过使用 React、Redux 和 react-redux 库,可以更轻松地管理和更新应用程序的状态,并实现高效的代码复用和维护性。