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)
| 归档时间: |
|
| 查看次数: |
3060 次 |
| 最近记录: |