You need to enable JavaScript to run this app. 如何修改代码避免多图标共用逻辑时localStorage值被覆盖
优惠活动
大模型
产品
解决方案
定价
更多

如何修改代码避免多图标共用逻辑时localStorage值被覆盖

解决方案

核心问题是所有图标共用localStorage的color固定键名,导致存储值互相覆盖,只需要给每个图标分配唯一的存储键即可解决,推荐把图标逻辑封装为独立复用组件:

1. 封装独立可复用图标组件

import { useState, useEffect } from 'react';
import Icon from '你的Icon组件引入路径';

// 组件接收唯一标识iconId作为入参
const ColorToggleIcon = ({ iconId }) => {
  // 动态生成当前图标专属的localStorage存储键
  const STORAGE_KEY = `icon_color_${iconId}`;
  const [color, setColor] = useState("");

  // 组件挂载时仅读取当前图标对应的存储值
  useEffect(() => {
    const savedColor = window.localStorage.getItem(STORAGE_KEY);
    if (savedColor) {
      setColor(savedColor);
    } else {
      localStorage.setItem(STORAGE_KEY, "");
    }
  }, [STORAGE_KEY]);

  // 点击逻辑仅操作当前图标对应的存储项
  const handleClick = () => {
    const currentColor = window.localStorage.getItem(STORAGE_KEY);
    if (currentColor === "") {
      localStorage.setItem(STORAGE_KEY, "red");
      setColor("red");
    } else {
      localStorage.setItem(STORAGE_KEY, "");
      setColor("");
    }
  };

  return (
    <div onClick={handleClick} className="icon__content--container">
      <Icon style={{ color: color }} />
    </div>
  );
};

export default ColorToggleIcon;

2. 父组件调用时传入唯一ID

使用时给每个图标传入不同的iconId即可实现存储完全隔离,不会互相干扰:

// 父组件内使用示例
<ColorToggleIcon iconId="home" />
<ColorToggleIcon iconId="user_center" />
<ColorToggleIcon iconId="settings" />

可选优化

如果你的图标本身已经携带唯一属性(比如图标名、业务ID),可以直接复用该属性作为iconId,不需要额外传值。
内容的提问来源于stack exchange,提问作者Shahir Riaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 05:12:00