使用 Redux 管理 React 项目中的 session localStorage 之三

阅读时长 8 分钟读完

在前两篇文章中,我们介绍了 Redux 的概念以及如何使用 Redux 管理 React 项目中的 session localStorage。本文将介绍如何正确地使用 Redux 来管理 web 应用程序中的用户会话(Session)以及相应的 localStorage。

引言

在传统的 web 应用程序中,用户的会话状态保存在服务器上,而在现代的 SPA(Single-Page Application)中,许多人选择将客户端(Client)和服务器(Server)之间的通信过程最小化。在这种情况下,用户会话状态常常在客户端被存储为一个对象,该对象通常被存储在浏览器的 localStorage 中。

如果您正在构建一个 SPA,您可能会需要许多组件共享在 localStorage 中存储的状态。为了解决这个问题,我们可以使用 Redux。Redux 允许我们将状态存储在一个单一的地方,并使组件能够轻松地访问这些状态。

下面,我们将介绍如何使用 Redux 来管理 web 应用程序中的用户会话状态以及相应的 localStorage。

使用 Redux 管理 web 应用程序中的会话状态

为了使您的 web 应用程序能够正确地管理用户会话状态,您需要定义以下三种类型的 actions:

  1. 登陆 (Login) — 该 action 负责保存用户登录后的状态。当用户成功登录时,该 action 会将用户的 Token,用户名,以及其他必要的信息保存在 Redux store 中。
  2. 注销 (Logout) — 该 action 负责清除用户的会话状态。当用户注销登录时,该 action 会将用户的信息从 Redux store 中清除。
  3. 更新 (Update) — 该 action 负责更新用户的信息。当用户的信息发生变化时,该 action 会将变化的信息保存在 Redux store 中。

以下是一个示例 action:

在上面的代码中,我们定义了一个名为 LOGIN_USER 的 action。当该 action 被调用时,会将用户的 Token 和用户名作为 payload 保存在 store 中。

接下来,我们需要为这些 action 添加相应的 reducers。Reducer 是一个纯函数,它接收一个 action 和旧的 state,然后返回一个新的 state。在 Redux store 中,Reducer 负责更新和检索状态。

以下是一个示例 reducer:

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

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

在上面的代码中,我们定义了一个 reducer,它可以接收一个名为 LOGIN_USER 的 action。当该 action 被调用时,reducer 会将 token 和 username 添加到当前 store 中的状态。

最后,我们需要将 reducers 添加到 Redux store 中:

在上述代码中,我们使用 combineReducers() 函数将 reducers 组合到一个根 reducer 中。然后,我们使用 createStore() 函数创建一个新的 store。

最后,我们可以在 React 组件中使用 store。

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

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

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

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

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

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

在上述代码中,我们使用 useSelector() hook 获取当前的用户状态,并使用 login() action 将用户状态保存到 store。然后,我们在 UserProfile 组件中获取用户状态。

使用 Redux 管理 localStorage

在前面的例子中,我们展示了如何使用 Redux 来管理用户会话状态。现在来看一下如何使用 Redux 来管理 web 应用程序中的 localStorage。

我们将 localStorage 封装在单独的仓库(Repository)中。仓库是一个纯 JavaScript 对象,它提供了一些帮助函数,用于在 localStorage 中读取和写入数据。

以下是一个示例代码:

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

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

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

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

在上面的代码中,我们定义了一个 localStorageRepository 对象,它封装了 localStorage 的读取和写入操作。该对象提供了一个简单的接口,用于读取和写入保存在 localStorage 中的数据。

现在我们来看一下如何在 Redux 中集成 localStorageRepository 对象。

首先,我们需要为 localStorageRepository 编写 Reducer:

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

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

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

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

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

在上述代码中,我们将初始化 state 设置为从 localStorage 中读取的用户数据,然后在 LOGIN_USER action 中更新 state,并将其写入 localStorage。

最后,我们可以像使用普通的 Redux store 一样,使用我们的 localStorage 对象。

当设置 localStorage 时需注意,将状态直接保存在 localStorage 中可能会导致存储量过大。可以考虑存储一个标记(token)然后以该 token 为索引到一个具体的对象里。

结论

本文介绍了如何使用 Redux 来管理 web 应用程序中的用户会话状态以及相应的 localStorage。我们已经学习了如何定义 actions,reducer,以及如何在组件中使用这些数据。我们还介绍了如何将 localStorage 封装在一个 Repository 中,并将其与 Redux 衔接。希望这个教程可以对你有所帮助,让你的 web 应用程序更加优秀。

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

纠错
反馈