【问题标题】:audio play/pause toggle not working in react音频播放/暂停切换在反应中不起作用
【发布时间】:2021-06-07 21:48:35
【问题描述】:
function MusicCard() {
const [playing, setPlaying] = useState(false);

const url = "http://localhost:4000/musics/myMusic.mp3";
const audio = new Audio(url);

const play = () => {
    setPlaying(true);
    audio.play();
};

const pause = () => {
    setPlaying(false);
    audio.pause();
};

return (
    <div className="music-card">
        <div className="music-card_image-con">
            <button style={{
                backgroundImage: `url(${process.env.PUBLIC_URL}music-image.jpg)`
            }} onClick={playing ? pause : play}>{ playing ? <FaPause /> : <FaPlay /> }</button>
        </div>
        <div className="music-card_info-con">
            <div className="music-card_info-name">
                <h3>music name</h3>
                <p> - </p>
                <p>Singer</p>
            </div>
            <div className="music-card_info-seekbar">
                <input type="range" style={{
                    width: "100%"
                }} />
            </div>
        </div>
        <button className="music-card_actions-btn"><FaEllipsisV /></button>
    </div>

);
}

这个切换有什么问题?当我按下播放按钮时,它会播放音乐,但当我再次按下它时,它会启动另一个音乐会话,就像使用另一个新的 Audio() 方法而不是暂停它!

编辑:暂停不起作用,每次开始播放时都会开始新的音频会话

【问题讨论】:

    标签: reactjs audio audio-player


    【解决方案1】:

    setPlaying 调用会导致重新渲染并在每次组件重新渲染时初始化 Audio 的新实例,您必须调用 useRef 以在每次渲染之间保持 Audio 实例:

    import { useState, useRef } from "react";
    
    function MusicCard() {
      const [playing, setPlaying] = useState(false);
    
      const url = "http://localhost:4000/musics/myMusic.mp3";
    
      const audioRef = useRef(new Audio(url));
    
      const play = () => {
        setPlaying(true);
        audioRef.current.play();
      };
    
      const pause = () => {
        setPlaying(false);
        audioRef.current.pause();
      };
    
      return (
        <div className="music-card">
          <div className="music-card_image-con">
            <button
              style={{
                backgroundImage: `url(${process.env.PUBLIC_URL}music-image.jpg)`,
              }}
              onClick={playing ? pause : play}
            >
              {playing ? <FaPause /> : <FaPlay />}
            </button>
          </div>
          <div className="music-card_info-con">
            <div className="music-card_info-name">
              <h3>music name</h3>
              <p> - </p>
              <p>Singer</p>
            </div>
            <div className="music-card_info-seekbar">
              <input
                type="range"
                style={{
                  width: "100%",
                }}
              />
            </div>
          </div>
          <button className="music-card_actions-btn">
            <FaEllipsisV />
          </button>
        </div>
      );
    }
    
    export default MusicCard;
    
    

    【讨论】:

    • 谢谢。有用。我有另一个问题。有没有办法在完整文件加载之前从服务器播放音乐文件?我的意思是 YouTube 音乐之类的东西。我想在播放音乐时加载它。
    • 我不是音频播放方面的专家,但我怀疑您想要实现的已经是默认行为。如果不是这种情况,请随时提出另一个问题,以便其他人可以帮助回答。干杯!
    • 我打开了另一个,没有人回答。 stackoverflow.com/q/67882689/15694279
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多