vue3和vue2中分别使用audio标签自定义播放音频文件的方法

之前一直使用vue2,在vue2中操作aduio标签非常容易,也很熟练,现在项目换成了vue3,vue2那套搬过来也不好使了,从网上查询,基本都是挂着羊头卖狗肉,标着vue3,打开是vue2,或者发的是不全的部分代码,让你无从下手,自己整了一套,不一定对,但是能使用了。下面分别将vue两个版本使用audio标签自定义播放暂停的方法整理如下:

vue2

<template>
    <audio ref="audio" :src="music_path"></audio>
</template>
<script>
    data() {
		return {
            // 音频文件路径
			music_path: require('../../assets/audio/idCard.mp3'),
            // 是否播放音频
			is_play: false,
	     }
	},
    mounted() {
	    this.aclick(require('../../assets/audio/idCard.mp3'))
	},
    methods: {
		// 播放音频
		aclick(src) {
			this.$refs.audio.src = src;
			if (this.is_play) {
				this.$refs['audio'].pause();
				this.is_play = false
			} else {
				this.$refs['audio'].play();
				this.is_play = true
			}
		},
	}
</script>

vue3

<template>
    <audio id="audio" ref="audio" class="aud" v-if="data.musicSrc">
		<source :src="data.musicSrc" />
	</audio>
    <!-- 此处看自己的业务,我是自己写的按钮控制播放暂停,dom是通过v-for渲染出来的,        
     item.filePath是当前操作元素的音频路径 -->
    <div class="btn-box">
		<img class="btn-img" @click="handlePlayMusic(item.filePath)"
			v-if="            
            (data.musicSrc==item.filePath&&!data.isPlay)||data.musicSrc!==item.filePath"
		    src="../../../assets/image/template/play.png" alt="">
		<img class="btn-img" @click="handleCloseMusic()"
			v-if="data.musicSrc==item.filePath&&data.isPlay"
			src="../../../assets/image/template/stop.png" alt="">
	</div>
</template>
<script setup lang="ts">
    import {
		warehouseData
	} from '../template'
    const data = reactive(new warehouseData())
    const audio = ref(null);
    // 播放音频
	const handlePlayMusic = (path: string) => {
		if (path !== data.musicSrc) {
			data.musicSrc = ''
			let timeout = setTimeout(() => {
				data.musicSrc = path
				clearTimeout(timeout)
			}, 100)
		}
		let platout = setTimeout(() => {
			let dom = audio.value
			console.dir(dom)
			dom.play()
			data.isPlay = true
			clearTimeout(platout)
		}, 300)

	}
	const handleCloseMusic = () => {
		let dom = audio.value
		dom.pause();
		data.isPlay = false
		// data.musicSrc = ''
	}
</script>



ts中定义的class
export class warehouseData {
// 当前选中音频文件的路径
	musicSrc: string = '';
	// 当前音频是否在播放
	isPlay: boolean = false;
}

其中,主要是在音频地址为空的时候用v-if控制它不让他渲染这个dom,还有就是一定要用<source>标签包裹src,这个demo主要可以做到播放,暂停和切换功能,去切换音频文件的时候有100毫秒的延迟,一定要异步,因为有v-if,需要重新渲染,播放的时候也需要延迟执行,并且比    是在切换后,所以,延迟大于100毫秒即可 。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值