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

实时获取userData时出现无限循环问题求助

解决用户列表无限循环与实时同步问题

一、修复无限循环问题

你当前的无限循环是因为直接在组件顶层调用fetchuserData(),组件每次渲染都会执行这个函数,而setuserData又会触发组件重新渲染,形成死循环。解决方法是把初始数据请求放到useEffect中,仅在组件挂载时执行一次:

async function fetchUserData() {
  const res = await axios.get("http://localhost:3000/user-data?limit=4");
  setuserData(res.data);
}

// 仅组件挂载时请求初始数据
useEffect(() => {
  fetchUserData();
}, []);

二、优化实时同步逻辑

你的Socket连接逻辑已经正确,但需要区分数据库变更的类型(新增/更新用户),避免数据冗余或错误覆盖:

完整的Socket与数据更新逻辑:

useEffect(() => {
  const socket = io("http://localhost:3000/");
  
  socket.on("connect", () => {
    console.log("Connected to server");
  });

  socket.on("message", (newData) => {
    console.log("Received message:", newData);
    setuserData(prevData => {
      // 检查是否已存在该用户(通过唯一id判断)
      const targetIndex = prevData.findIndex(item => item.id === newData.id);
      if (targetIndex !== -1) {
        // 存在则更新对应项
        const updatedList = [...prevData];
        updatedList[targetIndex] = newData;
        return updatedList;
      } else {
        // 不存在则追加新用户
        return [...prevData, newData];
      }
    });
  });

  return () => {
    socket.disconnect();
  };
}, []);

三、列表渲染优化

你的map渲染逻辑基本没问题,注意保持key使用唯一的type.id(避免用index作为key,防止列表增删时出现渲染异常):

{userData.map((user, index) => (
  <h2
    className={`bg-${index % 2 === 0 ? "blue-100" : "white"} p-5 font-medium text-4xl text-center flex-1`}
    key={user.id}
  >
    {user.name}
  </h2>
))}

内容的提问来源于stack exchange,提问作者user19814451

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:27:03