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

最后的效果为:

原文地址:https://www.cnblogs.com/cmy1996/p/9168237.html

时间: 2024-10-31 13:07:26

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

Android开发本地及网络Mp3音乐播放器(十四)网络音乐下载功能实现

实现功能: 实现网络音乐搜索功能 实现网络音乐下载功能 下载好的音乐目前不在播放器内,可以通过文件浏览器查看. 后续将博文,将实现歌词和下载音乐扫描功能. 经过将近4天,才发布这一篇博客,明显更新博客速度变慢了,因为没有自己的音乐服务器,网络上的音乐网站在这边博客发表的2016年5月已经很难找到免费且在线下载的了,就算找到解析也是一个难题.如果你在练习同样功能的Demo,请尽快下载练习,因为博主也无法保证我Demo下载功能时效性,因为我解析的音乐网站可能分分钟修改网页源码!!! 截止到目前的源码

用Vue来实现音乐播放器(四十):歌单详情页布局以及Vuex实现路由数据通讯

1.歌单详情页是推荐页面的二级路由页面 将推荐页面歌单的数据传到歌曲详情页面  利用vuex 1.首先在state下定义一个歌单对象 disc{} 2.在mutaions-types中  定义一个别名 3.在mutations里面创建更改函数 4.在getters里面将该状态与组件映射 4.在recommed推荐主页引入mapMutations 5.在methods中去拓展mapMutations ...mapMutations({自定义函数名:' mutations-types中的别名 ' 

Android开发本地及网络Mp3音乐播放器(十八)新下载歌曲加载准备SdcardSearchToList

扫描本地文件加载到item 不限于应用到音乐播放器,其他Android工程,也可以使用SdcardSearchToList 其他Android工程也可以使用,我现在做了很小的Demo 后续将博文,将在播放器里,加入这一功能,来实现刚下载好的音乐,加载到播放器 这个Demo的源码下载: http://download.csdn.net/album/detail/3105 名称为:SdcardSearchToList,如果没有显示,可能还没有审核完成 不下载也可以,因为只有1个java文件,2个xm

用Vue来实现音乐播放器(三十八):歌词滚动列表的问题

1.频繁切换歌曲时,歌词会跳来跳去 原因: // 歌词跳跃是因为内部有一个currentLyric对像内部有一些功能来完成歌词的跳跃 //每个currentLyric能实现歌曲的播放跳到相应的位置 是因为它内部有个计时器 //每次currentSong改变的时候都会重新new一个新的lyric-parser出来, //但是我们之前的对象并没有做清理操作 也就是说我们之前对象还是有计时器在里面 //所以歌词会来回闪动 解决办法: 在切换歌曲之前 即getLyric()之前 重新去getLyric(

用Vue来实现音乐播放器(十六):滚动列表的实现

滚动列表是一个基础组件  他是基于scroll组件实现的 在base文件夹下面创建一个list-view文件夹 里面有list-view.vue组件   <template> <!-- 当父组件传递给子组件的数据发生变化的时候 scroll可以监听到此时高度会发生变化 --> <!-- 子组件这里的:data和props里面的data相对于 --> <!-- 父传子的时候 data是对应的props里面的值 --> <scroll class=&quo

Android开发本地及网络Mp3音乐播放器(十五)网络音乐及歌词下载功能实现

实现功能: 实现网络音乐歌词下载功能(下载音乐的同时,下载对应歌词) 下载好的歌词目前不在播放器内,可以通过文件浏览器查看. 后续将博文,将实现本地音乐歌词下载和已下载音乐扫描功能. 因为,没有自己的服务器,所以网络音乐所有相关功能(包含搜索音乐.下载音乐.下载歌词)均无法保证时效性,建议,尽快下载和练习:如果你下载时候,已经因为我采集的服务器更改规则,请给我留言,如果可以解决,我将在有空的时候献上新的源码. 截止到目前的源码下载: http://download.csdn.net/album/

VUE项目实现音乐播放器(四)------- 设计播放进度条 + 播放控制按钮

2020.3.31 9:18 好的,早上好各位,今天我们来进行一个很炫酷的页面开发——播放器控制页面( src\components\Play.vue ),如下图: 我们可以看到,该页面有很多元素组成,歌曲的封面.左上角的页面隐藏按钮,中间的播放进度条.歌词栏.下方的播放控制按钮.右下角的显示播放列表按钮,这些元素完美的结合在一起,整个页面有没有一种很高大上的感觉!好了,让我们来亲自动手实现它吧! 1. 歌曲封面&隐藏按钮 首先通过 getters 获取到歌曲的封面: computed: { i

Android开发本地及网络Mp3音乐播放器(十)最近播放界面与数据保存更新

实现功能: 实现MyLoveMusicActivity(音乐收藏界面) 实现MyRecordMusicActivity(最近播放界面) 实现MyMusicListFragment(本地音乐界面)ItemClick事件发生后,切换到PlayActivity(独立音乐播放界面)只播放 本地音乐. 实现MyLoveMusicActivity(音乐收藏界面)ItemClick事件发生后,切换到PlayActivity(独立音乐播放界面)只播放 音乐收藏. 实现MyRecordMusicActivity(

用Vue来实现音乐播放器(二十):Vuex初始化及歌手数据的配置

state:所有组件的所有状态和数据  放入同一个内存空间去管理 我们把它称为state Vue Components:state里面的数据可以方便的映射到组件上 然后渲染组件 Actions:当组件的数据发生变化的时候 它可以通过Dispatch一个Actions 然后Actions可以做一些异步操作 比如与后端的一些交互  然后它可以取commit一个mutations 注意:我们也可以在组件中直接commit一个mutations Mutations:是唯一可以修改State的途径  其他