简体   繁体   中英

How to play one song from array at a time react js

I am building a simple music player but where I fail is at trying to execute one item from the array at a time. I am using React H5 Audio Player package to play the music. I am currently mapping through all the songs but I don't know how to properly play one at a time. I appreciate any help. I've been stuck on this for a few days.


import { SongContext } from '../../SongContext';

import AudioPlayer from 'react-h5-audio-player';
import 'react-h5-audio-player/lib/styles.css';

import './Player.css';

const Player = () => {
    const { songs } = useContext(SongContext);

    return (
        <>
            {songs.length > 0 &&
                songs.map((song) => (
                    <div className="player" key={song.id}>
                        <AudioPlayer
                            // autoPlay
                            // src={song.preview}
                            showJumpControls={false}
                            customVolumeControls={[]}
                            customAdditionalControls={[]}
                            onPlay={() => console.log('playing')}
                        />
                    </div>
                ))}
        </>
    );
};
export default Player;

Don't map all the songs at once, take a song by index ( currentSong ), and when it's done, use the onEnded event to increment the index, so the next one would play.

Example ( codepen ):

const Player = () => {
  const { songs } = useContext(SongContext);
  const [currentSong, setCurrentSong] = useState(0);

  const song = songs[currentSong];
  
  if(!song) return null; // don't render the player when no song is available

  return (
    <div className="player">
      <AudioPlayer
        autoPlay
        src={song.preview}
        showJumpControls={false}
        customVolumeControls={[]}
        customAdditionalControls={[]}
        onPlay={() => console.log('playing')}
        onEnded={() => setCurrentSong(i => i + 1)}
      />
    </div>
  );
};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM