Redux 是一种状态管理库,主要用于 JavaScript 应用程序的状态管理。在 Node.js 中,被广泛应用于构建可伸缩、可重用的web应用程序。本文将介绍 Redux 在 Node.js 中的使用,包括基础概念、使用方法以及优化方案,并提供示例代码。
Redux 基础概念
Store
Store 是应用程序中保存状态的容器。它是单一的 JavaScript 对象。Store 的创建需要引入 Redux 中的 createStore 函数。createStore 接收 reducer 函数和可选的初始状态作为参数,并返回一个对象,该对象有三个主要方法:
- getState(): 返回当前 Store 中的状态
- dispatch(action): 触发 Store 中相应的 Action
- subscribe(listener): 监听 Store 中状态的变化
Action
Action 是一个包含 type 属性的普通 JavaScript 对象。Type 属性指定 Action 的类型。Action 可以有任意的附加数据。例如,当用户点击一个按钮时,我们可以创建一个 action,type 为 "BUTTON_CLICKED",并传递一些相关的数据。
Reducer
Reducer 用于描述应用程序的状态如何响应 Action 并执行操作的纯函数。Reducer 接收先前状态和当前 action 作为输入,并返回新状态的输出。Reducer 用于根据 Action 的类型更新 Store 中的状态。
在 Node.js 中使用 Redux
安装
在 Node.js 中使用 Redux 需要安装 redux 和 redux-thunk 两个库。redux-thunk 是 Redux 的中间件,它允许我们在 Action Creator 中返回一个函数而不是一个 Action 对象。
npm install redux redux-thunk
示例代码
我们将创建一个 Todo 应用程序来演示 Redux 在 Node.js 中的使用。
创建应用
我们首先创建一个 app.js 文件,并引入所需库和文件:
-- -------------------- ---- ------- ----- - ------------ --------------- - - ----------------- ----- --------------- - ------------------------------- ----- ------------ - - ------ -- -- -- ------- -------- ----------------- - ------------- ------- - ------ ------------- - ---- ----------- ------ ----------------- ------ - ------ ---------------- - ----- ------------ ---------- ----- -- --- ---- -------------- ------ ----------------- ------ - ------ ---------------------- ------ -- - -- ------ --- ------------- - ------ ----------------- ----- - ---------- --------------- -- - ------ ----- -- --- -------- ------ ------ - - -- ----- ----- ----- - ------------ ------------ -------------------------------- --
这里我们定义了一个 initialState 对象,包含一个 todos 数组。我们创建了一个 todoReducer 函数,在初始化状态下返回我们的 initialState,当 Action 类型为 ADD_TODO 或 TOGGLE_TODO 时,我们修改相应的 state。我们使用 createStore 函数将 todoReducer 和 thunkMiddleware 组合成一个 Store。
定义 Action
我们需要在程序中定义 Action,定义如下:
-- -------------------- ---- ------- ----- -------- - ----------- ----- ----------- - -------------- -------- ------------------- - ------ - ----- --------- ---- - - -------- ----------------------- - ------ - ----- ------------ ----- - -
我们定义了两个 Action:ADD_TODO 和 TOGGLE_TODO。在 addTodoAction 和 toggleTodoAction 中分别返回了相应 type 的 Action 对象。这里我们只传递了 text 和 index 两个参数作为数据,以后可以传递任何需要的数据。
Action Creator
我们使用 Action Creator 来创建一个 action,然后将其分派到 Store 中。Action Creator 是一个函数,它返回一个 action。实现如下:
-- -------------------- ---- ------- -------- ------------------------ - ------ ---------- --------- -- - ----- ------ - -------------------- ----------------- - - -------- ---------------------------- - ------ ---------- --------- -- - ----- ------ - ------------------------ ----------------- - -
此处我们定义了 addTodoAndDispatch 和 toggleTodoAndDispatch 函数分别对应 addTodoAction 和 toggleTodoAction。我们将分派操作放在函数内部,返回一个函数,这个函数接收两个参数:dispatch 和 getState。dispatch 函数用于分派 Action 到 Store 中,getState 用于获取当前 Store 中的状态。
优化方案
使用 immutable.js
我们将使用 immutable.js 库来优化我们的 reducer 函数。我们将安装 immutable.js:
npm install immutable
首先,我们将创建一个 immutable 对象,用于存储 todos 数组。
-- -------------------- ---- ------- ----- - ---- ---- - - --------------------- ----- ------------ - ----- ------ ------ --- -------- ----------------- - ------------- ------- - ------ ------------- - ---- ----------- ------ --------------------- ----- -- ---------------- ----- ------------ ---------- ----- ----- ---- -------------- ------ ------------------------ ------------- ------------- --------- -- ------------ -------- ------ ------ - -
在 reducer 中,我们将之前的 todos 数组改为 immutable List()。在 ADD_TODO 中我们使用 update 方法更新 todos,而在 TOGGLE_TODO 中,我们使用 updateIn 方法更新某个元素的值。
这样做可以有效地减少数据不必要的副本,从而提高性能。
Memoization
Memoization 是用于将函数缓存结果的技术。如果两个参数相同,则返回相同的结果。Memoization 可以有效地提高函数的性能。
我们将使用 memoize 函数从 redux-memoize 库 创建一个缓存版本的 addTodoAndDispatch:
const memoize = require('redux-memoize').default; const dispatchAddTodo = memoize(addTodoAndDispatch);
总结
在本文中,我们介绍了 Redux 在 Node.js 中的使用,包括基础概念、使用方法以及优化方案,并提供了示例代码。通过一个 Todo 应用程序,我们演示了如何创建应用程序、定义 Action 和 Action Creator,以及如何创建 reducer。
我们还介绍了如何使用 immutable.js 库优化 reducer 函数,以及如何使用 memoize 函数提高性能。
我们希望这篇文章对您在 Node.js 中使用 Redux 有所帮助,可以让您更好地掌握这项技术。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a8d17f48841e989452f19a