我正在尝试使用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')
);
答案 0 :(得分:9)
只有像缓存一样更改src
的图片,才能更改音频文件。您需要再次load
和play
。
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)
如果您可以放弃播放状态和时间,则可以根据源在音频标签上设置不同的键属性。