Vue2.0 開發移動端音樂webApp 筆記


項目預覽地址:http://ustbhuangyi.com/music/#/recommend

獲取歌曲 url 地址方法升級:https://github.com/ustbhuangyi/vue-music/issues/111

參考:

1、可以把一些常用的、操作dom的方法封裝到js里面,比如addClass

2、頁面中的方法,盡量封裝成一個個小方法,減少每個方法里面的代碼

3、recommend.vue,為什么要在引入輪播圖插件的外面進行判斷?原因是:created(){} 里面獲取數據是一個異步操作,請求后台數據需要一點時間

 

4、slider.vue,mounted里的setTimeout的時間為20的原因,瀏覽器刷新一次的時間為17毫秒

 

 5、app.vue  

當切換組件后,再切回來,數據會再請求一次

優化方法

  在app.vue里面,添加

1 <keep-alive>
2       <router-view></router-view>
3 </keep-alive>

添加keep-alive后,數據會保存到內存中

6、slide.vue

1 destroyed () {
2   clearTimeout(this.timer)
3 }

當組件被切換出去,生命周期就進入到destroyed,要進行clearTimeout。

注意:當組件中用到了計時器時,要在destroyed中進行clearTimeout,釋放內存資源,這是一種好的編程習慣

7、scroll.vue組件

通過監控data數據的變化來調用refresh()方法

8.、recommend.vue組件

在使用scroll組件的時候,傳入data的為discList的原因是:

discList數據后獲取,但有一個問題,如果recommend數據沒有獲取到,或者在discList數據之后獲取,那么滾動的時候,就會少了下面這一塊區域

解決的辦法:

結果分析:上面這一塊的高度,是由圖片撐開的,所以我們可以給圖片綁定一個load方法,當圖片加載時,就調用

1 loadImage () {
2   if (!this.checkloaded) {
3     this.checkloaded = true
4     setTimeout(() => {
5       this.$refs.scroll.refresh()
6     }, 20)
7   }
8 }

小技巧:圖片有很多,我們不需要每一張圖片都調用load方法,可以添加有一個判斷值   this.checkloaded

9、在頁面中,我們要加載很多圖片,不需要一次性全部加載,只要滑動到相應位置再加載,這時候就需要用到vue-lazyload

地址:https://github.com/hilongjw/vue-lazyload

使用方法,先用npm 安裝vue-lazyload

main.js 引入vue-lazyload

需要用到的地方

<img>標簽里面,把:src改成v-lazy

10、當一個組件中,同時使用了fastclick 和better-scroll,且better-scroll設置了click:true屬性,這時會出現一個問題,

無法點擊了,解決辦法是,在Iimg處設置class="needsclick",這個是fastclick的屬性

11、數據沒有加載時顯示的效果,請看 loading.vue

12、singer.vue

 

數組進行排序,用來sort方法,sort方法內部的返回倆個數的charCodeAt相減的bollean值

13、listview.vue

這個表示向下取整,原因:

因為|這個是或位操作符,意思是先將數值轉換成32位二進制整數值(如果有小數則忽略),再對二進制上每一位進行或運算,得出結果;

這里xxx|0,因為0的二進制就是0000000...00一共32位(32個0),無論任何數對0進行或運算都是原來的數,因此可以用它來進行向下取整

14、scroll.vue (第5章用到)

15、

 

 

 16、子路由的配置

router文件夾下的Index.js里面

singer.vue里面

// router的編程式調用接口,類似於申明式<router-link :to="...">
參考地址:http://blog.csdn.net/sinat_17775997/article/details/68941091

 17、在vue中,用export注冊的東西,其他頁面獲取的時候,要用 import {Xx} from ,或者import * as 自己起的名字 from 

 18、singer-datail.vue

刷新詳情頁的時候,因為沒有singer.id,容易要加這個判斷,返回到singer頁面。(小技巧)

19、singer-detail.vue

 

這塊定義musicData的時候,為什么要用{musicData}?

item:是這樣的

一個object里面包含一個musicData的object,這個項目我們只需要musicData,所以可以這樣定義:{musicData}

20、music-list.vue

這塊為什么要用this.$refs.list.$el.style.top這種方法

因為this.$refs.list是Vuecomponent

使用了$el,才能返回dom,,才可以用來設置style

21、music-list.vue

 

如果this.$refs.layer是dom。要設置style,上面這倆種方式都可以

22、dom.js

