• 用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`
        }
    }

     最后的效果为:

  • 相关阅读:
    总结Cnblogs支持的常用Markdown语法
    Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
    我的博客今天开通了,请多指教!
    技术分析:Femtocell家庭基站通信截获、伪造任意短信
    数据库防火墙如何防范SQL注入行为
    Pjax.js防刷新技术
    【写给新人】做开发几年的个人经历
    WebRTC之PeerConnection的建立过程
    基于Licode demo的屏幕共享功能的实现
    基于WebRTC的MCU开源项目Licode的环境搭建
  • 原文地址:https://www.cnblogs.com/cmy1996/p/9168237.html
Copyright © 2020-2023  润新知