react怎么控制audio - 网站

react怎么控制audio

分类:React入门教程_React框架基础教程 · 发布时间:2020-09-22 09:51 · 阅读:1356

基于react的audio组件

样式请自己定义哦~

需要其他功能请自行添加!

// 组件调用
<Audio src={src地址} id={srcID}/>

audio属性

src 歌曲的路径

preload 是否在页面加载后立即加载(设置autoplay后无效)

controls 显示audio自带的播放控件

loop 音频循环

autoplay 音频加载后自动播放

currentTime 音频当前播放时间

duration 音频总长度

ended 音频是否结束

muted 音频静音为true

volume 当前音频音量

readyState 音频当前的就绪状态

audio事件

abort 当音频/视频的加载已放弃时

canplay 当浏览器可以播放音频/视频时

canplaythrough 当浏览器可在不因缓冲而停顿的情况下进行播放时

durationchange 当音频/视频的时长已更改时

emptied 当目前的播放列表为空时

ended 当目前的播放列表已结束时

error 当在音频/视频加载期间发生错误时

loadeddata 当浏览器已加载音频/视频的当前帧时

loadedmetadata 当浏览器已加载音频/视频的元数据时

loadstart 当浏览器开始查找音频/视频时

pause 当音频/视频已暂停时

play 当音频/视频已开始或不再暂停时

playing 当音频/视频在已因缓冲而暂停或停止后已就绪时

progress 当浏览器正在下载音频/视频时

ratechange 当音频/视频的播放速度已更改时

seeked 当用户已移动/跳跃到音频/视频中的新位置时

seeking 当用户开始移动/跳跃到音频/视频中的新位置时

stalled 当浏览器尝试获取媒体数据,但数据不可用时

suspend 当浏览器刻意不获取媒体数据时

timeupdate 当目前的播放位置已更改时

volumechange 当音量已更改时

waiting 当视频由于需要缓冲下一帧而停止

组件结构

 <div className="audioBox">
  <audio 
    id={`audio${id}`}
    src={src}
    preload={true}
    onCanPlay={() => this.controlAudio('allTime')}
    onTimeUpdate={(e) => this.controlAudio('getCurrentTime')}
  >
    您的浏览器不支持 audio 标签。
  </audio>  
  <i 
    className={isPlay ? 'pause' : 'play'} 
    onClick={() => this.controlAudio(isPlay ? 'pause' : 'play')}
  />
  <span className="current">
    {this.millisecondToDate(currentTime)+'/'+this.millisecondToDate(allTime)}
  </span>
  <input 
    type="range" 
    className="time" 
    step="0.01" 
    max={allTime}     
    value={currentTime}  
    onChange={(value) => this.controlAudio('changeCurrentTime',value)} 
  />
  <i 
    className={isMuted ? 'mute' : 'nomute'} 
    onClick={() => this.controlAudio('muted')}
  />
  <input 
    type="range" 
    className="volume"
    onChange={(value) => this.controlAudio('changeVolume',value)} 
    value={isMuted ? 0 : volume} 
  />
</div>

组件javascript

  constructor(props) {
    super(props)
    this.state = {
      isPlay: false,
      isMuted: false,
      volume: 100,
      allTime: 0,
      currentTime: 0
    }
  }
  
  millisecondToDate(time) {
    const second = Math.floor(time % 60)
    let minite = Math.floor(time / 60)
    // let hour
    // if(minite > 60) {
    //   hour = minite / 60
    //   minite = minite % 60
    //   return `${Math.floor(hour)}:${Math.floor(minite)}:${Math.floor(second)}`
    // }
    return `${minite}:${second >= 10 ? second : `0${second}`}`
  }
  controlAudio(type,value) {
    const { id,src } = this.props
    const audio = document.getElementById(`audio${id}`)
    switch(type) {
      case 'allTime':
        this.setState({
          allTime: audio.duration
        })
        break
      case 'play':
        audio.play()
        this.setState({
          isPlay: true
        })
        break
      case 'pause':
        audio.pause()
        this.setState({
          isPlay: false
        })
        break
      case 'muted':
        this.setState({
          isMuted: !audio.muted
        })
        audio.muted = !audio.muted
        break
      case 'changeCurrentTime':
        this.setState({
          currentTime: value
        })
        audio.currentTime = value
        if(value == audio.duration) {
          this.setState({
            isPlay: false
          })
        }
        break
      case 'getCurrentTime':
        this.setState({
          currentTime: audio.currentTime
        })
        if(audio.currentTime == audio.duration) {
          this.setState({
            isPlay: false
          })
        }
        break
      case 'changeVolume':
        audio.volume = value / 100
        this.setState({
          volume: value,
          isMuted: !value
        })
        break  
    }
  }

更多相关技术文章,请访问HTML中文网

标签:
react

相关文章

react中怎么使用sass?

方法:1、使用npm工具安装sass-loader和node-sass依赖;2、配置webpack.config.js文件;3、在需要的组件中引入scss,然后添加scss代码即可。

react怎么判断checkbox是否被选中

react判断checkbox是否被选中的方法:可以通过【if ($(&quot;#checkbox-id&quot;).get(0).checked) {}】方法来进行判断。还可以通过原生js方法来进行判断,如【ele.checked】。

react子组件如何向父组件传值?

在react中,首先通过父组件给子组件传递一个函数,然后子组件通过参数传到父组件,通过props来传递函数的引用,并通过回调的方式实现;其实就是子组件调用父组件的方法,把值以形参的方式传出来。

react组件什么时候会重新渲染?

每当组件状态改变时,React就会调用render函数进行重新渲染。更改状态意味着当调用setState函数时,React触发更新;这不仅意味着将调用组件的render函数,而且还意味着重新渲染其所有后续子组件,无论其prop是否已更改。

react组件生命周期有几个阶段?

React组件生命周期有三个阶段:加载、更新和卸载。加载阶段表示一个组件实例被创建并被插入到DOM中;更新阶段表示由状态或属性的改变导致组件的重新渲染;卸载阶段表示组件从DOM中移除。

返回分类 返回首页