vue实现音乐播放器实战笔记

vue实现音乐播放器实战笔记

在本篇文章中,我们将通过使用Vue框架来实现一个音乐播放器,涉及到的知识点包括Vue基础、Vue组件、Vue路由和HTTP请求等。本篇文章将提供完整的实现代码和演示效果。

项目搭建

首先,我们需要通过Vue CLI来搭建Vue项目,在命令行中执行以下命令:

vue create music-player
cd music-player

接着,我们需要安装一些依赖组件以便实现音乐播放器的功能:

npm install axios vuex vue-router

其中,axios用于发送HTTP请求,vuex是Vue的状态管理工具,vue-router用来实现路由功能。

实现过程

设计播放器界面

我们首先需要设计播放器的界面,包括歌曲列表、播放器控制区域和进度条等。这里我们通过引入element-ui库来实现快速和美观的UI设计:

npm i element-ui -S

然后在Vue项目的入口文件src/main.js中引入element-ui的CSS样式以及组件库:

import 'element-ui/lib/theme-chalk/index.css'
import Vue from 'vue'
import App from './App.vue'
import ElementUI from 'element-ui'
Vue.use(ElementUI)
new Vue({
    render: h => h(App),
}).$mount('#app')

接着,在src/App.vue中,我们可以使用element-ui组件来进行整个播放器的页面设计。这里我们只展示主要的音乐列表部分:

<template>
  <div class="app">
    <div class="music-list">
      <el-table :data="tableData" style="width: 100%">
        <el-table-column type="index"></el-table-column>
        <el-table-column label="歌曲名" prop="name"></el-table-column>
        <el-table-column label="歌手" prop="singer"></el-table-column>
        <el-table-column label="时长" prop="duration" width="100"></el-table-column>
        <el-table-column label="操作" width="150">
          <template slot-scope="scope">
            <el-button type="text" size="mini" icon="el-icon-play" @click="play(scope.$index, scope.row)"></el-button>
            <el-button type="text" size="mini" icon="el-icon-download" @click="download(scope.$index, scope.row)"></el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
  </div>
</template>

集成音乐API

接下来,我们需要集成一个音乐API,以便获取歌曲列表及歌曲的播放信息。这里我们使用NeteaseCloudMusicApi,一个基于Node.js的第三方网易云音乐API接口。

在命令行中执行以下命令,将NeteaseCloudMusicApi部署到本地服务器上:

git clone https://github.com/Binaryify/NeteaseCloudMusicApi.git
cd NeteaseCloudMusicApi
npm install
npm run start

接着,我们需要在Vue项目中发起HTTP请求,获取音乐数据,这里我们借助axios组件进行异步请求:

export default {
  name: 'App',
  data() {
    return {
      tableData: []
    }
  },
  created() {
    this.getMusicList()
  },
  methods: {
    getMusicList() {
      axios.get('/api/playlist/detail?id=2687846840').then(res => {
        this.tableData = res.data.playlist.tracks.map((item, index) => {
          item.id = index
          item.duration = this.$moment(item.dt).format('mm:ss')
          item.url = `https://music.163.com/song/media/outer/url?id=${item.id}.mp3`
          return item
        })
      })
    },
    // ...
  }
}

注意,这里的请求参数/api/playlist/detail?id=2687846840中的id是NeteaseCloudMusicApi中一个歌单的id,可以用来获取歌单中的歌曲列表。

集成音乐播放器

现在,我们已经能够获得音乐信息,接下来需要集成音乐播放器,以便能够播放音乐。

这里我们首先使用vuex来进行状态管理,即将音乐播放状态及播放模式保存在全局状态中。在src/store/index.js中,我们定义如下的全局音乐状态:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {
    isPlaying: false, // 是否正在播放
    playingId: 0, // 正在播放的歌曲id
    playMode: 0, // 播放模式(0:列表循环,1:单曲循环,2:随机播放)
    audio: new Audio(),
    audioCurrentTime: 0, // 当前播放进度(秒)
    audioDuration: 0, // 音乐总时长(秒)
    audioBufferedPercent: 0, // 缓存进度(百分比)
    playList: []
  },
  // ...
})

其中,audio是HTML5 Audio对象,用于播放音乐。接下来,我们需要使用Vue组件来完成在页面中展示音乐播放器。

