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

useEffect钩子问题:基于Fetch API的数组无法填充分类数组

问题解决:基于获取的data生成categories数组

问题原因

React的状态更新是异步的,调用setData(json)后,data不会立刻更新为新值。你当前的代码里,在setData之后直接用data.map(),拿到的还是组件初始化时的data初始值(大概率是空数组),所以生成的allCategories只有"all",没有从接口获取到的分类数据。

解决方案一:直接用接口返回的json数据生成分类

既然已经拿到了接口返回的完整json数据,直接用它来处理分类就行,不用等data状态更新:

function RecipesList() {
  const [data, setData] = useState([]);
  const [categories, setCategories] = useState([]);

  useEffect(() => {
    const getRecipesList = async () => {
      const response = await fetch("http://localhost:4000/recipe/allrecipes", {
        method: "GET",
      });
      const json = await response.json();

      if (response.ok) {
        setData(json);
        // 直接使用接口返回的json生成分类
        const allCategories = [
          "all",
          ...new Set(json.map((item) => item.category)),
        ];
        setCategories(allCategories);
      }
    };

    getRecipesList();
  }, []);
}

解决方案二:监听data状态变化再更新分类

把生成分类的逻辑单独放到一个依赖data的useEffect里,当data从接口获取到新值后,自动执行分类生成操作:

function RecipesList() {
  const [data, setData] = useState([]);
  const [categories, setCategories] = useState([]);

  useEffect(() => {
    const getRecipesList = async () => {
      const response = await fetch("http://localhost:4000/recipe/allrecipes", {
        method: "GET",
      });
      const json = await response.json();

      if (response.ok) {
        setData(json);
      }
    };

    getRecipesList();
  }, []);

  // 当data更新时,重新生成分类数组
  useEffect(() => {
    if (data.length === 0) return;
    const allCategories = [
      "all",
      ...new Set(data.map((item) => item.category)),
    ];
    setCategories(allCategories);
  }, [data]);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:32:45