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

React应用加载时useState中同一数据重复存储两次的问题

React应用加载时数据重复两次的问题修复

核心原因

  • 开发环境严格模式触发重复执行:React开发环境的严格模式会自动重复调用useEffect钩子,用于检测副作用问题,这会导致你的API请求被执行两次,数据重复添加到state中。
  • 异步逻辑处理错误:原代码中try/catch未正确捕获异步函数的错误(调用fetchProducts()时未加await),且finally会在API请求未完成时就设置loading为false,可能引发后续逻辑异常。

修复方案

1. 修正异步函数的错误处理与状态更新逻辑

修改useEffect内部代码,确保异步请求的错误被正确捕获,同时防止组件卸载后更新状态:

useEffect(() => {
  let isMounted = true;
  setLoading(true);
  setError(false);

  const fetchProducts = async () => {
    try {
      const data = await getProducts(limit);
      if (isMounted) {
        setProducts((prevItems) => [...prevItems, ...data.products]);
      }
    } catch (error) {
      if (isMounted) {
        setError(error);
      }
    } finally {
      if (isMounted) {
        setLoading(false);
      }
    }
  };

  fetchProducts();

  return () => {
    isMounted = false;
  };
}, [limit]);

2. 避免开发环境严格模式下的重复请求(可选)

如果需要在开发环境临时屏蔽重复请求,可以用Ref标记首次渲染:

import { useRef } from 'react';

// 组件内部定义
const isFirstRender = useRef(true);

useEffect(() => {
  if (isFirstRender.current) {
    isFirstRender.current = false;
    return;
  }

  // 此处放置修正后的fetch逻辑
}, [limit]);

注:此逻辑仅用于开发调试,生产环境严格模式不会重复执行钩子,无需保留。

3. 检查limit依赖的变化

确认limit值在初始加载时是否被意外修改两次,可在useEffect内部添加console.log(limit)查看其变化,若存在异常修改,需调整limit的更新逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 05:15:27