src/components/Player.vue中,我们通过audio组件及element-ui实现了音乐播放器的UI部分:

<template>
  <div class="player">
    <el-slider :percentage="audioBufferedPercent / 100" :tooltip-style="{backgroundColor: '#78cdec'}"></el-slider>
    <div class="operating-area">
      <el-button class="player-btn" icon="el-icon-skip-backward" size="mini" @click="prevMusic"></el-button>
      <el-button class="player-btn" v-if="isPlaying" icon="el-icon-pause" size="mini" @click="playPause"></el-button>
      <el-button class="player-btn" v-else icon="el-icon-play" size="mini" @click="playPause"></el-button>
      <el-button class="player-btn" icon="el-icon-skip-forward" size="mini" @click="nextMusic"></el-button>
    </div>
    <div class="player-info">
      <p class="music-name">{{ currentMusic.name }}</p>
      <p class="singer">{{ currentMusic.singer }}</p>
    </div>
    <el-slider v-model="audioCurrentTime" :max="audioDuration" :tooltip-style="{backgroundColor: '#78cdec'}"></el-slider>
  </div>
</template>

其中,用于展示音乐名和歌手的currentMusic对象定义如下:

computed: {
  currentMusic() {
    if (this.isPlaying && this.playingId >= 0) {
      return this.playList[this.playingId]
    } else {
      // 返回默认示例
      return {
        name: '未知曲目',
        singer: '未知歌手'
      }
    }
  }
}

接下来,我们需要在Player.vue组件中实现playpausenextMusicprevMusic等方法,在这些方法中,我们使用audio对象来控制音乐的播放、暂停、下一首、上一首等操作。

// 播放或暂停音乐
playPause() {
  if (!this.isReady) return
  if (this.audio.paused) {
    this.audio.play()
    this.isPlaying = true
  } else {
    this.audio.pause()
    this.isPlaying = false
  }
},
// 播放下一曲
nextMusic() {
  if (!this.isReady) return
  if (this.playMode === 2) {
    // 随机播放
    this.playingId = Math.floor(Math.random() * this.playList.length)
  } else {
    // 循环播放(单曲循环和列表循环共用)
    this.playingId = (this.playingId + 1) % this.playList.length
  }
  this.audio.src = this.playList[this.playingId].url
  this.audio.play()
},
// 播放上一曲
prevMusic() {
  if (!this.isReady) return
  if (this.playMode === 2) {
    // 随机播放
    this.playingId = Math.floor(Math.random() * this.playList.length)
  } else {
    // 循环播放(单曲循环和列表循环共用)
    this.playingId = (this.playingId - 1 + this.playList.length) % this.playList.length
  }
  this.audio.src = this.playList[this.playingId].url
  this.audio.play()
},
// ...

集成音乐列表

最后,我们需要将音乐列表和音乐播放器融合在一起,以便实现完整的音乐播放器。

src/App.vue中,我们引入Player.vue组件,并在音乐列表中添加el-button按钮,以便在点击按钮时自动播放对应的音乐:

<template>
  <div class="app">
    <div class="music-list">
      <el-table :data="tableData" style="width: 100%">
        <el-table-column type="index"></el-table-column>
        <el-table-column label="歌曲名" prop="name"></el-table-column>
        <el-table-column label="歌手" prop="singer"></el-table-column>
        <el-table-column label="时长" prop="duration" width="100"></el-table-column>
        <el-table-column label="操作" width="150">
          <template slot-scope="scope">
            <el-button type="text" size="mini" icon="el-icon-play" @click="play(scope.$index, scope.row)"></el-button>
            <el-button type="text" size="mini" icon="el-icon-download" @click="download(scope.$index, scope.row)"></el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <Player />
  </div>
</template>

src/App.vue中,我们实现了play方法,用于在点击歌曲时播放对应的音乐:

methods: {
  getMusicList() {
    // ...
  },
  play(index, row) {
    this.playList = this.tableData
    this.playingId = index
    this.audio.src = row.url
    this.audio.play()
    this.isPlaying = true
  },
  // ...
}

总结

