【问题标题】:Need help playing songs in my music player component需要帮助在我的音乐播放器组件中播放歌曲
【发布时间】:2022-09-24 21:13:28
【问题描述】:

我为我正在处理的项目创建了一个音乐播放器组件,但我似乎无法让它播放我也传递给它的一系列歌曲。

当我刚刚将同一组件中的 mp3 文件传递​​给它时,它工作正常,但现在它不起作用,因为我将它传递给一个对象。我想当我收到道具时我可能会错误地解构它。

任何帮助表示赞赏!

import React from \'react\'

//Components
import MusicPlayer from \'../components/MusicPlayer\';

//Song Images 
import Drake from \'../images/Drake.jpg\'
import Adelle from \'../images/adelle.png\'
import Elvis from \'../images/Elvis_hounddog.jpg\'

//Song files
import DrakeOneDance from \'../music/Drake_One_Dance.mp3\'
import AdelleHello from \'../music/Adele_Hello.mp3\'
import ElvisHoundDog from \'../music/Elvis.mp3\'

//Song array 

const songs = [
  
  {
    artist: \'Drake\',
    songName: \'One Dance\',
    poster: Drake,
    songFile: DrakeOneDance
  },
  {
    artist: \'Adelle\',
    songName: \'Hello\',
    poster: Adelle,
    songFile: AdelleHello
  },
  {
    artist: \'Elvis\',
    songName: \'Hound Dog\',
    poster: Elvis,
    songFile: ElvisHoundDog
  },

]


function Music() {

    return (

      <div className=\'music-container\'>
          <MusicPlayer songs={songs}/>
      </div>
     
    );
  }

  export default Music

import React, { useState, useEffect, useRef } from \'react\'

// MUI ICONS
import { Slider } from \'@mui/material\';
import SkipPreviousIcon from \'@mui/icons-material/SkipPrevious\';
import SkipNextIcon from \'@mui/icons-material/SkipNext\';
import PlayArrowIcon from \'@mui/icons-material/PlayArrow\';
import PauseIcon from \'@mui/icons-material/Pause\';
import VolumeDownIcon from \'@mui/icons-material/VolumeDown\';
import VolumeUpIcon from \'@mui/icons-material/VolumeUp\';
import VolumeOffIcon from \'@mui/icons-material/VolumeOff\';
import VolumeMuteIcon from \'@mui/icons-material/VolumeMute\';
import IconButton from \'@mui/material/IconButton\'

// This is what I was initially passing it

//Music 
// import Elvis from \'../music/Elvis.mp3\'
// import Fade from \'../music/Fade.mp3\' 
// import Drake from \'../music/Drake_One_Dance.mp3\'


// const playList = [Drake, Elvis, Fade]



function MusicPlayer({songs}) {

    //Song Files
    const songFiles = songs.songFile;

    
    //Hooks
    const audioPlayer = useRef()

    //State
    const [index, setIndex] = useState(0);
    const [currentSong] = useState(songFiles[index]);
    const [isPlaying, setisPlaying] = useState(false);
    const [volume, setVolume] = useState(30);
    const [mute, setMute] = useState(false);

    useEffect(() => {
        if(audioPlayer) {
            audioPlayer.current.volume = volume / 100;
        }
    }, [volume]);


    function togglePlay() {
        if(!isPlaying) {
            audioPlayer.current.play()
        } else {
            audioPlayer.current.pause()
        }
        // setisPlaying(prev => !prev)
        setisPlaying(isPlaying => !isPlaying)
    }

    function toggleSkipForward() {
        if(index >= songFiles.length - 1) {
            setIndex(0);
            audioPlayer.current.src = songFiles[0];
            audioPlayer.current.play();
        } else {
            setIndex(prev => prev + 1);
            audioPlayer.current.src = songFiles[index + 1];
            audioPlayer.current.play();
        }
    }


    function toggleSkipBackward() {
        if(index > 0) {
            setIndex(prev => prev -1);
            audioPlayer.current.src = songFiles[index -1];
            audioPlayer.current.play();
        } 
    }
    
    

    function VolumeBtns() {
        return mute
            ? <VolumeOffIcon sx={{color: \'lime\', \'&:hover\': {color: \'white\'}}} onClick={() => setMute(!mute)} />
            : volume <= 20 ? <VolumeMuteIcon sx={{color: \'lime\', \'&:hover\': {color: \'white\'}}} onClick={() => setMute(!mute)} />
            : volume <= 75 ? <VolumeDownIcon sx={{color: \'lime\', \'&:hover\': {color: \'white\'}}} onClick={() => setMute(!mute)} />
            : <VolumeUpIcon sx={{color: \'lime\', \'&:hover\': {color: \'white\'}}} onClick={() => setMute(!mute)} />
            }



  return (


    <div className=\'music-player-container\'>

    <audio src={currentSong} ref={audioPlayer} muted={mute} />    

        <div className=\"controls\">

            <div className=\"volume\">

                <IconButton>
                    <VolumeBtns />
                </IconButton>

                 <Slider min={0} max={100} value={volume} onChange={(e,v) => setVolume(v)}
                defaultValue={50}
                    sx={{
                    width: 100,
                    color: \'success.main\',
                    margin: \'20px\',
                    }} /> 
            </div>

            <div className=\"control-panel\">

                    <IconButton onClick={toggleSkipBackward}>
                        <SkipPreviousIcon
                        sx={{
                            margin: \'10px\',
                            cursor: \'pointer\',
                            color: \'silver\', \'&:hover\': {color: \'blue\'}
                        }} />
                    </IconButton>

                    {/* Play/Pause */}
                
                {!isPlaying
                  ?  <IconButton onClick={togglePlay}>
                        <PlayArrowIcon sx={{ margin: \'10px\', cursor: \'pointer\', color: \'silver\', \'&:hover\': {color: \'blue\'} }} />
                    </IconButton>
                    
                   : <IconButton onClick={togglePlay}>
                        <PauseIcon sx={{ margin: \'10px\', cursor: \'pointer\', color: \'silver\', \'&:hover\': {color: \'blue\'} }} />
                    </IconButton>
                }
                    
                    {/* Play/Pause */}


                    <IconButton onClick={toggleSkipForward}>
                        <SkipNextIcon
                        sx={{
                            margin: \'10px\',
                            cursor: \'pointer\',
                            color: \'silver\', \'&:hover\': {color: \'blue\'}
                        }} />
                    </IconButton>

            </div>
        </div>
                         
            
    </div>


  )
}

export default MusicPlayer

    标签: reactjs


    【解决方案1】:

    我很确定 songs 数组没有 songFile 属性

    const songFiles = songs.map(song => song.songFile)
    

    【讨论】:

    • 那行得通!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2012-04-16
    • 2017-02-05
    相关资源
    最近更新 更多