用Vue来实现音乐播放器(十四):歌手数据接口抓取

第一步:在api文件夹下创建一个singer.js文件 返回一个getSingerList()方法  使他能够在singer.vue中调用

import jsonp from '../common/js/jsonp.js'
import {commonParams,options} from './config.js'
export function getSingerList() {
    const url = 'https://c.y.qq.com/v8/fcg-bin/v8.fcg'
  
    const data = Object.assign({}, commonParams, {
      channel: 'singer',
      page: 'list',
      key: 'all_all_all',
      pagesize: 100,
      pagenum: 1,
      hostUin: 0,
      needNewCode: 0,
      platform: 'yqq'
    })
  
    return jsonp(url, data, options)
  }

第二步:在singer.vue中引入getSingerList方法  并且在created()中调用此方法 加载数据

<template>
    <!-- better-scroll的滚动条件是:父容器的高度是固定的
        子容器要撑开他  所以这个fix布局是为了固定父容器的高度
     -->
    <div class="singer">
       
    </div>
</template>
<script>

import {getSingerList} from '../../api/singer.js'
import {ERR_OK} from '../../api/config.js'
import Singer from '../../common/js/singer.js'

const HOT_NAME="热门" //由于页面布局是热门 然后下面是数组
// 将取到的this.singer数据中的前10条定义为热门数据
const HOT_SINGER_LEN=10

export default {
    data(){
        return {
            singers:[]
        }
        
    },
    created(){
        this._getSingerList()
    },
    methods:{
        _getSingerList(){
            getSingerList().then((res)=>{
                if(res.code===ERR_OK){
                    // console.log(res.data)
                    this.singers=res.data.list
                    console.log(this._normalizeSinger(this.singers))
                }
            })//虽然这个方法可以返回数据  但并不是我们想要的
                //按照需求  我们应该得到热门歌手数据 和 可以根据歌手的姓氏
                //来查找到该歌手  于是我们在写一个方法来操作这个方法得到的数据  
        }
    }
}

第三步:由于简单的获取数据已经不符合我们的需求了 我们需要处理之前获取到的数据  分出来热门数据以及 将各个姓氏的数据进行分类

<template>
    <!-- better-scroll的滚动条件是:父容器的高度是固定的
        子容器要撑开他  所以这个fix布局是为了固定父容器的高度
     -->
    <div class="singer">
       
    </div>
</template>
<script>

import {getSingerList} from '../../api/singer.js'
import {ERR_OK} from '../../api/config.js'
import Singer from '../../common/js/singer.js'

const HOT_NAME="热门" //由于页面布局是热门 然后下面是数组
// 将取到的this.singer数据中的前10条定义为热门数据
const HOT_SINGER_LEN=10

export default {
    data(){
        return {
            singers:[]
        }
        
    },
    created(){
        this._getSingerList()
    },
    methods:{
        _getSingerList(){
            getSingerList().then((res)=>{
                if(res.code===ERR_OK){
                    // console.log(res.data)
                    this.singers=res.data.list
                    console.log(this._normalizeSinger(this.singers))
                }
            })//虽然这个方法可以返回数据  但并不是我们想要的
                //按照需求  我们应该得到热门歌手数据 和 可以根据歌手的姓氏
                //来查找到该歌手  于是我们在写一个方法来操作这个方法得到的数据  
        },
        _normalizeSinger(list) {
            let map = {
                hot: {
                    title: HOT_NAME,
                    items: []
                }
            }
            list.forEach((item, index) => {
                if (index < HOT_SINGER_LEN) {
                        map.hot.items.push(new Singer({
                            name: item.Fsinger_name,
                            id: item.Fsinger_mid
                        }))
                }

                //将姓氏聚类
                const key = item.Findex
                if (!map[key]) {//判断此时map对象里面有没有key这个键
                                //如果没有的话  就给对象添加这个键值对
                    map[key] = {
                        title: key,
                        items: []
                    }
                }
                //举例:如果此时key为A
                //此时map只有一个键为hot 所以我们给map对象添加一个键为A 这个键A对应的值为{title:"A",items:[]}


                map[key].items.push(new Singer({
                    name: item.Fsinger_name,
                    id: item.Fsinger_mid
                }))

                //再执行push操作 给键A对应的键值中的items push值
                // 此时的map为 map={hot:{title:"热门",items:[]},A:{title:'A',items:[刚才新添加的值 即此时遍历到的item]}}
            })

            console.log('map......',map)
        }
    }
}
</script>
export default class Singer {//类似于构造函数
    constructor({id,name}){ //构造函数里面有constructor属性
        this.id=id
        this.name=name
        this.avatar=`https://y.gtimg.cn/music/photo_new/T001R300x300M000${id}.jpg?max_age=2592000`
    }
}

 最后的效果为:

 

posted @ 2018-06-11 17:39  mino1996  阅读(266)  评论(0编辑  收藏  举报