Redux+Promise+React 实现异步数据更新

阅读时长 10 分钟读完

Redux+Promise+React 实现异步数据更新

在现代 Web 应用程序开发中,异步操作非常常见,而且非常有用。这使得应用程序可以更高效地处理资源,提高用户体验。然而,异步操作也带来了一些困难,例如异步代码非常难以理解和工作。

Redux 和 Promise 是广泛使用的库,它们可以帮助解决异步数据更新的问题。本文将介绍如何使用 Redux 和 Promise 来实现异步数据更新,以及如何在 React 应用程序中使用它们。

前置知识

在阅读本文之前,您应该:

  • 了解 JavaScript 的基础。
  • 了解 React 和 Redux 的基础概念和用法。
  • 熟悉 Promise 的概念和 API。

Redux

Redux 是一个用于管理 JavaScript 应用程序状态的库。它围绕着一个单一的全局状态树(state tree)来构建应用程序。Redux 提供了一种可预测的状态管理模式,可以使应用程序更容易理解和调试。

Redux 的核心是一个不可变的 state,这意味着您不能直接修改它。相反,您应该通过发出 actions 来更新 state。每个 action 的形式如下:

在 Redux 中,更新 state 的唯一方式是通过 reducers。Reducer 是一个纯函数,它接受当前状态和要应用到该状态的 action,并返回新状态。Reducer 在 Redux 应用程序中起着非常重要的作用。

Redux 与 React 的配合使用通常是通过 React 绑定库(例如 react-redux)完成的。React 组件中的数据通常来自 Redux store。当组件需要更新数据时,它会发出 actions,然后通过 reducers 更新 store 中的数据。

Promise

Promise 是 JavaScript 中的一个基本概念,它被用于管理异步操作。Promise 表示一个异步操作的结果,它有三种状态:未完成(pending)、已完成(fulfilled)和已拒绝(rejected)。

当 Promise 被创建时,它处于未完成状态。当异步操作成功时,Promise 的状态将变为已完成,并带有异步操作的结果。当异步操作失败时,Promise 的状态将变为已拒绝,并带有一个错误对象。

Promise 是一种非常强大的工具,它可以让您更好地组织代码和处理异步操作。它是异步编程的未来,因为它提供了比传统的回调函数更好的错误处理和代码组织方法。

Redux 和 Promise 的结合使用

Redux 可以很好地与 Promise 配合使用,以处理异步操作。Redux 中的 actions 可以返回 Promise,这使得异步操作更容易处理。当 Promise 结束时,可以按照 needs 的方式发送同步 actions。

下面是一个示例 Redux action,它使用 Promise 来更新数据:

-- -------------------- ---- -------
------ -------- ----------- -
  ------ -------- -- -
    ---------- ----- ------------------ ---
    ------ ------------------
      -------------- -- ----------------
      ---------- -- -
        ---------- ----- --------------------- -------- ---- ---
      --
      --------- -- -
        ---------- ----- -------------------- ---
      ---
  --
-

上面的代码做了以下事情:

  • 当 fetchData 函数被调用时,它 dispatch 了一个 action,该 action 表示数据开始加载。
  • 然后,fetch('/api/data') 函数执行异步网络请求,返回一个 Promise。
  • 在 Promise 结束时,我们得到了响应数据 JSON,它被分配给 data 变量。
  • 最后,dispatch 调用会将得到的 data 作为 payload,发送一个带有 FETCH_DATA_SUCCESS type 的 action。

当您需要更新状态时,这是一种非常有用的方法。如果您需要加载数据,并且在加载完成后需要更新状态,那么这就是正确的方法。

Redux Promise 中间件

Redux Promise 中间件是一个可以轻松使用 Promise 的 Redux 辅助工具。它允许您在 actions 中返回 Promise,并按照通常的方式处理 actions。Redux Promise 中间件会在 Promise 结束时自动发送同步 actions。

使用 Redux Promise 中间件,我们可以更新前面的 fetchData 函数,使它更加简单:

请注意,我们这里直接将 Promise 作为 redux action 的 payload 进行返回。中间件会在 Promise 结束时,自动帮我们 dispatch 一个新的 type 为 FETCH_DATA_FULFILLED 的 action。

