React,Redux 和 GraphQL 如何工作:使用 Flux 架构

阅读时长 9 分钟读完

React、Redux 和 GraphQL 是目前前端开发最热门的技术之一。其中,React 是 Facebook 开源的一个通过组件化构建 UI 的 JavaScript 库,Redux 是一个用于 JavaScript 应用程序的可预测的状态容器,GraphQL 则是一种用于 API 的查询语言和运行时。在实践中,它们常常一起使用来构建可伸缩的 Web 应用程序。

在本篇文章中,我们将介绍如何使用 Flux 架构来整合 React、Redux 和 GraphQL。我们将深入了解 Flux 架构,学习如何将其应用到我们的 Web 应用程序中,并提供示例代码以便读者更好地理解。

什么是 Flux 架构?

Flux 是一种类似于 MVC 架构的思想,专注于解决应用程序的数据流动问题。它由 Facebook 提出,旨在解决 React 的单向数据流问题。Flux 在数据流方面有一些不同于传统 MVC 架构的特点:

  1. 单向数据流:Flux 通过在应用程序的组件之间保持单向数据流,从而确保数据流动的可控性和可预测性。

  2. 分离视图和状态:Flux 将视图和状态完全分离,从而使得应用程序的状态管理更加简洁和可控。

  3. 可预测的状态变化:通过将状态变化的逻辑放在 flux 中央的 Store 中,Flux 可以确保应用程序状态的变化是可预测的。

如何实现 Flux 架构?

Flux 的实现包括四个主要组件:Action、Dispatcher、Store 和 View。当一个用户操作(例如点击按钮)触发一个 Action 时,Action 将一个数据包传递给 Dispatcher。Dispatcher 在收到数据包后,会将该数据包分发给注册在其上的所有 Store。每个 Store 都会处理该数据包,并更新自己的状态。View 从 Store 中获取其需要的状态,并根据该状态更新自己的视图。数据流方向如下所示:

我们可以通过以下步骤来实现 Flux 架构:

  1. 创建一个 Action,表示用户的操作。例如点击按钮,Action 可以是 BUTTON_CLICK

  2. 创建一个 Dispatcher,将接收来自 Action 的数据包,并将其分发给所有注册的 Store。

  3. 创建一个 Store,处理来自 Dispatcher 的数据包,并更新自己的状态。

  4. 创建一个 View,从 Store 获取其需要的状态,并根据该状态更新视图。

实现以上步骤之后,我们就可以通过单向数据流来管理应用程序的状态了。

如何整合 React、Redux 和 GraphQL?

现在我们已经学习了 Flux 的实现,我们可以使用 React、Redux 和 GraphQL 来实现一个完整的 Web 应用程序。我们可以通过以下的步骤来实现:

  1. 创建一个 React 组件,表示我们的视图。我们将该组件传递给 Redux 的 connect() 函数,以便获取其所需的状态和动作。

  2. 创建一个 Redux Store,用于保存我们的应用程序状态。我们使用 Redux 的 combineReducers() 函数来将所有的 reducer 组合到一起。

  3. 创建一个 Redux Middleware,用于处理我们的异步请求。我们可以使用 Redux-thunk 或 Redux-saga 来实现它。

  4. 创建一个 GraphQL 客户端,用于处理我们的 GraphQL 查询和变更。我们可以使用 Apollo Client 或者 Relay。

这样,我们就可以通过这些步骤来整合 React、Redux 和 GraphQL 来构建我们的 Web 应用程序。最终的代码结构如下所示:

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

其中,components 包含我们的 React 组件,reducers 包含我们的 Redux reducer,actions 包含我们的 Redux action,store 包含我们的 Redux Store,middleware 包含我们的 Redux Middleware。

示例代码

下面是一个简单的示例代码,它展示了如何使用 React、Redux 和 GraphQL 来构建一个简单的 Web 应用程序。

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

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

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

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

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

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

以上代码中,我们定义了一个 App 组件,用于显示用户列表。我们通过 useQuery() 钩子来获取来自 GraphQL 服务器的用户数据。我们将该数据传递给 UserList 组件,然后在 App 组件中显示出来。我们还定义了一个 mapStateToProps() 函数,将我们的应用程序状态映射到 App 组件的属性中。

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

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

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

以上代码中,我们定义了一个 users reducer,用于处理来自 getUsersSuccess 动作的数据包。当我们在应用程序中调用 getUsersSuccess 动作时,Redux Store 的状态就会相应地更新。

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

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

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

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

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

以上代码中,我们定义了一个 getUsersSuccess 动作,用于处理来自 Apollo Client 的用户数据。使用 getUsers() 异步动作,我们可以从 GraphQL 服务器中获取用户数据,并将其分发给 Redux Store。

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

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

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

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

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

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

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

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

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

以上代码中,我们定义了一个 Redux Store,使用 createStore() 函数来创建它。我们还定义了一些中间件,用于处理异步动作、打印调试信息等。我们还定义了一个 Apollo Client,用于处理 GraphQL 请求。

结论

本篇文章介绍了 Flux 架构的实现、React、Redux 和 GraphQL 的整合方式,并提供了相应的示例代码。希望读者在阅读完本篇文章后,能够掌握如何使用 Flux 架构来整合 React、Redux 和 GraphQL,从而构建出一个完整的 Web 应用程序。

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

纠错
反馈