本文介绍了如何使用Vue框架来实现一个音乐播放器,从UI设计到API集成到音乐播放器的实现,完整覆盖了Vue开发过程中的多个关键步骤。希望读者通过本文可以更好地了解Vue框架的开发流程和应用场景。完整的示例代码可以在我的Github库中查看和下载。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue实现音乐播放器实战笔记 - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • 详解如何在vue+element-ui的项目中封装dialog组件

    下面是我对如何在 Vue + Element-UI 的项目中封装 Dialog 组件的详细攻略。 一、组件封装思路 首先,我们需要了解如何在 Vue 中封装一个组件。封装组件的基本思路是定义好组件的模板、样式和行为,并将其统一封装起来,以便在需要的地方使用。下面是我们封装 Dialog 组件的基本思路: 定义好 Dialog 组件的模板,包括标题、内容、底部…

    other 2023年6月25日
    00
  • javascript之es6

    JavaScript之ES6的完整攻略 ES6是JavaScript的一个重要版本,引入了许多新的语言特性和功能,使得JavaScript更加强大和易于使用。本文将介绍ES6的主要特性和功能,并提供两个示例说明,以帮您更好地了解应用这些技术。 ES6的主要特性和功能 let和const关键字 ES6引入了和const关键字,用于声明变量和常量。与var关键字…

    other 2023年5月7日
    00
  • 使用@Valid 校验嵌套对象

    使用@Valid 校验嵌套对象的完整攻略 在Java中,我们可以使用@Valid注解来校验嵌套对象。这个注解可以应用在一个对象的字段上,用于指示需要对该字段进行校验。下面是使用@Valid校验嵌套对象的完整攻略。 步骤一:定义嵌套对象 首先,我们需要定义一个包含嵌套对象的类。例如,我们定义一个Person类,其中包含一个Address对象作为嵌套对象。 pu…

    other 2023年7月27日
    00
  • 深度点评五种常见WiFi搭建方案

    深度点评五种常见WiFi搭建方案 无线网络在我们的日常生活中扮演着越来越重要的角色,一份良好的 WiFi 网络不仅能给我们带来快速的上网和流畅的娱乐体验,还能让我们更加高效地工作。本文将深度点评五种常见的 WiFi 搭建方案,帮助你选择最适合自己的方案。 方案一:单一路由器 单一路由器是一种简单而又常见的 WiFi 搭建方案。只需要购买一台路由器,将它设置好…

    其他 2023年3月28日
    00
  • 开发人员需要知道的东西杂谈

    开发人员需要知道的东西杂谈 作为一个开发人员,除了掌握编程语言和工具之外,还需要了解一些其他的东西。这些东西可能不是很技术性的,但是它们会对你的职业生涯和工作效率有很大的帮助。在本篇文章中,我们将介绍几个开发人员需要知道的东西。 1. 版本控制 版本控制是每个开发人员都应该掌握的技能。它可以帮助你跟踪你的代码的变化,恢复到早期的版本,协作开发,以及追踪问题。…

    other 2023年6月28日
    00
  • Java双向链表的操作

    当我们需要对数据进行频繁的插入、删除等动态操作时,使用链表作为数据结构可以达到良好的效果。而双向链表相比单向链表,可以在 O(1) 的时间内实现任一结点的插入、删除或查找前驱、后继等操作。下面是 Java 双向链表的操作攻略。 定义结点类 class DListNode<T> { T val; DListNode<T> prev, n…

    other 2023年6月27日
    00
  • java-如何在jwt中正确使用jti声明以防止重放攻击?

    在JWT中,JTI声明是用于唯一标识JWT的声明。正确使用JTI声明可以防止重放攻击,提高JWT的安全性。本文将介绍在Java中正确使用JTI声明的完整攻略,包括基本用法、高级用法和示例说明。 基本用法 在Java中,使用JJWT库创建JWT并添加JTI声明的基本用法如下: import io.jsonwebtoken.Jwts; import io.jso…

    other 2023年5月8日
    00
  • Spring中字段格式化的使用小结

    那么让我们来详细讲解一下在Spring中字段格式化的使用小结,具体内容如下: 一、为什么需要字段格式化 在实际的开发中,我们经常需要对字段进行特定的格式化,以满足业务需求,例如:将日期格式化成指定的字符串格式、将数字格式化成千分位分隔符的形式等等。而如果每次都手动对字段进行格式化操作,无疑会浪费开发者的时间和精力。因此,我们可以利用Spring提供的字段格式…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部