在script里面設置style,我們需要兼容各種瀏覽器,為了不需要重復寫代碼,在dom.js里面封裝了相應的方法

 1 let vendor = (() => {
 2   let transformNames = {
 3     webkit: 'webkitTransform',
 4     Moz: 'MozTransform',
 5     O: 'OTransform',
 6     ms: 'msTransform',
 7     standard: 'transform'
 8   }
 9   for (let key in transformNames) {
10     if (elementStyle[transformNames[key]] !== undefined) {
11       return key
12     }
13   }
14   return false
15 })()
16 export function prefixStyle (style) {
17   if (vendor === false) {
18     return false
19   }
20 
21   if (vendor === 'standard') {
22     return style
23   }
24 
25   return vendor + style.charAt(0).toUpperCase() + style.substr(1)
26 }

如何使用

music-list.vue

1 const transform = prefixStyle('transform')
2 
3 this.$refs.layer.style[transform]=`translate3d(0,${translateY}px,0)`

 23、切記mapMutations是{},mapActions是[]

 24、play.vue

   解析里面的值:

//      獲取初始位置和初始縮放比例
      _getPosAndScale () {
        const targetWidth = 40 // mini左側圖標大小
        const paddingLeft = 40 // mini左側圖標距離左側的長度
        const paddingBottom = 30 // mini左側圖標距離底部的長度
        const paddingTop = 80 // nomal唱片距離頭部的長度
        const width = window.innerWidth * 0.8 // nomal唱片一半的寬度
        const scale = targetWidth / width
        const x = -(window.innerWidth / 2 - paddingLeft)
        const y = window.innerHeight - paddingTop - width / 2 - paddingBottom
        return {
          x,
          y,
          scale
        }
      },

 

1是targetWidth  2是paddingBottom  3是paddingLeft   4是paddingTop  5是X  6是Y

 25、play.vue

這部分講的是如何用vue鈎子實現css動畫(以后可以看)

26、play.vue

快速點擊上一首、下一首的時候,會出現上面的錯誤,這是因為audio標簽里面有play(從加載到播放執行)和error(url錯誤或者由於昂羅問題沒有url執行)倆個方法

解決辦法是:

給audio綁定play和error方法,定義一個songReady變量,在ready和error里面,修改songReady的值

26、play.vue 

1  let index = list.findIndex((item) => {
2           return item.id === this.currentSong.id
3         })

數組findIndex(條件)傳入一個測試條件,符合就返回相應的Index

鏈接:http://www.runoob.com/jsref/jsref-findindex.html

27、common.js/song.js

1 getLyric () {
2     getLyric(this.mid).then((res) => {
3       if (res.retcode === ERR_OK) {
4         this.lyric = Base64.decode(res.lyric)
5         console.log(this.lyric)
6       }
7     })
8   }

后台返回的res.lyric是base數據,所以我們用js-base64這個插件來解析

     https://github.com/dankogai/js-base64

28、解析歌詞的插件 lyric-parser

     https://github.com/ustbhuangyi/lyric-parser

 29、Vue.mixin 全局注冊  

    

       當出現這個的 時候,列表的bottom值為60,為了實現這個,新建了一個mixin.js,然后在需要的vue里面調用

       api:https://cn.vuejs.org/v2/api/#Vue-mixin

30、search-box.vue組件的debounce方法

      當我們在輸入框輸入內容的時候,會自動調用search方法查詢數據,這是有點不合理的,優化的方式是添加一個debounce方法

      思路是:這個方法里面加了一個延遲執行,在延遲里面調用search方法,這樣在快速輸入的時候,就不會沒輸入一個值都查詢后台數據了

31、cache.js

       localstorage和sessionstorage保存的是字符串,如果想保存數組,可以使用插件storage

       地址:https://github.com/ustbhuangyi/storage

32、state.js中,我們定義的state既可以使用默認的值,也可以調用方法,從之前保存的地方獲取,比如localstorage

 33、playlist.vue組件,外層綁定了click事件,內層點擊也會觸發,解決辦法是在最靠近外層的那一層添加一行代碼 :@click.stop  

34、playlist.vue組件,列表改變時的動畫,用transtion-group,比如之前的ul列表,可以改成<transition-group name="和transition一樣"  tag="ul(渲染)">,li要指定一個key值,用來區分不同的li     

參考地址:http://blog.csdn.net/wngzhem/article/details/53841640

35、switches.vue組件,這是一個基礎組件,基礎組件不做任何邏輯操作,都是通過emit把值傳給父主組件,父組件邏輯操作以后,把值傳給基礎組件

36、新接口: https://github.com/ustbhuangyi/vue-music/issues/136


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM