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

React中点击map渲染的图片时如何单独修改其src属性

解决方案

问题根源在于你之前用单个布尔值控制所有图标的状态,导致所有图标同步切换。要实现单个图标独立切换,需要跟踪具体选中的ID(单选)或选中ID集合(多选),让每个图标根据自身ID判断状态。

方案1:单选模式(仅允许选中一个图标)

1. 修改App组件,维护选中ID状态

import React, { useState } from 'react';
import { TempCheck } from './TempCheck';

function App() {
  // 存储当前选中的图标ID,初始为null(无选中)
  const [selectedId, setSelectedId] = useState(null);

  const handleSelection = (id) => {
    // 点击时切换:如果是当前选中的ID则取消,否则选中该ID
    setSelectedId(prev => prev === id ? null : id);
  };

  return (
    <div className="App">
      <TempCheck handleSelection={handleSelection} selectedId={selectedId} />
    </div>
  );
}

export default App;

2. 更新TempCheck组件,根据选中ID切换图片路径

import React from 'react';
import Icons from "./file.json";

export const TempCheck = ({handleSelection, selectedId}) => {
  return (
    <div>
      {Icons?.ids?.map(id => {
        const iconData = Icons[id];
        return (
          <div className="icon-container" key={iconData.id}>
            <img 
              src={selectedId === id ? iconData.selected : iconData.unselected} 
              alt={iconData.label} 
              onClick={() => handleSelection(id)} 
            />
            <p className="icon">{iconData.label}</p>
          </div>
        )
      })}
    </div>
  )
}

方案2:多选模式(允许选中多个图标)

1. 修改App组件,维护选中ID集合

import React, { useState } from 'react';
import { TempCheck } from './TempCheck';

function App() {
  // 存储所有选中的图标ID,初始为空数组
  const [selectedIds, setSelectedIds] = useState([]);

  const handleSelection = (id) => {
    setSelectedIds(prev => {
      if (prev.includes(id)) {
        // 已选中,从集合中移除该ID
        return prev.filter(item => item !== id);
      } else {
        // 未选中,添加该ID到集合中
        return [...prev, id];
      }
    });
  };

  return (
    <div className="App">
      <TempCheck handleSelection={handleSelection} selectedIds={selectedIds} />
    </div>
  );
}

export default App;

2. 更新TempCheck组件,判断当前ID是否在选中集合中

import React from 'react';
import Icons from "./file.json";

export const TempCheck = ({handleSelection, selectedIds}) => {
  return (
    <div>
      {Icons?.ids?.map(id => {
        const iconData = Icons[id];
        const isSelected = selectedIds.includes(id);
        return (
          <div className="icon-container" key={iconData.id}>
            <img 
              src={isSelected ? iconData.selected : iconData.unselected} 
              alt={iconData.label} 
              onClick={() => handleSelection(id)} 
            />
            <p className="icon">{iconData.label}</p>
          </div>
        )
      })}
    </div>
  )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:52:53