【问题标题】:Adding a onMouseEnter and onMouseLeave events to music player将 onMouseEnter 和 onMouseLeave 事件添加到音乐播放器
【发布时间】:2019-02-21 03:35:00
【问题描述】:

我正在编写一个音乐播放器应用程序,但我遇到了障碍。我正在尝试一种方法:

•当我将鼠标悬停在一首歌曲上时,它会显示一个“播放”按钮来代替歌曲编号。

•当前播放的歌曲显示一个“暂停”按钮代替歌曲编号。

•暂停的歌曲会显示一个“播放”按钮来代替歌曲编号。

我想在这个方法中使用 onMouseEnter 和 onMouseLeave 事件,但我不知道从哪里开始

这是我的相册组件

import React, { Component } from 'react';
import albumData from './../data/albums';

class Album extends Component {
    constructor(props) {
          super(props);

        const album = albumData.find( album => {
          return album.slug === this.props.match.params.slug
        });

        this.state = {
          album: album,
            currentSong: album.songs[0],
            isPlaying: false
        };

        this.audioElement = document.createElement('audio');
        this.audioElement.src = album.songs[0].audioSrc;
        }

        play() {
              this.audioElement.play();
              this.setState({ isPlaying: true });
            }

        pause() {
              this.audioElement.pause();
              this.setState({ isPlaying: false });
            }   

        setSong(song) {
              this.audioElement.src = song.audioSrc;
              this.setState({ currentSong: song });
            }

        handleSongClick(song) {
              const isSameSong = this.state.currentSong === song;
              if (this.state.isPlaying && isSameSong) {
                   this.pause();
                 } else {
                   if (!isSameSong) { this.setSong(song); }     
                   this.play();
                 }  
            }



    render() {
      return (
         <section className="album">
            <section id="album-info">
                 <img id="album-cover-art" src={this.state.album.albumCover} alt={this.state.album.title}/>
                 <div className="album-details">
                 <h1 id="album-title">{this.state.album.title}</h1>
                 <h2 className="artist">{this.state.album.artist}</h2>
                 <div id="release-info">{this.state.album.releaseInfo}</div>
              </div>
            </section>
            <table id="song-list">
                <colgroup>
                    <col id="song-number-column" />
                    <col id="song-title-column" />
                    <col id="song-duration-column" />
                </colgroup>  
                <tbody>
                {this.state.album.songs.map( (song, index) =>
                    <tr className="song" key={index} onClick={() => this.handleSongClick(song)} >
                          <td className="song-actions">
                             <button>
                                <span className="song-number">{index+1}</span>
                                <span className="ion-play"></span>
                                <span className="ion-pause"></span>
                            </button>
                          </td>
                          <td className="song-title">{song.title}</td>
                          <td className="song-duration">{song.duration}</td>
                    </tr>
                  )}
                </tbody>
            </table>
         </section>
      );
    }
 }


export default Album;

【问题讨论】:

    标签: java html reactjs jsx


    【解决方案1】:

    在我在这里对您的代码进行的测试中,我添加了 showPlayOnHover 属性以将状态设为 false,以处理悬停时出现的按钮。

    增加了按钮是否渲染的方法:

    handlePlayOnHover = (song) => {
        this.setState({
            showPlayOnHover: !this.state.showPlayOnHover,
            isPlaying: !this.state.isPlaying
        })
        this.handleSongClick(song)
    }
    

    歌曲渲染结构更新为:

    <tr 
        className="song" key={index} 
        onClick={() => this.handleSongClick(song)}
        onMouseOver={() => this.handleOnHover(song)}
        onMouseOut={() => this.handleOnHover(song)}
    >
          <td className="song-actions">
             <button>
                <span className="song-number">
                    {!this.state.showPlayOnHover ? index+1 : <span className="ion-play"></span>}
                </span>
                <span className="ion-play"></span>
                <span className="ion-pause"></span>
            </button>
          </td>
          <td className="song-title">{song.title}</td>
          <td className="song-duration">{song.duration}</td>
    </tr>
    

    handleOnHover 方法负责有条件地显示悬停时的播放按钮和悬停时的歌曲编号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-03
      • 2017-09-13
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多