(React js)音频src正在setState上更新,但音频播放没有改变

时间:2017-04-23 22:28:55

标签: javascript reactjs audio

我正在尝试使用React构建一个迷你双轨音频播放器。音频由html音频元素集中控制,音频元素在子组件内部具有音轨列表。 ({3}}可以看到(尚未定型)的玩家。

我可以在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')
);

3 个答案:

答案 0 :(得分:9)

只有像缓存一样更改src的图片,才能更改音频文件。您需要再次loadplay

onTrackChange: function(source) {
       this.setState({ isPlaying: source },function(){
            this.refs.audio.pause();
            this.refs.audio.load();
            this.refs.audio.play();
       })
}

回调处理状态更改后的暂停,加载和播放。请务必在音频代码中添加ref

<audio controls ref="audio">
   <source src={this.state.isPlaying} />
</audio>

答案 1 :(得分:0)

使用挂钩

导入 useRef 并创建一个实例。

import React, { useRef } from 'react';
const audioRef = useRef()

更新歌曲的功能。

const updateSong = (source) => {
    setSource(source);
    if(audioRef.current){
        audioRef.current.pause();
        audioRef.current.load();
        audioRef.current.play();
    }
}

别忘了在音频标签中添加 ref

<audio controls ref={audioRef}>
    <source src={source} type='audio/mpeg' />
</audio>

答案 2 :(得分:0)

如果您可以放弃播放状态和时间,则可以根据源在音频标签上设置不同的键属性。