先看效果
一直在想怎么实现点击就能播放的效果,本人前端太菜了,只能用了一种很丑陋的方式实现了,步骤如下:
下面开始第一步
这里使用的是aplayer插件,地址在这里:APlayer,这是我的组件代码供大家参考:
<template>
<div id="app">
<div id="aplayer">div>
div>
template>
<script>
import APlayer from "APlayer"; // 引入音乐插件
import "APlayer/dist/APlayer.min.css"; // 引入音乐插件的样式
import { ref, onMounted, reactive, inject } from "vue";
export default {
name: "App",
data() {
return {
mid: localStorage.getItem("muscid"),
audio: [
// 歌曲列表
{
name: "极恶都市", // 歌曲名字
artist: "夏日入侵企画", // 歌曲演唱者
// 歌曲地址(这里用外链地址)
url:
"http://music.163.com/song/media/outer/url?id=570340213.mp3",
cover:
"http://p2.music.126.net/ZqJp0p4eDzCUCboH-WZJYA==/109951163326946996.jpg?param=130y130", // 歌曲头像
lrc: "", // 歌词
theme: "rgb(127, 218, 180)", // 播放这首歌曲时的主题色
},
],
info: {
fixed: true, // 不开启吸底模式
listFolded: true, // 折叠歌曲列表
autoplay: true, // 开启自动播放
preload: "auto", // 自动预加载歌曲
loop: "all", // 播放循环模式、all全部循环 one单曲循环 none只播放一次
order: "list", // 播放模式,list列表播放, random随机播放
},
};
},
mounted() {
// 初始化播放器
this.initAudio();
},
methods: {
initAudio() {
// 创建一个音乐播放器实例,并挂载到DOM上,同时进行相关配置
const ap = new APlayer({
container: document.getElementById("aplayer"),
audio: this.audio, // 音乐信息
...this.info, // 其他配置信息
});
},
goodclick() {},
},
};
script>
<style lang="less" scoped>
#app {
width: 100%;
height: 100%;
padding: 50px;
#aplayer {
width: 480px; // 定个宽度
}
}
style>
http://music.163.com/song/media/outer/url?id=255020.mp3
,这些外链接地址都有规律,我只需要拼接它的id的值就好了于是,我在数据库中设置了一个字段:
当然,字段名字不重要,随意设置,我们只需要添加音乐数据时,加上这个字段的值,也就是获取到外链接的地址,这个值在这里获取:远方音乐外链接
前端在查询出来所有的音乐数据后,我们点播哪个音乐时,就需要存储哪个音乐的id,它的名字,演唱者都可以存储
以下是我的代码:
//获取点播数据
const onPlayer = (row: any) => {
console.log("操作的那条数据" + JSON.stringify(row.singer));
tableData.musicId = row.pid;
localStorage.setItem("musicId", row.pid);
localStorage.setItem("musicName", JSON.stringify(row.name));
localStorage.setItem("musicSinger", JSON.stringify(row.singer));
//timer.value = new Date().getTime();
reload();
};
这是页面部分
<el-table
:data="tableData.list"
height="500px"
style="width: 100%"
@row-click="rowBack"
>
<el-table-column prop="name" label="歌曲名称" />
<el-table-column prop="singer" label="演唱者" />
<el-table-column prop="composer" label="作曲者" />
<el-table-column prop="album" label="专辑" />
<el-table-column prop="duration" label="时长" width="80px" />
<el-table-column label="" width="100px">
<template #default="scope">
<el-button text type="primary" @click="onPlayer(scope.row)"
>播放el-button
>
template>
el-table-column>
el-table>
然后是在播放器组件中拼接字符串,就是把直接存储的值拼接上去
audio: [
// 歌曲列表
{
name: localStorage.getItem("musicName"), // 歌曲名字
artist: localStorage.getItem("musicSinger"), // 歌曲演唱者
// 歌曲地址(这里用外链地址)
url:
"https://music.163.com/song/media/outer/url?id=" +
localStorage.getItem("musicId"),
cover:
"http://p2.music.126.net/ZqJp0p4eDzCUCboH-WZJYA==/109951163326946996.jpg?param=130y130", // 歌曲头像
lrc: "", // 歌词
theme: "rgb(127, 218, 180)", // 播放这首歌曲时的主题色
},
],
以上就基本设置完成了,但是点击后还需要手动刷新才能播放,这里提供一个不完善的解决方式:通过设置页面刷新来刷新播放器,组件刷新目前不太会,以后再说
App.vue
中加入以下代码<script lang="ts">
//配置页面刷新
import { provide, ref, nextTick } from "vue";
export default {
setup() {
const isRouteActive = ref(true);
const reload = () => {
isRouteActive.value = false;
nextTick(() => {
isRouteActive.value = true;
});
};
provide("reload", reload);
return {
isRouteActive,
reload,
};
},
};
</script>
<template>
<div id="app">
<RouterView v-if="isRouteActive"></RouterView>
</div>
</template>
<style scoped>
#app {
margin: 0%;
padding: 0%;
left: 0%;
top: 0%;
}
/*flex布局类名*/
</style>
我们如何使用呢,看这里!在需要使用页面中引入 const reload: any = inject("reload");
然后在点播方法中使用
//播放
const onPlayer = (row: any) => {
console.log("操作的那条数据" + JSON.stringify(row.singer));
tableData.musicId = row.pid;
localStorage.setItem("musicId", row.pid);
localStorage.setItem("musicName", JSON.stringify(row.name));
localStorage.setItem("musicSinger", JSON.stringify(row.singer));
//timer.value = new Date().getTime();
reload();
};
好,现在就可以了,但是这个组件的刷新,我需要再去学习一下…