可以在 store 的 applyMiddleware() 函数中使用 Redux Promise 中间件,如下所示:

以上代码创建了一个 store,它使用了 Redux Promise 中间件。这使得我们可以直接返回 Promise 在派发的 action 中,而不必考虑中间的 dispatch 和 type。例如,fetchData 函数返回 Redux action 对象直接从中提取出了 response.json()。

React 中的异步请求

现在我们准备好开始将 Redux 和 Promise 与 React 应用程序一起使用来更新异步数据了。首先,让我们考虑一个简单的 React 组件,它需要在首次加载和用户请求时加载异步数据。

-- -------------------- ---- -------
------ ------ - --------- - ---- --------

----- ----------- ------- --------- -
  ------------------ -
    -------------

    ---------- - -
      ---------- -----
      ----- ----
    --

    ------------- - -------------------------
  -

  ------------------- -
    ----------------
  -

  ---------- -
    -- ---------
  -

  -------- -
    -- ---------------------- -
      ------ ----------------------
    - ---- -- ---------------- --- ----- -
      ------ -----
    - ---- -
      ------ -
        -----
          -----------------
        ------
      --
    -
  -
-

------ ------- ------------

上面的代码演示了 React 组件中的异步请求。当组件挂载时,我们会立即发出异步请求。当数据加载完成时,我们会更新组件的状态,以反映新的数据。

为了使 loadData 函数更容易维护,并且可以将其与 Redux 和 Promise 配合使用,我们推荐将其拆分为以下几个部分:

  1. fetchData:实际发出请求并返回 Promise。

  2. loadData:在 Promise 结束时更新 state。

下面的代码演示了如何实现这两个函数:

-- -------------------- ---- -------
------ ------ - --------- - ---- --------
------ - ------- - ---- --------------
------ - --------- - ---- ------------

----- ----------- ------- --------- -
  ------------------ -
    -------------

    ---------- - -
      ---------- ----
    --

    ------------- - -------------------------
  -

  ------------------- -
    ------------------------------ -- -
      ----------------
    ---
  -

  ----------------------------- -
    -- ---------------- --- --------------- -
      ----------------
    -
  -

  ---------- -
    ---------------
      ---------- -----
    ---
  -

  -------- -
    -- ---------------------- -
      ------ ----------------------
    - ---- -
      ------ -
        -----
          -----------------
        ------
      --
    -
  -
-

-------- ---------------------- -
  ------ -
    ----- ----------
  --
-

------ ------- ------------------------ - --------- ----------------

此示例将发出异步请求的代码移动到 Redux action 中,并使用 React 绑定函数与 Redux store 进行连接。此外,我们还更新了组件的状态以反映请求是否完成。

fetchData 函数的工作方式与前面的示例非常相似,但此时它返回 Promise,并使用 Redux Promise 中间件自动发送同步 actions。我们之后详细讲述如何实现返回 Promise 的 fetchData 函数。

componentDidUpdate() 函数在组件的 props 更新时被调用。因此,当 Redux store 中的 data 更新时,我们可以使用 setState() 函数将 isLoading 设置为 false。

如果您使用 Redux 插件查看应用程序的状态,并且在 fetchData 函数中包含 console.log() 语句,您会看到以下输出:

在上面的屏幕截图中,我们可以看到 Redux store 中包含了 “FETCH_DATA_FULFILLED” action 的消息。由于在 fetchData 函数中返回了 Promise,并将其作为 action 的 payload 进行一个同步的 dispatch,因此,这个状态消息是自动生成的。

结论

在这篇文章中,我们详细介绍了如何使用 Redux 和 Promise 来实现异步数据更新,并展示了如何在 React 应用程序中使用它们。我们看到,在 Redux 中实现异步操作并不困难,您只需要使用 Redux Promise 中间件即可轻松地返回 Promise 了。

Redux 和 Promise 都是非常有用的工具,可以帮助您将异步操作与 Redux store 结合使用。希望我们的教程可以帮助您更好地理解如何在 React 应用程序中使用异步数据,并开始使用 Redux 和 Promise 来处理异步操作!

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6770244ae9a7045d0d7a6113

纠错
反馈