0Pricing
React Academy · 课时

构建实时通知信息流

结合 SSE 与 React 状态,构建无需用户操作即可实时更新的通知信息流

构建实时通知信息流 是 CoddyKit 上的免费 React Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

通知流架构

实时通知流将用于接收通知的服务器发送事件流,与用于将项目标记为已读的接口结合起来。组件为通知列表维护本地状态,在 useEffect 中通过 EventSource 订阅服务器流,并使用乐观更新处理用户交互(标记为已读、关闭)。

通知数据结构

通知对象通常具有以下结构:{ id: string, type: 'info' | 'warning' | 'success', message: string, timestamp: string, read: boolean }。类型字段决定图标和颜色。已读字段用于跟踪用户是否已确认通知。时间戳字段支持按时间段分组。

订阅服务器发送事件流

在 useEffect 中,创建一个连接到 /api/notifications/stream 的 EventSource。每当收到消息事件时,解析 JSON,并将新通知插入状态数组的开头:setNotifications(prev => [JSON.parse(e.data), ...prev])。将通知插入开头(即将元素放到数组开头)可以让最新通知显示在顶部,这是通知流的标准做法。

未读数量徽标

无需额外状态即可从通知数组中派生未读数量:const unreadCount = notifications.filter(n => !n.read).length。请将其显示为通知铃铛图标上的徽标。每当通知状态发生变化时,数量都会自动更新,无需单独管理状态。

使用乐观更新标记为已读

用户点击通知时,请立即应用乐观的已读更新:setNotifications(prev => prev.map(n => n.id === id ? { ...n, read: true } : n))。然后在后台向 /api/notifications/:id 发送 PATCH 请求,并附带 { read: true }。如果请求失败,请回滚乐观更新。

按时间分组通知

请按以下类别分组显示通知:“今天”(同一自然日)、“昨天”和“更早”。请使用通知的时间戳和当前日期计算分组:const today = new Date().toDateString()。将每个分组渲染为带有标题标签的独立区域。这样可以更轻松地浏览较长的通知列表。

用于后台活动的提示通知

当用户位于其他页面且通过服务器发送事件收到新通知时,请显示提示消息,而不是(或同时)更新通知列表。请使用全局通知上下文或 Zustand 存储,以便服务器发送事件订阅者和提示消息渲染器都能访问它。提示消息会在几秒后消失,但通知仍会保留在列表中。

全局通知上下文

对于需要显示在整个应用中的通知,请在应用根层级将其存储在 React 上下文或 Zustand 存储中。服务器发送事件订阅应位于组件树顶部附近的提供程序组件中。任何组件都可以通过共享存储读取通知或分发新通知,从而支持在任何页面渲染提示消息。

标签页获得焦点时重连服务器发送事件

EventSource 会在网络断开时自动处理重连,但标签页可见性变化的情况有所不同。用户长时间离开后切回标签页时,服务器可能已经终止服务器发送事件连接。EventSource 会自动重新连接,而最后事件 ID 机制会重放用户在标签页处于后台期间错过的通知。

在页面导航期间保留通知

单页应用在离开页面时会丢失内存中的通知状态。请在每次更新后将通知存储到 localStorage:localStorage.setItem('notifications', JSON.stringify(notifications))。组件挂载时,请先从 localStorage 初始化状态,再连接服务器发送事件流。这样可以在页面导航期间保留通知历史。

服务器发送事件端点模式

服务器端服务器发送事件端点必须设置特定的请求头:Content-Type: text/event-stream、Cache-Control: no-cache 和 Connection: keep-alive。在 Express/NestJS 中,应将事件写成 data: ${JSON.stringify(payload)}\n\n——请注意,双换行表示一个事件的结束。服务器必须在每次写入后刷新缓冲区,以确保浏览器立即收到事件。

服务器发送事件流端点模式

服务器发送事件端点的正确内容类型请求头是什么?

课程回顾:实时通知流

通知流将服务器发送事件订阅(在 useEffect 中使用 EventSource 并进行清理)与接口变更(使用 PATCH 标记为已读)结合起来。数据结构包括:标识、类型、消息、时间戳和已读状态。使用筛选操作派生 unreadCount,并按今天、昨天和更早分组显示。使用全局上下文或 Zustand 支持跨页面提示消息。持久化到 localStorage,以便在页面导航后恢复。服务器发送事件端点需要内容类型为服务器发送事件、缓存控制为不缓存,并使用双换行作为事件分隔符。

常见问题解答

「构建实时通知信息流」课时是免费的吗?

是的 — 「构建实时通知信息流」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「构建实时通知信息流」这节课中我会学到什么?

结合 SSE 与 React 状态,构建无需用户操作即可实时更新的通知信息流 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「构建实时通知信息流」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. SSE、WebSockets 与轮询对比
  2. 在 React 中使用 EventSource 消费 SSE 流
  3. 长轮询模式与重连逻辑
  4. 构建实时通知信息流
← 返回 React Academy