最近在自學vue,打算本身仿一個項目來實戰一下,因爲本人很喜歡聽歌,因此就選擇了網易雲音樂,在這與你們分享一下本身所遇到的問題,其中也有些不足之處也但願你們提一些寶貴的意見,互相學習,一塊兒進步。css
因爲時間有限,只是作了個頁面的播放功能,其中用到了網易雲音樂的API網易雲,有興趣的能夠去玩玩,其中也涉及到了一些知識點,在這與你們分享一下。前端
整個效果:
)vue
這就是一個header組件,一個footer組件,一個musicList組件和一個paly組件組成的單頁面。ios
我這是從網易雲音樂api扒出來的,扒出來以後新建一個文件,把數據放進去,以後經過axios獲取,部分代碼以下:git
actions: { getData({ commit,state }) { if (localStorage.musics !== '[]' && localStorage.musics) { state.musicData = JSON.parse(localStorage.musics); return; } return new Promise((resolve, reject) => { Vue.axios.get('music-data') .then (res => { if (res.data.error === 0) { state.musicData = res.data.musicData; localStorage.musics = JSON.stringify(state.musicData); } }) .then(() => { commit('toggleMusic',0) }); resolve(); }); } }
我是在這刪除這個圖標下綁定了一個事件,主要就二句代碼:github
<span v-on:click="del(index)" class="del-icon"></span> 在methods定義del事件就行了 del(index){ this.$store.commit('del',index); }
尾部的播放功能我一開始遇到了一個難題就是如何獲取歌曲的時間和控制播放的進度。後來經過查找資料和百度解決了vue-router
獲取歌曲時間的部分代碼以下:axios
<span class="start">{{transformTime(now)}}</span> js部分代碼 this.nativeAudio = document.querySelector('audio'); this.nativeAudio.addEventListener('play', () => { this.totalTime = this.transformTime(this.nativeAudio.duration); this.now = this.nativeAudio.currentTime; setInterval(() => { this.now = this.nativeAudio.currentTime; }, 1000) }) transformTime(seconds) { let m, s; m = Math.floor(seconds / 60); m = m.toString().length == 1 ? ('0' + m) : m; s = Math.floor(seconds - 60 * m); s = s.toString().length == 1 ? ('0' + s) : s; return m + ':' + s; }
控制播放進度的部分代碼以下api
changeTime(event) { let progressBar = this.$refs.progressBar; let coordStart = progressBar.getBoundingClientRect().left; //getBoundingClientRect()方法返回元素的大小及其相對於視口的位置 let coordEnd = event.pageX; this.nativeAudio.currentTime = (coordEnd - coordStart) / progressBar.offsetWidth * this.nativeAudio.duration; this.now = this.nativeAudio.currentTime; this.nativeAudio.play(); this.$store.commit('play', true); }, touchMove(event) { let progressBar = this.$refs.progressBar; let coordStart = progressBar.getBoundingClientRect().left; let coordEnd = event.touches[0].pageX; this.$refs.now.style.width = ((coordEnd - coordStart) / progressBar.offsetWidth).toFixed(3) * 100 + '%'; //toFixed(3)保留小數點後3位 }, touchEnd(event) { this.nativeAudio.currentTime = this.$refs.now.style.width.replace('%', '')/100 * this.nativeAudio.duration; this.now = this.nativeAudio.currentTime; this.nativeAudio.play(); this.$store.commit('play', true); },
換膚主要提供了四種顏色,紅色 藍色 黑色 和綠色,樣式使用的是flex佈局,主要css代碼以下:svg
.skin { position: absolute; display: flex; flex-direction: column; bottom: 50px; right: 15px; width: 30px; .skin-colors { flex: 4; width: 100%; display: flex; justify-content: center; align-items: center; flex-direction: column; .selected { border: 1px solid white; } i { flex: 1; display: inline-block; width: 20px; height: 20px; cursor: pointer; border-radius: 10px; margin-bottom: 5px; } i.one { background-color: #B72712; } i.two { background-color: #1565C0; } i.three { background-color: #212121; } i.four { background-color: #1B5E20; } } .icon-skin { flex: 1; width: 100%; height: 30px; background-repeat: no-repeat; background-size: contain; margin-top: 3px; cursor: pointer; } .icon-skin-red { background-image: url('./skinRed.svg'); } .icon-skin-green { background-image: url('./skinGreen.svg'); } .icon-skin-blue { background-image: url('./skinBlue.svg'); } .icon-skin-black { background-image: url('./skinBlack.svg'); }
部分代碼以下:
prev() { this.audio.index = this.audio.index === 0 ? this.musicData.length - 1 : (--this.audio.index); this.$store.commit('toggleMusic', this.audio.index); } next() { this.audio.index = this.audio.index === this.musicData.length - 1 ? 0 : (++this.audio.index); this.$store.commit('toggleMusic', this.audio.index); }
總結:經過模仿這個項目更加清楚地瞭解各組件以前的使用和不一樣組件的狀態共享。固然也遇到了一些坑,文章寫到這裏,也沒有徹底寫完,只寫了一個單頁面,但也算是一個小小的總結,接下來附上個人源碼:項目源碼,有興趣的朋友能夠看看順便幫忙點個star和fork,也但願能幫助到一些朋友。做爲一名快要成爲大四的學生,時間真的寶貴,對待學習也不敢懈怠,若是你們有什麼好的想法的話能夠聯繫個人qq:137032979.碼字不容易,但願你們點個贊。前端路漫漫,與君共勉之。