vue網易雲音樂移動專案筆記
vue網易雲專案筆記
1、使用Vue cli在命令列建立一個vue專案起名music001,如圖:
下載axios,swiper,vue-awesome-swiper
檢查package.json檔案
2.src下建立app.vue
3.在路由檔案router下的index.js中進行配置:
引入HomeView,這個HomeView.vue即是整個專案的主介面
4.在components中新建這四個元件的vue檔案並在HomeView.vue中進行引入並註冊,接下來就可以進行專案的搭建
Components引入四個元件:
(1)topNav.vue(頂部導航欄)
首先是頂部導航欄topNav.vue的搭建,這個元件比較簡單,僅僅是css樣式進行排版,在阿里的向量圖示庫中鏈入一些小的圖示檔案
(2)swiperCom.vue(輪播圖)
再就是導航欄下面的輪播圖swiperCom.vue部分,這個部分需要從網易雲API中獲取實時的圖片,我們需要在當前vue專案中新建一個api資料夾,在api中新建index.js,這裡就需要用到Ajax技術了,而我們之前下載好的axios就是一個封裝好的Ajax庫,直接import引入axios即可.
繼續在api中的index中進行操作,let一個值為我們node的那個地址比如我的node地址為http://localhost:3000,
Let baseUrl=’ http://localhost:3000’即可
接下來我們獲取輪播圖的api:
/banner?type=是網易雲api庫中可以獲取到輪播圖的路徑
使用${}將一個值變成變數,再通過``解析變數
回到swiperCom.vue,import swiper檔案和剛剛在index中新建的getBanner函式
在這裡我們先用data(){return{imgs:[]}}定義返回一個imgs
在使用mounted時,由於是非同步函式要加上async,來呼叫輪播圖圖片,通過這個函式來拿到輪播圖資料
這裡又新加了一個分頁器的函式.
這裡是將res獲取到的資料中的data中的banner中的前三個資料賦值給imgs
在template中使用v-for迴圈資料即可:
這樣輪播圖模組就做好了
(3)iconlist(向量圖示)
下面是一個簡單的靜態頁面iconList,簡單設定一下css樣式即可
(4)musicList(歌單列表)
最後一個元件musicList,這個元件和前面swiper的資料引用方式相似,但我們選擇了組合api的方法再次實現一下這個資料的傳輸
這是組合api的程式碼
使用了onMounted的生命週期函式
現將getMusic獲取的資料儲存到res中.再將res的資料傳給musics,最後return這個musics
這是渲染到頁面上的程式碼.這裡的picUrl,name,playCount都是通過getMusics獲取到的資料的名稱,所以在這裡直接匯入即可
至此,靜態頁面完成。
點開每個歌單都是一個這樣的單獨的頁面,資料也是隨之變換的
先在原有的基礎上新建幾個vue專案,views中一個listView,components中listViewTop.vue和playList.vue
這裡的listView算是listViewTop和playList 的父級
歌單詳情頁面的實現效果和之前的大同小異
仍然是在router/index.js中配置一個獲取資料的函式:
然後在父檔案listView中引用函式和兩個子檔案
使用setup函式組合api:
這一步和前面的做法相似,不過多贅述
後面各個元件頁面效果的實現就只需要props獲得父元件的資料然後渲染到頁面的指定位置並進行排版即可
我們在子元件中獲取了父元件中的playlist,所以在排版頁面上只需要去觀察playlist中的各項資料,選擇合適的資料名稱渲染即可
元件之間共享的資料,都要使用的資料放到狀態管理庫store中
資料存放在store資料夾下的index.js中
在state中建立一個playlist音樂播放列表,預設播放playCurrentIndex:0下標為0(第一條資料)
在mutations中定義一個函式來修改state中的playlist音樂播放列表資料
下面要將預設的歌曲列表改成當前歌單的歌曲列表
要在listView中執行這個修改函式
當listView獲取到歌單的資料時,觸發這個修改函式,將預設歌單的資料修改為當前歌單的資料
今日專案的開發主要是實現了音樂播放與暫停,切換播放歌曲的功能
首先是一些昨天的程式碼回顧,今天的實現效果和昨天的一些程式碼密切相關:
我們先說這個切換播放歌曲:
切換播放歌曲的原理和修改playlist的方法一致,只是把palylist換成了playCurrentIndex,
讓傳輸來的value修改到playCurrentIndex,就是歌曲的下標,因為他預設是0(第一首)
定義一個新的方法:
setPlayIndex引數和setPlaylist一致不過換掉了傳輸資料的變數
與setPlaylist方法不同的是,這裡並沒有使用commit來傳值,而是使用了mutation來傳值,
在有歌單列表的頁面playlist.vue
即可,這是傳值的兩種方法,最後在每一個數據上繫結點選事件setPlayIndex(i)傳值i(歌曲下標)
再來說說這個音樂播放器的實現:
使用一個audio繫結網易雲音樂的api地址
autoplay:自動播放,paused:當前歌曲的暫停狀態,play():播放當前歌曲,pause()暫停歌曲
準備一個變數控制播放暫停按鈕的切換paused:true
使用這樣一個函式即可
歌曲詳情頁面
歌曲詳情頁面 定位fixed 脫離文件流
swiper框架中的內容 定位 脫離文件流
swiper定位的z-index更高或者class優先順序高於歌曲詳情頁面導致歌曲詳情無法覆蓋swiper部分,因為swiper是引入的框架,框架的優先順序更高
修改swiper.css的程式碼即可
定義一個show=false(意為預設不顯示),給playMusci元件繫結這個v-show=show,在歌曲小圓標頭像上繫結click=show=!show實現點選歌曲圖示顯示playMusic元件
已經可以點擊出來playMusic,現在定義一個返回按鈕
實現思路:
定義一個自定義函式back:show=!show,然後在playMusic頁面中觸發這個自定義函式
在返回按鈕上@click=”$emit(‘back’)”觸發back自定義函式並執行
將父元件中的歌曲詳情資料,暫停播放按鈕,暫停播放函式等傳輸到子元件中,使用props接受
<div class="bg" :style="{backgroundImage:`url(${playDetail.al.picUrl})`}"></div>
加上背景圖
加上底部的六個按鈕,並給播放和暫停按鈕呼叫play和paused函式
獲取歌詞詳情:
歌詞是元件之間共享的資料
在store/index.js中定義
在state中定義一個lyric:””空來接收當前播放歌曲的歌詞
在mutations中定義一個新的函式setLyric來修改歌詞的資料
在actions中定義一個reqLyric獲取歌詞的函式
由於用到了await非同步處理,所以加上了async,這裡的let就是獲取到的歌詞資料
獲取歌詞函式的呼叫應在playController中的mounted生命週期函式中呼叫.
由於是非同步actions中的方法,所以這裡使用ispatch觸發
淺淺截個圖來直接說明兩者的不同 以及觸發方式
這時我們的當前歌曲的歌詞已經儲存在了state.lyric中,直接在前端歌詞頁面引入即可
<p>{{$store.state.lyric}}</p>
動態繫結class
播放時
暫停時
這時通過一個動態class的繫結,在css中修改transform樣式達到動畫效果
使用一個:class=”active=!paused”,在css中定義active的transform樣式
Paused就是之前寫好的播放與暫停的判斷函式
實現點選按鈕切換上一首和下一首
在按鈕頁面定義一個goplay(num)函式,在兩個按鈕上新增click事件並呼叫這個goplay,上一首是goplay(-1),下一首是goplay(+1)
然後從store中獲取當前播放歌曲列表playlist與播放歌曲下標playCurrentIndex
記得import mapState from vuex
然後在methods函式中
Let index=this.playCurrentIndex+num,index就會獲取當前播放歌曲下標playCurrentIndex上一首(-1)或下一首(+1)的下標,使用commit將index的值傳到setPlayIndex函式中來修改當前播放音樂下標.
單是這樣還不夠
,我們還需要一個if判斷,當歌曲下標為第一首時點選上一首會切換到當前列表的最後一首,反之同理:
這樣歌曲就能在當前列表中上下點選切換了
搜尋歌曲
在view中新建一個Search.vue並引入
1、封裝搜尋歌曲的api /search?keywords=
2、給input新增鍵盤按下事件 @keydown.enter="searchSong"
3、編寫searchSong函式,傳送ajax請求,傳遞引數searchKeyword
4、接收ajax返回的歌曲列表,將它v-for迴圈渲染到頁面上
使用者登入驗證與登入狀態維持
使用者登入頁面和個人中心頁面
在store/index.js中新增一個判斷是否登陸的條件
在router/index.js中引入store,然後在router中對store中的資料進行判斷
個人中心模組以及退出登入
獲取登入使用者資訊
1、 封裝獲取使用者詳情的api介面
2、 呼叫獲取使用者詳情介面,接收到使用者詳情,將使用者詳情儲存到store.state.user.userDetail中
把資料存到本地儲存中
3、 在個人中心頁面訪問使用者詳情的使用者名稱
4,退出賬號操作
單擊退出按鈕,清空是否登陸判斷條件,清空本地儲存登入使用者資訊,回到首頁
修改store中的資料,需要在store中mutations中新建一個方法
在退出按鈕上新增一個cilck事件=’logout’,在methods中定義這個logout函式
需要給img的盒子上一個v-if判斷:
v-if="$store.state.user.userDetail.profile"
至此專案完成。
搜尋
複製