在前端开发中,管理数据是一项非常重要的任务。为了方便管理数据,我们经常会使用像 Redux 这样的状态管理工具。Redux 带来的一个最主要的好处就是单向数据流。
本文将阐述 Redux 单向数据流的原理和如何通过实例来理解它。本文也会涵盖 Redux 核心概念以及如何在 React 中与 Redux 结合使用。
Redux 的概念
Redux 是一个用于 JavaScript 应用程序的可预测状态容器。Redux 由三个核心概念组成:store、reducer 和 action。
Store
Store 是一个 JS 对象,用于保存应用程序中的所有状态。与传统的 MVC 开发模式不同,Redux 应用程序只有一个 store。store 是 Redux 应用程序中的状态的唯一来源,而且所有的数据操作都通过 store 进行。
Redux store 中包含了应用程序的完整状态,我们可以通过 store.getState 方法来访问它。
Reducer
Reducer 是一个改变 Redux 应用程序状态的纯函数。Reducer 函数接收两个参数:当前状态和一个 action 对象,并返回一个新的状态。
Redux 中的 reducer 很类似于数组的 reduce 方法。Reducer 函数需要聚合多个状态的改变,最终生成新的状态对象。在 Redux 中,这个新的状态对象就是由 reducer 常量返回的对象。
Action
Action 是一个描述发生了什么事情的普通对象。Action 对象必须包含一个 type 属性,用来表示这个 Action 的类型。其它的数据可以自由添加。
Redux 单向数据流
Redux 单向数据流是一个非常重要的概念。它是指 Redux 中的数据流在整个应用程序中保持单向流动的性质,也就是说,我们不能随便改变 store 中的数据。
Redux 单向数据流的流程图如下所示:
- Redux store 中的数据包含了完整的应用程序状态。
- 当应用程序中的某个事件发生时,Redux 构造一个 action 对象。
- Redux 通过调用一个或多个 reducer 函数来处理 action 对象。
- Reducer 函数通过使用旧的状态和 action 对象返回一个新的状态。
- State 更新后会发生某些操作,如更新页面。
下面我们通过一个实例来解释单向数据流。
单向数据流实例解析
我们可以考虑一个添加待办事项的 Todo 应用程序,其中包含的所有待办事项都存储在 Redux store 中。在这个应用程序中,单向数据流是如何运作的呢?
初始化 store
我们的程序必须有一个存储所有待办事项的地方。我们使用 Redux store 来存储这些待办事项。Store 是 Redux 中的关键部分,因为它保存整个应用的状态。
初始化 store 的代码:
import { createStore } from 'redux'; import rootReducer from '../reducers'; const store = createStore(rootReducer);
Action
我们需要一个 action 对象来代表用户添加待办事项的事件。每个 action 都有一个 type 属性和一个 payload 属性,payload 包含当前待办事项的数据。如下:
{ type: 'ADD_TODO', payload: { id: Math.floor(Math.random() * 1000), title: 'A new todo' } }
Reducer
当用户添加一个新的待办事项时,Redux store 中的状态必须发生改变。为了实现这一点,我们需要向 Reducer 中传递一个 action 对象,并根据 Action 的类型返回一个新的状态。如下所示:
-- -------------------- ---- ------- ----- ------------- - - ------ -- -- -- ----- ---- -------- -------------------------------- ------- - ------------------- - ---- ----------- ------ - --------- ------ ---------------- --------------- -- -------- ------ ------ - -
Dispatch
Dispatch 是连接一个 action 和一个 reducer 的方法。当用户触发一个动作(比如添加待办事项时),我们会用 dispatch 方法来发送一个 action 到 reducer 中。代码如下:
store.dispatch({ type: 'ADD_TODO', payload: { id: Math.floor(Math.random() * 1000), title: 'A new todo' } });
State 更新
state 的最新版本由 reducer 函数返回,并被更新到 Redux store 中。因此,在 store 中,最新版本的状态由 reducer 的返回值代表。
Redux 与 React 结合
通常情况下,我们在 React 应用程序中使用 Redux。在 React 应用程序中使用 Redux 总是遵循一个类似的模式:
- 在应用程序入口文件中创建 Redux store。
- 将 provider 组件与 React 应用程序根组件进行嵌套,通过 store 属性将 store 传递给 provider 组件。
- 需要使用 Redux 状态的组件使用 connect 函数连接到 Redux store。
-- -------------------- ---- ------- ------ ----- ---- -------- ------ -------- ---- ------------ ------ - -------- - ---- -------------- ------ - ----------- - ---- -------- ------ ----------- ---- ------------- ------ --- ---- -------- ----- ----- - ------------------------- ---------------- --------- -------------- ---- -- ------------ ---------------------------------
在 React 应用程序中使用 Redux 状态的组件需要通过 connect 函数连接到 Redux store。代码如下:
-- -------------------- ---- ------- ------ ----- ---- -------- ------ - ------- - ---- -------------- ------ - ------- - ---- ------------- -- -- ------ ----- -------- ------- --------------- - ------------------ - ------------- ---------- - - ------ -- -- ------------ - ------------------------ ----------------- - ----------------------------- - --------------- - --------------------- ----------------- - --------- - -- ------------------------ --- --- ------- ----- ------- - - --- ------------------------ - ------ ------ ---------------- -- ---------------------------- --------------------- ----- - -------- - ------ - ----- ------ ----------- ---------------- ----- ---------------------------- ------------------------ -- ------- ----------------------------------- ---- -------------------------- -- - --- ------------------------------- --- ----- ------ - - - ----- --------------- - ----- -- - ------ - ------ ----------- - -- ----- ------------------ - -------- -- - ------ - -------- ------- -- -------------------------- - -- ------ ------- ------------------------ ------------------------------
在上面的代码中,我们可以看到 mapStoreToProps 和 mapDispatchToProps 两个函数,它们实际上用来告诉 connect 函数如何将 Redux store 数据映射到组件属性中。
我们可以给 addTodo 函数传递一个 todo 对象,并派发一个 addTodo action 到 reducer 中。action 会生成一个新的状态,并通过 store 保存它。connect 函数将这个状态映射到组件属性中,并通过通知 React 重新渲染组件来更新 UI。
结论
Redux 单向数据流在构建 Web 应用程序时非常有用,它提供了更好的数据管理和控制。Redux 有三个核心概念:Store、Action 和 Reducer。Redux 单向数据流是确保 Redux 中数据流向的重要机制,它可以帮助您更好地理解 Redux 的工作原理。在 React 应用程序中应用 Redux,需要连接组件到 Redux store 并使用在组件中使用 connect 函数进行管理。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6728924a2e7021665e20b8bf