📜  在 React with Redux 应用程序中典型的数据流是什么?(1)

📅  最后修改于: 2023-12-03 15:37:29.853000             🧑  作者: Mango

在 React with Redux 应用程序中典型的数据流是什么?

React with Redux 是一种流行的 JavaScript 库和框架组合,用于构建动态 Web 应用程序。 Redux 为 React 应用程序提供了一个可预测的状态管理机制,让开发者可以更容易地在应用程序中处理和管理数据流。在本文中,我们将介绍在 React with Redux 应用程序中典型的数据流以及如何使用 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

在 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 库,可以更轻松地管理和更新应用程序的状态,并实现高效的代码复用和维护性。