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

React中useEffect外Map为空求助:赋值后无法读取数据

问题原因

你直接在组件顶层声明的catmap是普通变量,并非React的状态或引用类型。React组件每次重新渲染(比如categoryIds变化触发重渲染),都会从头执行组件函数,const catmap = new Map();会重新执行,创建一个全新的空Map——这个新Map和第一个useEffect里填充数据的那个Map完全是两个不同的引用,所以第二个useEffect里访问的是新的空Map,自然打印为空。

解决办法

用useRef来保存这个Map,因为useRef的.current属性在组件整个生命周期内都会保持同一个引用,不会随组件重渲染而重置:

import { useEffect, useRef, useState } from 'react';

// ...其他组件代码

const catmapRef = useRef(new Map()); // 用useRef保存Map实例

useEffect(() => {
  // 获取分类数据
  getCategories().then((res) => {
    setCategories(res.data);
    const catmap = catmapRef.current;
    catmap.clear(); // 先清空避免重复添加数据
    res.data.forEach((c) => {
      catmap.set(c._id, c.name);
    });
    console.log("mycate len", catmap);  // 正常显示映射后的数据
    console.log("mycate len", catmap.size);  // 显示正确的size值
  }); 
}, []);

useEffect(() => {
  let currentUrlParams = new URLSearchParams(window.location.search);
  const catmap = catmapRef.current;
  console.log("mycate len", catmap); 
  console.log("mycate len", catmap.size); // 现在能拿到正确的Map和size
}, [categoryIds]);

如果你的业务场景需要Map变化时触发组件重渲染,也可以用useState存储Map,但仅用于数据映射、不需要触发重渲染的场景下,useRef的性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:22:46