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

React组件返回多个重复rect元素时如何仅修改被点击元素的样式

问题原因

你当前代码中所有<rect>的className都绑定了同一个状态变量,状态更新后所有元素都会同步应用该样式,所以点击任意矩形都会导致全部变色。

解决方案

将状态改为存储被点击矩形的id,渲染时逐个判断当前元素id是否与选中id匹配,仅给匹配的元素应用高亮样式即可。

修改后完整代码

import { useState } from "react";
import styles from "./Canvas.module.css";

// 静态数据建议用const声明
const data = [
  {
    id: "1",
    x: "50",
    y: "20",
  },
  {
    id: "2",
    x: "90",
    y: "20",
  },
  {
    id: "3",
    x: "130",
    y: "20",
  },
];

const Canvas = () => {
  // 状态存储当前选中的矩形id,初始为null(无选中)
  const [selectedRectId, setSelectedRectId] = useState(null);

  // 点击时更新选中的id
  const setColorHandler = (id) => {
    setSelectedRectId(id);
    // 如果需要点击第二次取消选中,替换为下面的代码
    // setSelectedRectId(prevId => prevId === id ? null : id)
  };

  const rectList = data.map((element) => {
    return (
      <rect
        // 仅选中的矩形应用红色样式
        className={element.id === selectedRectId ? styles.rect : ""}
        key={element.id}
        width="30"
        height="4"
        x={element.x}
        y={element.y}
        // 绑定点击事件,传入当前元素的id
        onClick={() => setColorHandler(element.id)}
      />
    );
  });

  return (
    <svg width="800" height="600" id="svg">
      {rectList}
    </svg>
  );
};

export default Canvas;

效果展示

运行前默认效果:
运行前效果
点击单个矩形后的预期效果:
点击后效果
修改后点击任意矩形,仅被点击的元素会应用styles.rect定义的红色样式,其余元素保持默认样式。

内容的提问来源于stack exchange,提问作者Sohaib Al Abbadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:06:04