切换单击映射数据 React JS

Toggle click on a mapped data React JS

这是我的主要组件,我在其中根据从 API 收到的数据渲染组件:

  <div className="PlayersContainer">
          {players.map((player) => {
            return (
              <PlayerPhoto
                key={player._id}
                {...player}
                selected={selected}
                something={(e) => {
                  setSelected(!selected);
                 }}
              />
            );
          })}
        </div>

这是我的组件内部: 导出默认函数 PlayerPhoto({ name, img, something, selected }) {

  return (
    <article
      className={selected ? styles.Fade : styles.PlayerBox}
      onClick={something}
    >
      <img src={img} alt={name} className={styles.PlayerPhoto} />
      <p className={styles.PlayerName}>{name}</p>
    </article>
  );
}

我想做的是,当用户点击播放器时,它应该淡入淡出 class 并变成淡入淡出,当用户再次点击时,它应该 returns 到它的正常 class.

问题是当用户点击一个玩家时,所有玩家都会淡入淡出 class 并被选中。我如何获得他们的 ID 并将淡入淡出 class 添加到该特定玩家 ID?

你为什么不把这个逻辑移到 PlayerPhoto

export default function PlayerPhoto({ name, img }) {
  const [selected, setSelected] = React.useState(false);
  return (
    <article
      className={selected ? styles.Fade : styles.PlayerBox}
      onClick={()=>setSelected((prevValue)=>!prevValue}
    >
      <img src={img} alt={name} className={styles.PlayerPhoto} />
      <p className={styles.PlayerName}>{name}</p>
    </article>
  );
}

创建一个状态来维护选定的 id,然后比较 selectedIdselected 道具布尔值的玩家 id。如果 id 匹配,它将更改 className。

const [selectedId, setSelectedId] = useState(null);

<div className="PlayersContainer">
  {players.map((player) => {
    return (
      <PlayerPhoto
        key={player._id}
        {...player}
        selected={player._id === selectedId}
        something={() => setSelected(player._id)}
      />
    );
  })}
</div>;