在现代的 Web 应用程序中,消息通知是一个非常重要的功能。React 全家桶是一个流行的前端框架,它提供了许多工具和库,可以帮助我们快速开发 Web 应用程序。在这篇文章中,我们将使用 React 全家桶来实现一个简单的消息通知模块。
技术栈
在实现消息通知模块时,我们将使用以下技术:
- React:一个用于构建用户界面的 JavaScript 库。
- React Router:一个用于构建单页应用程序的路由库。
- Redux:一个状态管理库,用于管理应用程序的状态。
- React-Redux:React 和 Redux 的集成库。
- Redux-Saga:一个用于管理应用程序副作用的库。
实现
设计
在我们开始编码之前,让我们先设计一下我们的消息通知模块。我们的模块应该具有以下功能:
- 显示当前用户的未读消息数量。
- 显示当前用户的消息列表。
- 当用户点击消息时,将其标记为已读。
- 当用户标记所有消息为已读时,将未读消息数量归零。
- 当用户收到新消息时,自动更新未读消息数量。
创建 React 应用程序
我们将使用 Create React App 来创建我们的应用程序。在终端中输入以下命令:
npx create-react-app notification-app cd notification-app
安装依赖项
我们需要安装 React Router、Redux、React-Redux 和 Redux-Saga。在终端中输入以下命令:
npm install react-router-dom redux react-redux redux-saga
添加路由
我们的应用程序将有两个页面:消息列表和消息详情。我们将使用 React Router 来管理路由。在 src 目录下创建一个名为 routes.js 的文件,并添加以下代码:
-- -------------------- ---- -------
------ ----- ---- --------
------ - ------- ----- - ---- -------------------
------ ---------------- ---- --------------------------------
------ ------------------ ---- ----------------------------------
----- ------ - -- -- -
--------
------ ----- -------- ---------------------------- --
------ ------------------------- ------------------------------ --
---------
--
------ ------- -------创建 Redux Store
我们将使用 Redux 来管理应用程序的状态。在 src 目录下创建一个名为 store.js 的文件,并添加以下代码:
-- -------------------- ---- ------- ------ - ------------ --------------- - ---- -------- ------ -------------------- ---- ------------- ------ ----------- ---- ------------- ------ -------- ---- ---------- ----- -------------- - ----------------------- ----- ----- - ------------ ------------ -------------------------------- -- ----------------------------- ------ ------- ------
在上面的代码中,我们创建了一个 Redux Store,并将 Redux Saga 中间件应用于它。我们还将 rootSaga 作为参数传递给 sagaMiddleware.run() 函数。
创建 Redux Reducer
我们需要创建一个 Redux Reducer 来管理应用程序的状态。在 src 目录下创建一个名为 reducers.js 的文件,并添加以下代码:
-- -------------------- ---- -------
------ - --------------- - ---- --------
------ -
----------------------------
----------------------------
----------------------------
----------------------------------
----------------------------------
----------------------------------
---------------------------------------
---------------------------------------
---------------------------------------
- ---- ------------
----- ------------ - -
-------------- ---
------------ --
---------- ------
------ -----
--
----- -------------------- - ------ - --------------------------- ------- -- -
------ ------------- -
---- ----------------------------
------ -----------------------------
---- ----------------------------------
------ ---------------------- --
--------------- --- -----------------
- - ---------------- ------- ---- -
- -------------
--
---- ---------------------------------------
------ ---------------------- -- -- ---------------- ------- ---- ----
--------
------ ------
-
--
----- ------------------ - ------ - ------------------------- ------- -- -
------ ------------- -
---- ----------------------------
------ ---------------------------
---- ----------------------------------
------ ----- - --
---- ---------------------------------------
------ --
--------
------ ------
-
--
----- ---------------- - ------ - ----------------------- ------- -- -
------ ------------- -
---- ----------------------------
---- ----------------------------------
---- ---------------------------------------
------ -----
---- ----------------------------
---- ----------------------------
---- ----------------------------------
---- ----------------------------------
---- ---------------------------------------
---- ---------------------------------------
------ ------
--------
------ ------
-
--
----- ------------ - ------ - ------------------- ------- -- -
------ ------------- -
---- ----------------------------
---- ----------------------------------
---- ---------------------------------------
------ ---------------------
---- ----------------------------
---- ----------------------------
---- ----------------------------------
---- ----------------------------------
---- ---------------------------------------
---- ---------------------------------------
------ -----
--------
------ ------
-
--
----- ----------- - -----------------
-------------- ---------------------
------------ -------------------
---------- -----------------
------ -------------
---
------ ------- ------------在上面的代码中,我们定义了四个 Redux Reducer:notificationsReducer、unreadCountReducer、isLoadingReducer 和 errorReducer。这些 Reducer 管理应用程序的不同方面的状态。
创建 Redux Action
我们需要创建 Redux Action 来更新应用程序的状态。在 src 目录下创建一个名为 actions.js 的文件,并添加以下代码:
-- -------------------- ---- -------
------ ----- --------------------------- - ------------------------------
------ ----- --------------------------- - ------------------------------
------ ----- --------------------------- - ------------------------------
------ ----- --------------------------------- - ------------------------------------
------ ----- --------------------------------- - ------------------------------------
------ ----- --------------------------------- - ------------------------------------
------ ----- -------------------------------------- - -----------------------------------------
------ ----- -------------------------------------- - -----------------------------------------
------ ----- -------------------------------------- - -----------------------------------------
------ ----- ------------------------- - -- -- --
----- ----------------------------
---
------ ----- ------------------------- - ------------- -- --
----- ----------------------------
-------- -
--------------
------------ --------------------------------- -- -----------------------------
--
---
------ ----- ------------------------- - ----- -- --
----- ----------------------------
-------- -
------
--
---
------ ----- ----------------------------- - -- -- --
----- ----------------------------------
-------- -
---
--
---
------ ----- ----------------------------- - -- -- --
----- ----------------------------------
-------- -
---
--
---
------ ----- ----------------------------- - ----- -- --
----- ----------------------------------
-------- -
------
--
---
------ ----- --------------------------------- - -- -- --
----- ---------------------------------------
---
------ ----- --------------------------------- - -- -- --
----- ---------------------------------------
---
------ ----- --------------------------------- - ----- -- --
----- ---------------------------------------
-------- -
------
--
---在上面的代码中,我们定义了 Redux Action,它们将被用于更新应用程序的状态。
创建 Redux Saga
我们需要创建 Redux Saga 来处理应用程序的副作用。在 src 目录下创建一个名为 sagas.js 的文件,并添加以下代码:
-- -------------------- ---- -------
------ - ----- ---- --------- - ---- ---------------------
------ -
----------------------------
--------------------------
--------------------------
----------------------------------
------------------------------
------------------------------
---------------------------------------
----------------------------------
----------------------------------
- ---- ------------
----- ------------ - ---------------------------------------
--------- -------------------- -
--- -
----- -------- - ----- ----------- -------------------------
----- ------------- - ----- --------------- ---------
----- ----------------------------------------------
- ----- ------- -
----- --------------------------------------
-
-
--------- ------------------------ ------- -- -
--- -
----- ----------- -------------------------------------- -
------- --------
----- ---------------- ------- ---- ---
---
----- -----------------------------------------------
- ----- ------- -
----- ------------------------------------------
-
-
--------- ---------------------------- -
--- -
----- ----------- ------------------------ -
------- --------
----- ---------------- ------- ---- ---
---
----- -----------------------------------------
- ----- ------- -
----- ----------------------------------------------
-
-
--------- ---------- -
----- -------------------------------------- --------------------
----- -------------------------------------------- ------------------------
----- ------------------------------------------------- ----------------------------
-
------ ------- ---------在上面的代码中,我们定义了三个 Redux Saga:fetchNotifications、markNotificationAsRead 和 markAllNotificationsAsRead。这些 Saga 处理应用程序的副作用,并根据结果更新应用程序的状态。
创建 React 组件
现在我们可以创建我们的 React 组件了。在 src/components 目录下创建一个名为 NotificationList.js 的文件,并添加以下代码:
-- -------------------- ---- -------
------ ------ - --------- - ---- --------
------ - ------------ ----------- - ---- --------------
------ - ---- - ---- -------------------
------ -
--------------------------
------------------------------
----------------------------------
- ---- -------------
----- ---------------- - -- -- -
----- -------- - --------------
----- ------------- - ----------------- -- ---------------------
----- ----------- - ----------------- -- -------------------
----- --------- - ----------------- -- -----------------
----- ----- - ----------------- -- -------------
------------ -- -
--------------------------------------
-- ------------
----- ---------------- - -- -- -
--------------------------------------------
--
----- ------------------- - -- -- -
----------------------------------------------
--
------ -
-----
----------------------
--------- ------ -----------------
---------- -- ------------------
------ -- -----------------------
------------------------------- -- -
---- ----------------------
-----
----------------------------------------
-------- ------ ------------------- - --------- - ----- --
-
--------------------
-------
--------------------- -- -
------- ----------- -- -----------------------------------
---- -- ----
---------
--
------
---
------------ - - -- -
------- ---------------------------------- --- -- -------------
--
------
--
--
------ ------- -----------------在上面的代码中,我们定义了一个名为 NotificationList 的 React 组件。这个组件显示用户的未读消息数量和消息列表,并允许用户将消息标记为已读。
我们还定义了 handleMarkAsRead 和 handleMarkAllAsRead 函数,它们将被用于处理用户的交互。
在 src/components 目录下创建一个名为 NotificationDetail.js 的文件,并添加以下代码:
-- -------------------- ---- -------
------ ------ - --------- - ---- --------
------ - ------------ ----------- - ---- --------------
------ - ----- --------- - ---- -------------------
------ - ----------------------------- - ---- -------------
----- ------------------ - -- -- -
----- -------- - --------------
----- - -- - - ------------
----- ------------ - ----------------- --
------------------------------------- -- --------------- --- ------------
--
------------ -- -
-- ------------- -- --------------------- -
---------------------------------------------------------
-
-- ---------- ---------------
------ -
-----
---------------- -----------
----- ----------- -- --------------------
------------- - -
-----
-----------------------------
--------------------------
------
- - -
--------------- --- ---------
--
------
--
--
------ ------- -------------------在上面的代码中,我们定义了一个名为 NotificationDetail 的 React 组件。这个组件显示消息的详细信息,并在用户访问消息详情页面时将消息标记为已读。
添加样式
最后,我们可以为我们的应用程序添加一些样式。在 src 目录下创建一个名为 index.css 的文件,并添加以下代码:
a {
text-decoration: none;
}
button {
margin-left: 1rem;
}在 src/index.js 文件中,我们可以将这个样式文件导入到我们的应用程序中:
-- -------------------- ---- -------
------ ----- ---- --------
------ -------- ---- ------------
------ - -------- - ---- --------------
------ - ------------- - ---- -------------------
------ ----- ---- ----------
------ ------ ---- -----------
------ --------------
----------------
--------- --------------
---------------
------- --
----------------
------------
--------------------------------
--示例代码
你可以在 GitHub 上查看完整的示例代码。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67d394f6a941bf71346d434e