vue3+ts使用APlayer的示例代碼
引言
自己弄新版博客想用APlayer,到github看了一圈沒見有vue3版本的,所以就用基于Aplayer組件化了下,順帶看了下Meting.js,用Meting.js的服務(wù)去獲取指定歌曲,詳見代碼
參考:
https://github.com/DIYgod/APlayer
https://aplayer.js.org/#/zh-Hans/
https://github.com/metowolf/MetingJS
安裝依賴
yarn add aplayer
代碼
APlayer.Vue
<!--
<!--
* @Author: MK
* @Date: 2021-12-16 15:41:47
* @LastEditTime: 2021-12-24 11:17:45
* @LastEditors: MK
* @Description: APlayer組件化
* @FilePath: \vue-mk-blog\src\components\APlayer.vue
-->
<template>
<div ref="playerRef"></div>
</template>
<script lang="ts" setup>
import http from '@/api/http'
import APlayer from 'APlayer';
import 'APlayer/dist/APlayer.min.css';
import type {PropType} from '@vue/runtime-core';
import {nextTick, onBeforeUnmount, onMounted, ref} from 'vue'
const playerRef = ref()
let instance: APlayer;
// APlayer歌曲信息
class Audio {
// 音頻藝術(shù)家
artist: String;
// 音頻名稱
name: String;
// 音頻鏈接
url: String;
// 音頻封面
cover: String;
// 歌詞
lrc: String;
constructor(artist: String, name: String, url: String, cover: String, lrc: String) {
this.artist = artist;
this.name = name;
this.url = url;
this.cover = cover;
this.lrc = lrc;
}
}
const props = defineProps({
// 開啟吸底模式
fixed: {
type: Boolean as PropType<boolean>,
default: true
},
// 開啟迷你模式
mini: {
type: Boolean as PropType<boolean>,
default: true
},
// 音頻自動(dòng)播放
autoplay: {
type: Boolean as PropType<boolean>,
default: false
},
// 主題色
theme: {
type: String as PropType<string>,
default: 'rgba(255,255,255,0.2)'
},
// 音頻循環(huán)播放
loop: {
type: String as PropType<'all' | 'one' | 'none'>,
default: 'all'
},
// 音頻循環(huán)順序
order: {
type: String as PropType<'list' | 'random'>,
default: 'random'
},
// 預(yù)加載
preload: {
type: String as PropType<'auto' | 'metadata' | 'none'>,
default: 'auto'
},
// 默認(rèn)音量
volume: {
type: Number as PropType<number>,
default: 0.7,
validator: (value: Number) => {
return value >= 0 && value <= 1;
}
},
// 歌曲服務(wù)器(netease-網(wǎng)易云, tencent-qq音樂, kugou-酷狗, xiami-小米音樂, baidu-百度音樂)
songServer: {
type: String as PropType<'netease' | 'tencent' | 'kugou' | 'xiami' | 'baidu'>,
default: 'netease'
},
// 播放類型(song-歌曲, playlist-播放列表, album-專輯, search-搜索, artist-藝術(shù)家)
songType: {
type: String as PropType<string>,
default: 'playlist'
},
// 歌的id
songId: {
type: String as PropType<string>,
default: '19723756'
},
// 互斥,阻止多個(gè)播放器同時(shí)播放,當(dāng)前播放器播放時(shí)暫停其他播放器
mutex: {
type: Boolean as PropType<boolean>,
default: true
},
// 傳遞歌詞方式
lrcType: {
type: Number as PropType<number>,
default: 3
},
// 列表是否默認(rèn)折疊
listFolded: {
type: Boolean as PropType<boolean>,
default: true
},
// 列表最大高度
listMaxHeight: {
type: String as PropType<string>,
default: '100px'
},
// 存儲(chǔ)播放器設(shè)置的 localStorage key
storageName: {
type: String as PropType<string>,
default: 'aplayer-setting'
}
})
// 初始化
onMounted(() => {
nextTick(() => {
http.player.getSongSheet(props.songServer, props.songType, props.songId)
.then(res => {
let audioList = res.data.map(value => new Audio(value.author, value.title, value.url, value.pic, value.lrc));
instance = new APlayer({
container: playerRef.value,
fixed: props.fixed,
mini: props.mini,
autoplay: props.autoplay,
theme: props.theme,
loop: props.loop,
order: props.order,
preload: props.preload,
volume: props.volume,
mutex: props.mutex,
lrcType: props.lrcType,
listFolded: props.listFolded,
listMaxHeight: props.listMaxHeight,
storageName: props.storageName,
audio: audioList
})
})
})
})
// 銷毀
onBeforeUnmount(() => {
instance.destroy()
})
</script>player.ts
import axios from '@/utils/axios'
export class player {
static getSongSheet(server: string, type:String, id: String) {
return axios.get(`https://api.i-meto.com/meting/api?server=${server}&type=${type}&id=${id}&r=${Math.random()}`);
}
}效果圖

到此這篇關(guān)于vue3+ts使用APlayer的文章就介紹到這了,更多相關(guān)vue3+ts使用APlayer內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
el-select如何獲取下拉框選中l(wèi)abel和value的值
在開發(fā)業(yè)務(wù)場景中我們通常遇到一些奇怪的需求,例如el-select業(yè)務(wù)場景需要同時(shí)獲取我們選中的label跟 value,下面這篇文章主要給大家介紹了關(guān)于el-select如何獲取下拉框選中l(wèi)abel和value的值,需要的朋友可以參考下2022-10-10
Vue使用el-table實(shí)現(xiàn)表格跨頁多選
在我們?nèi)粘m?xiàng)目開發(fā)中,經(jīng)常會(huì)有表格跨頁多選的需求,接下來讓我們用?el-table示例一步步來實(shí)現(xiàn)這個(gè)需求,文中有詳細(xì)的代碼講解,對我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-08-08
詳解vue中的父子傳值雙向綁定及數(shù)據(jù)更新問題
這篇文章主要介紹了vue中的父子傳值雙向綁定及數(shù)據(jù)更新問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06
vue自定義組件(通過Vue.use()來使用)即install的用法說明
這篇文章主要介紹了vue自定義組件(通過Vue.use()來使用)即install的用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
使用el-upload組件實(shí)現(xiàn)遞歸多文件上傳的全過程
el-upload組件文件上傳都是每個(gè)文件請求一次接口,本次實(shí)現(xiàn)一次請求上傳多個(gè)文件,下面這篇文章主要給大家介紹了關(guān)于使用el-upload組件實(shí)現(xiàn)遞歸多文件上傳的相關(guān)資料,需要的朋友可以參考下2023-03-03
vue3修改link標(biāo)簽?zāi)J(rèn)icon無效問題詳解
這篇文章主要介紹了vue3修改link標(biāo)簽?zāi)J(rèn)icon無效問題詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Vue高級用法實(shí)例教程之動(dòng)態(tài)組件
讓多個(gè)組件使用同一個(gè)掛載點(diǎn),并動(dòng)態(tài)切換,這就是動(dòng)態(tài)組件,下面這篇文章主要給大家介紹了關(guān)于Vue高級用法實(shí)例教程之動(dòng)態(tài)組件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-11-11
vue高德地圖JS API實(shí)現(xiàn)海量點(diǎn)標(biāo)記示例
本文主要介紹了vue高德地圖JS API實(shí)現(xiàn)海量點(diǎn)標(biāo)記示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08

