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

如何解决Material UI图标存入localStorage后读取返回null的问题

问题原因

localStorage 仅支持存储字符串格式的数据,你直接将 React 组件实例存入时,JSON.stringify 无法对组件/函数类数据进行序列化,会自动将这类值转为 null 存储,所以读取的时候拿到的就是 null。

解决方案

核心思路是存储图标的唯一标识符,渲染时再映射为真实组件,具体操作步骤如下:

  • 第一步:提前导入所有你用到的 Material UI 图标,建立图标名到组件的映射表
// 统一导入所有用到的图标
import ShoppingCartIcon from '@mui/icons-material/ShoppingCart';
import HomeIcon from '@mui/icons-material/Home';
import SettingsIcon from '@mui/icons-material/Settings';
// 其他用到的图标继续导入

// 建立映射表,key是图标名的字符串,value是对应的图标组件
const ICON_MAP = {
  ShoppingCartIcon: ShoppingCartIcon,
  HomeIcon: HomeIcon,
  SettingsIcon: SettingsIcon
  // 其他图标继续补充映射
}
  • 第二步:修改存储逻辑,存入图标名的字符串而非组件实例
    你在给用户提供图标选择选项时,每个选项对应的值直接用图标名的字符串(比如用户选购物车图标,对应值就是'ShoppingCartIcon'),修改handleAddIcon逻辑:
handleAddIcon = (icon) => {
  // 这里取图标名字符串,比如icon.iconName就是'ShoppingCartIcon'
  let iconName = icon.iconName;
  let activeTab = this.state.activeTab;
  let tabs = [...this.state.tabs];
  tabs[activeTab].icon = iconName;
  this.setState({
    tabs,
    selectIcon: false,
    newCategorySelected: false
  } , () => localStorage.setItem('tabs', JSON.stringify(this.state.tabs)))
}
  • 第三步:读取数据后渲染时,从映射表中取对应组件渲染
// 从localStorage读取逻辑不用改,读出来的tabs里icon字段是字符串
const tabs = JSON.parse(localStorage.getItem('tabs'))?.length ? JSON.parse(localStorage.getItem('tabs')) : [];

// 渲染标签时的逻辑示例
tabs.forEach(tab => {
  // 从映射表拿到对应的组件,可加兜底图标避免映射不存在报错
  const Icon = ICON_MAP[tab.icon] || DefaultIcon;
  // 渲染时直接使用组件
  return <div><Icon /> {tab.label}</div>
})
注意事项

如果后续新增了用到的图标,记得同步更新ICON_MAP的映射关系即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:51:03