08.vue2.x开发音乐App-使用Vuex准备音乐播放组件

因为需要在各个阶段都需要共享播放组件的信息,在任何的组件中都能够播放音乐,所以我们使用vuex。


https://vuex.vuejs.org/zh/guide/structure.html
安装vuex

vuex依赖于promise

官网:
https://vuex.vuejs.org/zh/guide/structure.html
https://github.com/vuejs/vuex/tree/dev/examples/shopping-cart

1.在musicplayer中定义初始化的状态,getter方法,setter方法

// 播放器vueX的数据设计
const playMode = {
  sequence: 0,
  loop: 1,
  random: 2
}
// 定义state初始化状态
const state = {
  singer: {},
  playing: false,
  fullscreen: false,
  playlist: [],
  sequenceList: [],
  mode: playMode.sequence,
  currentIndex: -1
}
// 定义getters
const getters = {
  singer: (state) => {
    return state.singer
  },
  playing: (state) => {
    return state.playing
  },
  fullscreen: (state) => {
    return state.fullscreen
  },
  playlist: (state) => {
    return state.playlist
  },
  sequenceList: (state) => {
    return state.sequenceList
  },
  mode: (state) => {
    return state.mode
  },
  currentIndex: (state) => {
    return state.currentIndex
  },
  currentSong: (state) => {
    return state.playlist[state.currentIndex] || {}
  }
}
// 定义mutations,对state修改的逻辑
const mutations = {
  setSinger (state, singer) {
    state.singer = singer
  },
  setPlaying (state, flag) {
    state.playing = flag
  },
  setfullScreen (state, flag) {
    state.fullscreen = flag
  },
  setPlaylist (state, list) {
    state.playlist = list
  },
  setSequenceList (state, list) {
    state.sequenceList = list
  },
  setPlayMode (state, mode) {
    state.mode = mode
  },
  setCurrentIndex (state, index) {
    state.currentIndex = index
  }
}
const actions = {
  // 选中一个音乐之后触发的变化,这是根据我们的需求,点击歌曲触发的数据改变来定义的。
  selectPlay ({commit, state}, {list, index}) {
    commit('setfullScreen', true)
    commit('setPlaying', true)
    commit('setPlaylist', list)
    commit('setSequenceList', list)
    commit('setCurrentIndex', index)
  }
}

export default {
  namespaced: true,
  state,
  getters,
  actions,
  mutations
}

2.在store/index.js中创建store

import Vue from 'vue'
import Vuex from 'vuex'
import musicplayer from './modules/musicplayer'
import 'es6-promise/auto'
import createLogger from 'vuex/dist/logger'
Vue.use(Vuex)

const debug = process.env.NODE_ENV !== 'production'

export default new Vuex.Store({
  modules: {
    musicplayer
  },
  strict: debug,
  plugins: debug ? [createLogger()] : []
})

3.在main.js中添加store

import store from './store'
fastclick.attach(document.body)

Vue.config.productionTip = false

Vue.use(VueLazyLoad, {
  loading: require('./assets/images/music_logo.png')
})

Vue.use(IScrollView, IScroll)

/* eslint-disable no-new */
new Vue({
  el: '#app',
  store,
  router,
  render: h => h(App)
})

4.在singer_detail.vue中,触发action

music-list组件向外emit了一个selectMusic方法,
只要选中了一个歌曲,就触发vue中更新状态

<music-list @selectMusic="_selectMusicFn" v-bind:list="list" @loadmore="_loadFn" v-bind:hasMore="hasMore"></music-list>
 // 触发vue事件
    _selectMusicFn (item, index) {
      this.selectPlay({
        list: this.list,
        index: index
      })
    },
    ...mapActions('musicplayer', [
      'selectPlay'
    ])

5.创建一个全屏的播放组建

他的显示是依据vue中的状态值

<template>
  <transition name="playertrs">
    <div class="player" v-show="playlist.length">
      <div class="normal-player" v-show="fullscreen">
        播放组件
      </div>
      <div class="mini-player" v-show="!fullscreen"></div>
    </div>
  </transition>
</template>

<script type="text/ecmascript-6">
// 从vuex中取东西
import {mapGetters} from 'vuex'
export default {
  computed: {
    ...mapGetters('musicplayer', {
      fullscreen: 'fullscreen',
      playlist: 'playlist'
    })
  }
}

</script>

<style>
  .player{
    position: absolute;
    top:0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: orange;
    z-index: 3;
  }
  .playertrs-enter-active, .slide-leave-active {
    transition: all .3s;
  }

  .playertrs-enter, .slide-leave-to /* .fade-leave-active below version 2.1.8 */
  {
    transform: translate3d(100%, 0, 0);
  }

</style>

在app.vue中添加组件

<template>
  <div id="app">
    <div class="header">
      <main-header></main-header>
      <tab></tab>
    </div>
    <div class="content">
      <keep-alive>
        <router-view></router-view>
      </keep-alive>
    </div>
    <player></player>
  </div>
</template>

这个音乐播放器其实是在歌手页面上面附加的一层,这里安装了vue的dev tool插件可以看到state的变化。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容