【音乐App】—— Vue-music 项目学习笔记:播放器内置组件开发(一)

【音乐App】—— Vue-music 项目学习笔记:播放器内置组件开发(一)

前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记。

项目github地址:https://github.com/66Web/ljq_vue_music,欢迎Star。


播放暂停 前进后退
一、播放器Vuex数据设计
  • 需求: 播放器可以通过歌手详情列表、歌单详情列表、排行榜、搜索结果多种组件打开,因此播放器数据一定是全局的
  • state.js目录下:定义数据
    import {playMode} from '@/common/js/config'
    
    const state = {
            singer: {},
            playing: false, //播放状态
            fullScreen: false, //播放器展开方式:全屏或收起
            playlist: [], //播放列表(随机模式下与顺序列表不同)
            sequenceList: [], //顺序播放列表
            mode: playMode.sequence, //播放模式: 顺序、循环、随机
            currentIndex: -1 //当前播放歌曲的index(当前播放歌曲为playlist[index])
    }
  • common->js目录下:创建config.js配置项目相关
    //播放器播放模式: 顺序、循环、随机
    export const playMode = {
           sequence: 0, 
           loop: 1,
           random: 2
    }
  • getter.js目录下:数据映射(类似于计算属性)
    export const playing = state => state.playing
    export const fullScreen = state => state.fullScreen
    export const playlist = state => state.playlist
    export const sequenceList = state => state.sequenceList
    export const mode = state => state.mode
    export const currentIndex = state => state.currentIndex
    
    export const currentSong = (state) => {
              return state.playlist[state.currentIndex] || {}
    }

    组件中可以通过mapgetters拿到这些数据

  • mutaion-type.js目录下:定义事件类型字符串常量
    export const SET_PLAYING_STATE = 'SET_PLAYING_STATE'
    export const SET_FULL_SCREEN = 'SET_FULL_SCREEN'
    export const SET_PLAYLIST = 'SET_PLAYLIST'
    export const SET_SEQUENCE_LIST = 'SET_SEQUENCE_LIST'
    export const SET_PLAY_MODE = 'SET_PLAY_MODE'
    export const SET_CURRENT_INDEX = 'SET_CURRENT_INDEX'

    mutation中都是动作,前缀加SET、UPDATE等

  • mutaion.js目录下:操作state
    const mutations = {
           [types.SET_SINGER](state, singer){
                 state.singer = singer
           },
           [types.SET_PLAYING_STATE](state, flag){
                 state.playing = flag
           },
           [types.SET_FULL_SCREEN](state, flag){
                 state.fullScreen = flag
           },
           [types.SET_PLAYLIST](state, list){
                 state.playlist = list
           },
           [types.SET_SEQUENCE_LIST](state, list){
                 state.sequenceList = list
           },
           [types.SET_PLAY_MODE](state, mode){
                 state.mode = mode
           },
           [types.SET_CURRENT_INDEX](state, index){
                 state.currentIndex = index
           }
    } 
二、播放器Vuex的相关应用
  • components->player目录下:创建player.vue
  1. 基础DOM:
    <div class="normal-player">
            播放器
    </div>
    <div class="mini-player"></div>
  •  App.vue中应用player组件:因为它不是任何一个路由相关组件,而是应用相关播放器,切换路由不会影响播放器的播放
    <player></player>
  • player.vue中获取数据:控制播放器的显示隐藏
    import {mapGetters} from 'vuex'
    
    computed: {
          ...mapGetters([
               'fullScreen',
               'playlist'
          ])
    }

    通过v-show判断播放列表有内容时,显示播放器,依据fullScreen控制显示不同的播放器

    <div class="player" v-show="playlist.length">
            <div class="normal-player" v-show="fullScreen">
                  播放器
            </div>
            <div class="mini-player" v-show="!fullScreen"></div>
    </div>
  • song-list.vue中添加点击播放事件:基础组件不写业务逻辑,只派发事件并传递相关数据
    @click="selectItem(song, index)
    selectItem(item, index){
          this.$emit('select', item, index)
    }

    子组件行为,只依赖本身相关,不依赖外部调用组件的需求,传出的数据可以不都使用

  • music-list.vue中监听select事件
    <song-list :songs="songs" @select
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值