You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建实时React应用?能否用Socket.IO实现新闻自动更新?

React实时新闻更新实现方案

首先直接回答你关于Socket.IO的疑问:你没法直接用Socket.IO对接当前这个第三方新闻HTTP接口实现自动更新。
Socket.IO是基于WebSocket的双向通信方案,前提是对接的服务端部署了Socket.IO服务、能主动维护长连接推送消息。你现在拿到的是普通REST接口,第三方新闻平台没有开放对应的WebSocket/Socket.IO推送通道,前端直接写Socket.IO连接代码是连不通的。

下面是可行的落地思路:

方案1:自建中间层后端(真正实现前端无轮询实时更新,最推荐)

你只需要搭一个很轻量的后端服务做中转,就能完全避免前端写定时器轮询的问题:

  • 后端负责对接第三方新闻API,同时对外给前端提供Socket.IO连接服务
  • 前端加载页面后和你自己的后端建立Socket.IO长连接,上报自己需要展示哪些国家的新闻
  • 后端侧统一追踪新闻更新:如果新闻平台支持Webhook就直接接Webhook收更新通知,不支持的话后端自己做低频轮询就行——这个轮询跑在服务端,不会消耗用户端的流量和性能,比前端开定时器靠谱得多
  • 后端检测到某国家有新新闻时,直接通过长连接主动给订阅了该国家的前端发推送通知
  • 前端React收到对应国家的更新通知后,再发起请求拉取最新新闻内容,更新页面上对应国家的新闻列表即可

React侧对接的核心代码参考:

import { io } from 'socket.io-client';
import { useEffect, useState } from 'react';

// 初始化连接,指向你自己的后端服务
const socket = io(import.meta.env.VITE_SOCKET_SERVER);

function NewsList() {
  const [newsMap, setNewsMap] = useState({});
  // 配置你需要展示的国家代码
  const countryCodes = ['au', 'at', 'us', 'cn'];

  useEffect(() => {
    // 连接建立后,向后端订阅目标国家的新闻更新
    socket.emit('subscribe', countryCodes);

    // 监听新新闻推送事件
    socket.on('news-update', async (country) => {
      // 收到推送再拉取对应国家的最新数据,更新视图
      const res = await fetch(`/api/news?country=${country}`);
      const { data } = await res.json();
      setNewsMap(prev => ({ ...prev, [country]: data }));
    });

    return () => {
      socket.off('news-update');
      socket.emit('unsubscribe', countryCodes);
    };
  }, []);

  return (
    <div className="country-wrapper">
      {Object.entries(newsMap).map(([code, newsList]) => (
        <div key={code} className="country-block">
          <h3>{/* 这里映射国家代码对应中文名称,比如au对应澳大利亚 */}</h3>
          <ul>
            {newsList.map(item => (
              <li key={item.article_id}>{item.title}</li>
            ))}
          </ul>
        </div>
      ))}
    </div>
  );
}

export default NewsList;

方案2:无自建后端的替代方案

如果你暂时不想搭后端,又不想用setInterval做高频短轮询,没有办法做到完全“零请求感知更新”——毕竟第三方HTTP接口不会主动给浏览器发消息,你不主动发请求就拿不到新数据。
这种场景下你可以用浏览器原生的长轮询或者SSE(Server-Sent Events),但同样要求你对接的API本身支持这两种协议,你现在用的这个普通新闻查询接口是不支持的。

顺便提个参数错误:你示例里的country=au对应的是澳大利亚,奥地利的国家代码是at,调接口的时候别传错了。

内容的提问来源于stack exchange,提问作者Yusuf Yeşilyurt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 02:27:30