【Vue3网易云音乐项目实战教程】五、首页功能的实现(2)

284 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

前言

上节课我们实现了用户的登录,接下来我们继续来完善剩下的首页功能。首页的各个模块的逻辑基本一致,请求数据渲染到页面上来。

本节实现功能

  1. 热门歌单
  2. 新碟上架
  3. 排行榜
  4. 最新MV
  5. 热门电台
  6. 热门歌手

热门歌单

20220521091612.jpg

// HOT playlist.js
import { getCurrentInstance, onMounted, reactive } from 'vue';

export function hotPlayList() {
    const { proxy } = getCurrentInstance();

    const playlist_info = reactive({
        tags: [],  // 热门标签列表
        lists: [], // 歌单列表
        index: 0,  // 当前选中标签
        loading: true,
        params: { limit: 6, offset: 0 }
    });

    // 获取热门推荐歌单标签
    const getHotTags = async() => {
        const { data: res } = await proxy.$http.hotPlayList()

        if (res.code !== 200) {
            return proxy.$msg.error('数据请求失败')
        }

        res.tags.unshift({ name: '为您推荐' })
        playlist_info['tags'] = res.tags.splice(0, 6);
    };

    // 切换热门推荐歌单标签
    const choosePlayListTag = (index) => {
        playlist_info['index'] = index;
        playlist_info['params']['cat'] = index !== 0 ? playlist_info['tags'][index].name : '';
        playlist_info['loading'] = true;
        getPlayList(playlist_info['params']);
    }

    // 分类歌单列表
    const getPlayList = async(params) => {
        const { data: res } = await proxy.$http.playList(params)

        if (res.code !== 200) {
            return proxy.$msg.error('数据请求失败')
        }

        playlist_info['lists'] = res.playlists;
        playlist_info['loading'] = false;
    }

    onMounted(() => {
        getHotTags();
        getPlayList(playlist_info['params']);
    });

    return {
        playlist_info,
        choosePlayListTag
    }
}

首页的这个歌单模块,在全部歌单列表里我们需要复用,需要抽取出来。


<!-- 首页热门歌单代码片段 --> 
<div class="card">
    <div class="card-title">
        <h3>热门推荐</h3>
        <span v-for="(item, index) in playlist_info.tags" :key="item.id" :class="{'active': index == playlist_info.index}" @click="choosePlayListTag(index)">{{item.name}}</span>
    </div>
    <div class="card-body">
        <play-list :playList="playlist_info.lists" :loading="playlist_info.loading" :num="playlist_info.params.limit"></play-list>
    </div>
</div>

同理可得,首页里的新碟上架、排行榜、最新MV、热门电台、热门歌手模块,逻辑交互基本一致,我就不水篇幅贴代码了,对新手来说没有难点,可以跟着上述热门歌单的代码,自行模仿一遍即可,当做课后练习,自己动手实现出来。也可以下载代码,自行对比。

新碟上架

AF9A773C-D716-4EDC-8544-D68E20A37AE7.png

排行榜

20220521095731.jpg

目前排行榜模块这里有两个地方还需要待优化和完善。第一个就是初次刷新加载的时候,列表的高度没有撑起来,数据加载成功后,高度会撑开,影响不大,但是一个成熟的网站,唔,有点儿不好看;第二个就是需要完善,将歌曲添加到列表和添加到收藏夹的功能。

最新MV

20220521095750.jpg

热门电台&热门歌手

20220521095812.jpg

课后总结

这节我们实现了首页热门歌单、新碟上架、排行榜、MV电台歌手等功能模块,目前首页的开发暂时告一段落,基本实现了网站首页页面的数据渲染,后续我们可以继续完善相关的功能。

一键三连,努力变得更强!!!