如何寫好一個vue前端頁面(三)
阿新 • • 發佈:2018-12-14
看了vuex,看到了這樣的應用,貼在這裡,以後常看
import Vue from 'vue' import Vuex from 'vuex' import Axios from 'axios' import api from '../api' Vue.use(Vuex) const store = new Vuex.Store({ state: { audio: { 'id': 0, 'name': '歌曲名稱', 'singer': '演唱者', 'albumPic': '/static/placeholder_disk_play_program.png', 'location': '', 'album': '' }, lyric: '', currentIndex: 0, // 當前播放的歌曲位置 playing: false, // 是否正在播放 loading: false, // 是否正在載入中 showDetail: false, songList: [], // 播放列表 currentTime: 0, tmpCurrentTime: 0, durationTime: 0, bufferedTime: 0, change: false // 判斷是更改的時間還是播放的時間 }, getters: { audio: state => state.audio, playing: state => state.playing, loading: state => state.loading, showDetail: state => state.showDetail, durationTime: state => state.durationTime, currentIndex: state => state.currentIndex, bufferedTime: state => state.bufferedTime, tmpCurrentTime: state => state.tmpCurrentTime, songList: state => state.songList, change: state => state.change, currentTime: state => state.currentTime, prCurrentTime: state => { return state.currentTime / state.durationTime * 100 }, prBufferedTime: state => { return state.bufferedTime / state.durationTime * 100 } }, mutations: { play (state) { state.playing = true }, pause (state) { state.playing = false }, toggleDetail (state) { state.showDetail = !state.showDetail }, setAudio (state) { state.audio = state.songList[state.currentIndex - 1] }, setAudioIndex (state, index) { state.audio = state.songList[index] state.currentIndex = index + 1 }, removeAudio (state, index) { state.songList.splice(index, 1) if (index === state.songList.length) { index-- } state.audio = state.songList[index] state.currentIndex = index + 1 if (state.songList.length === 0) { state.audio = { 'id': 0, 'name': '歌曲名稱', 'singer': '演唱者', 'albumPic': '/static/player-bar.png', 'location': '', 'album': '' } state.playing = false } }, setChange (state, flag) { state.change = flag }, setLocation (state, location) { state.audio.location = location }, updateCurrentTime (state, time) { state.currentTime = time }, updateDurationTime (state, time) { state.durationTime = time }, updateBufferedTime (state, time) { state.bufferedTime = time }, changeTime (state, time) { state.tmpCurrentTime = time }, openLoading (state) { state.loading = true }, closeLoading (state) { state.loading = false }, resetAudio (state) { state.currentTime = 0 }, playNext (state) { // 播放下一曲 state.currentIndex++ if (state.currentIndex > state.songList.length) { state.currentIndex = 1 } state.audio = state.songList[state.currentIndex - 1] }, playPrev (state) { // 播放上一曲 state.currentIndex-- if (state.currentIndex < 1) { state.currentIndex = state.songList.length } state.audio = state.songList[state.currentIndex - 1] }, addToList (state, songs) { var items = Array.prototype.concat.call(songs) items.forEach(item => { var flag = false state.songList.forEach(function (element, index) { // 檢測歌曲重複 if (element.id === item.id) { flag = true state.currentIndex = index + 1 } }) if (!flag) { state.songList.push(item) state.currentIndex = state.songList.length } }) }, setLrc (state, lrc) { state.lyric = lrc } }, // 非同步的資料操作 actions: { getSong ({commit, state}, id) { // 使用 CancelToken 退出一個Axios事件 var CancelToken = Axios.CancelToken var source = CancelToken.source() if (state.loading && state.songList.length > 0) { console.log('cancel') source.cancel() } commit('openLoading') Axios.get(api.getSong(id)).then(res => { // 統一資料模型,方便後臺介面的改變 var url = res.data.data[0].url commit('setAudio') commit('setLocation', url) }) .catch((error) => { // 錯誤處理 console.log(error) window.alert('獲取歌曲資訊出錯!') }) } } }) export default store