import React, { useState } from 'react'; import AudioPlayer from 'react-h5-audio-player'; import 'react-h5-audio-player/lib/styles.css'; interface Song { id: number; title: string; artist: string; url: string; cover: string; duration: string; } const MusicPlayer: React.FC = () => { const playlist: Song[] = [ { id: 1, title: '放生', artist: '陈旧', url: 'http://117.72.120.45:9000/testbucket/1232e131.mp3', cover: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', duration: '04:24' }, { id: 2, title: '夜曲', artist: '周杰伦', url: 'http://music.163.com/song/media/outer/url?id=123456.mp3', cover: 'https://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg', duration: '03:45' }, { id: 3, title: '青花瓷', artist: '周杰伦', url: 'http://music.163.com/song/media/outer/url?id=789012.mp3', cover: 'https://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg', duration: '03:58' } ]; const [currentTrackIndex, setCurrentTrackIndex] = useState(0); const [isPlaying, setIsPlaying] = useState(false); const [audioError, setAudioError] = useState(null); const currentTrack = playlist[currentTrackIndex]; // 上一首逻辑 const handlePrevious = () => { setCurrentTrackIndex(prev => (prev === 0 ? playlist.length - 1 : prev - 1)); setAudioError(null); if (isPlaying) setIsPlaying(true); // 切换后继续播放 }; // 下一首逻辑 const handleNext = () => { setCurrentTrackIndex(prev => (prev === playlist.length - 1 ? 0 : prev + 1)); setAudioError(null); if (isPlaying) setIsPlaying(true); // 切换后继续播放 }; // 播放列表项点击 const handleTrackSelect = (index: number) => { setCurrentTrackIndex(index); setIsPlaying(true); setAudioError(null); }; return (
{/* 错误提示 */} {audioError && (
{audioError}
)} {/* 播放器:适配 3.10.1 版本的核心 Props */} setIsPlaying(true)} onPause={() => setIsPlaying(false)} onClickPrevious={handlePrevious} // 绑定上一首(3.10.1 支持) onClickNext={handleNext} // 绑定下一首(3.10.1 支持) onEnded={handleNext} // 播放结束自动下一首 onError={(e) => setAudioError('音频加载失败,请检查网络')} showSkipControls={true} // 显示上一首/下一首按钮 header={ // 手动渲染封面图和歌曲信息(替代 3.10.1 不支持的 cover 属性)
{currentTrack.title}

{currentTrack.title}

{currentTrack.artist}

} autoPlay={false} style={{ // 自定义播放器样式(适配深色/浅色主题) backgroundColor: '#f5f5f5', padding: '10px', borderRadius: '8px' }} /> {/* 播放列表 */}

播放列表

    {playlist.map((song, index) => (
  • handleTrackSelect(index)} style={{ padding: '12px', backgroundColor: index === currentTrackIndex ? '#e6f7ff' : '#fff', borderBottom: index !== playlist.length - 1 ? '1px solid #eee' : 'none', cursor: 'pointer', display: 'flex', alignItems: 'center' }} > {/* 播放状态指示器 */} {index === currentTrackIndex && isPlaying && ( )} {/* 列表项封面图 */} {song.title} {/* 歌曲信息 */}
    {song.title}
    {song.artist} · {song.duration}
  • ))}
); }; export default MusicPlayer;