(React JS)音频src正在setState上更新,但音频播放不会改变

the*_*oys 6 javascript audio reactjs

我正在尝试用React构建一个迷你的2轨音频播放器。音频由html音频元素集中控制,而html音频元素在子组件中具有曲目列表。(尚未样式化的)播放器可以在此处查看

我可以在React开发工具中告诉您,单击单个音轨选择按钮确实会更新音频元素的src(由于这里的成员的帮助),但是播放的音频不会改变。我已经在下面发布了应用程序代码。

是否可以通过以这种方式更新状态来更改播放音频?帮助将不胜感激。

var TRACKLIST = [
    {
        id: 1,
        name: "song a",
        source: "./audio/test.m4a"
    },
    {
        id: 2,
        name: "song b",
        source: "https://s3-us-west-2.amazonaws.com/s.cdpn.io/557257/wwy.mp3"
    }
]

function Track(props) {
    return (
        <div className="track">
            <div className="meta">
                <div className="name">
                    <h2>{props.name}</h2>
                </div>
                <audio>
                    <source src={props.source} />
                </audio>
            </div>
            <button className="select" onClick={function() {props.onChange(props.source);}} >
            </button>
        </div>
    )
}

var Application = React.createClass({

    getInitialState: function() {
        return {
            isPlaying: "./audio/test.m4a"
        };
    },

    onTrackChange: function(source) {
        this.setState({ isPlaying: source })
    },

    render: function() {
        return (
            <div className="player">
                <div className="tracklist">
                    {this.props.tracklist.map(function(track){
                        return <Track
                                    key={track.id}
                                    name={track.name}
                                    source={track.source}
                                    onChange={this.onTrackChange} />
                    }.bind(this))}
                </div>
                <div className="controls">
                    <audio controls>
                        <source src={this.state.isPlaying} />
                    </audio>
                </div>
            </div>
        )
    }
});

// Render the UI
ReactDOM.render(
    <Application tracklist={TRACKLIST} />,
    document.getElementById('Player')
);
Run Code Online (Sandbox Code Playgroud)

mri*_*ech 12

音频文件不能仅通过更改src图像就可以更改,因为存在缓存。您将需要load它,play然后再次。

onTrackChange: function(source) {
       this.setState({ isPlaying: source },function(){
            this.refs.audio.pause();
            this.refs.audio.load();
            this.refs.audio.play();
       })
}
Run Code Online (Sandbox Code Playgroud)

状态更改后,回调将处理暂停,加载和播放。请记住ref在音频标签上添加一个。

<audio controls ref="audio">
   <source src={this.state.isPlaying} />
</audio>
Run Code Online (Sandbox Code Playgroud)


小智 6

使用钩子

导入useRef并创建它的一个实例。

import React, { useRef } from 'react';
const audioRef = useRef()
Run Code Online (Sandbox Code Playgroud)

更新歌曲的功能。

const updateSong = (source) => {
    setSource(source);
    if(audioRef.current){
        audioRef.current.pause();
        audioRef.current.load();
        audioRef.current.play();
    }
}
Run Code Online (Sandbox Code Playgroud)

不要忘记将ref添加到音频标签。

<audio controls ref={audioRef}>
    <source src={source} type='audio/mpeg' />
</audio>
Run Code Online (Sandbox Code Playgroud)