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

如何在IF语句中引用React图片元素实现歌曲切换?

问题描述

开发音乐播放器组件时,尝试为歌曲封面图片添加点击事件,期望点击不同图片切换对应播放歌曲。目前单首歌曲切换逻辑正常,但不清楚如何在if语句中定位引用对应的图片标签,导致批量切换功能未实现。简化后的代码如下:

function getSong() {
  let songFile = songs.map(song => song.songFile)
  
  // 不知道这里该填什么来引用对应的图片
  if ('Reference to Rap img') {
      setSongClicked(songFile[0])
  } else if ('Reference to Rock img') {
    setSongClicked(songFile[1])
  } else if ('Reference to Trending img') {
    setSongClicked(songFile[2])
  } else if ('Reference to Jazz img') {
    setSongClicked(songFile[3])
  }
}

return (
  <div className="song-main-container">
    <div className="song-container">
      <img src={Rap} onClick={getSong} />
      <img src={Rock} onClick={getSong}/>
    </div>
    <div className="song-container">
      <img src={Trending} onClick={getSong} />
      <img src={Jazz} onClick={getSong}/>
    </div>
  </div>
)
解决方案

不推荐通过DOM元素引用做if判断(路径易变、代码冗余),更简洁可靠的方式是直接给点击事件传递对应歌曲的索引或数据:

方法1:传递歌曲索引(最推荐)

修改getSong函数接收索引参数,直接通过索引定位歌曲文件,同时在每个img的点击事件中传入对应索引:

function getSong(songIndex) {
  let songFile = songs.map(song => song.songFile)
  setSongClicked(songFile[songIndex])
}

return (
  <div className="song-main-container">
    <div className="song-container">
      {/* 点击时传入对应歌曲的索引 */}
      <img src={Rap} onClick={() => getSong(0)} />
      <img src={Rock} onClick={() => getSong(1)}/>
    </div>
    <div className="song-container">
      <img src={Trending} onClick={() => getSong(2)} />
      <img src={Jazz} onClick={() => getSong(3)}/>
    </div>
  </div>
)

方法2:通过事件对象获取DOM元素(不推荐)

如果一定要用if判断DOM元素,可以利用事件对象e获取点击的图片元素,通过对比src属性来区分:

function getSong(e) {
  let songFile = songs.map(song => song.songFile)
  const imgSrc = e.target.src
  
  if (imgSrc.includes(Rap)) {
    setSongClicked(songFile[0])
  } else if (imgSrc.includes(Rock)) {
    setSongClicked(songFile[1])
  } else if (imgSrc.includes(Trending)) {
    setSongClicked(songFile[2])
  } else if (imgSrc.includes(Jazz)) {
    setSongClicked(songFile[3])
  }
}

return (
  <div className="song-main-container">
    <div className="song-container">
      <img src={Rap} onClick={getSong} />
      <img src={Rock} onClick={getSong}/>
    </div>
    <div className="song-container">
      <img src={Trending} onClick={getSong} />
      <img src={Jazz} onClick={getSong}/>
    </div>
  </div>
)

方法3:使用自定义数据属性

给每个img添加data-index属性,在点击事件中读取该属性值作为索引:

function getSong(e) {
  let songFile = songs.map(song => song.songFile)
  const songIndex = parseInt(e.target.dataset.index)
  setSongClicked(songFile[songIndex])
}

return (
  <div className="song-main-container">
    <div className="song-container">
      <img src={Rap} data-index="0" onClick={getSong} />
      <img src={Rock} data-index="1" onClick={getSong}/>
    </div>
    <div className="song-container">
      <img src={Trending} data-index="2" onClick={getSong} />
      <img src={Jazz} data-index="3" onClick={getSong}/>
    </div>
  </div>
)

内容的提问来源于stack exchange,提问作者Gavin-walsh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:30:50