vue音乐项目歌手详情页小结
技术栈
1,vue
2,vuex
3,vue-router(子路由)
需求分析
1)歌手列表点击歌手会跳转到下级页面歌手详情页,歌手详情页由四个部分组成
歌手图片
返回按钮:点击返回歌手tab页
随机播放按钮
歌手歌曲滚动
2)歌曲栏向上滚动到顶部时,图片和播放按钮随之隐藏,保留歌手名和返回按钮
3)歌曲栏向下拖动时,歌手图片的高度作出无缝增高
新的组件
singer-detail.vuemusic-list.vuesong-list.vue
实现
1.vuex 在介绍子路由的实现前我们先来看vuex
这里写图片描述
在src文件夹下新建一个store文件夹,该文件夹下有多个js文件
actions.js涉及的异步操作getters.js store中定义的getter这里返回state里的singerexport const singer = state => state.singerindex.js 组装模块并导出mutation.js 跟级别的mutation
//使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名 import * as types from './mutation-types' const mutations = { [types.SET_SINGER](state, singer) { state.singer = singer } } export default mutationsmutation-type.js 对mutation作相应的映射state.js 定义store的state
1.子路由的实现
router文件夹下index.js配置歌手页的子路由
{ path: '/singer', component: Singer, children: [ { path: ':id', component: SingerDetail } ] }
singer.vue中使用vue-router
<template> <div class="singer" ref="singer"> <listview :data = "singers" @select="selectSinger"></listview> <router-view></router-view> </div> </template>
歌手页点击歌手时singer.vue 中通过@select接受子组件传递来的singer属性,@select="selectSinger"selectSinger方法根据singer.id实现子路由跳转
selectSinger(singer) { this.$router.push({ path: `/singer/${singer.id}` }) this.setSinger(singer) }
listview.vue歌手列表通过$emit方法传递出singer,这里的item代表每个singer
selectItem(item) { this.$emit('select', item) //console.log('item:' + item) }
2.歌手详情页的实现
歌手详情页实现用了以下组件
<singer-detail> <musci-list> ... <scroll> <song-list>...</song-list> <loading>...</loading> </scroll> </music-list> </singer-detail>
在Vue Devtools中可以清晰看到模板的结构。
singer.vue下有两个同级子组件分别为singer-detail和list-view,其中singer-detail组件是通过路由来切换的。
singer-detail组件下有music-list组件,这是歌手详情页组件,该组件下有scroll组件,scroll组件实现滚动,scroll组件下的song-list组件是歌手歌曲列表组件,loading组件是优化组件,当歌手歌曲还没有获取时显示正在加载,从而提高用户体验。
数据的获取与传递
歌手对应歌曲数据获取
src/api/singer.js通过getSingerDetail方法获取歌曲
export function getSingerDetail(singerId) { const url = 'https://c.y.qq.com/v8/fcg-bin/fcg_v8_singer_track_cp.fcg'const data = Object.assign({}, commonParams, { hostUin: 0, needNewCode: 0, platform: 'yqq', order: 'listen', begin: 0, num: 80, songstatus: 1, singermid: singerId })return jsonp(url, data, options) }
在singer-detail.vue组件中写了一个私有方法_getDetail用来获取歌手数据,singer.vue的data属性中维护了songs数组变量
data() { return { songs: []} } _getDetail() { if (!this.singer.id) { this.$router.push('/singer') return } console.log(this.singer) getSingerDetail(this.singer.id).then((res) => { if (res.code === ERR_OK) { console.log(res.data.list) this.songs = this._normalizeSongs(res.data.list) } }) }
_getDetail方法中使用了_normalizeSongs方法对请求到的数据进行处理,因为jsonp请求返回到的数据不是我们想要的,所以需要用此方法对数据进行处理。对请求返回到的数据返回一个songs数组,数组的每个元素代表每个song,其中song是一个类,这个类里面保留着歌曲的相关信息,如歌曲id,歌手姓名等等。
这是一个音乐app,后面还会涉及到歌曲的处理,所以出于代码可复用和可维护的角度来考虑,在common/js/song.js下创建了一个song Class,并创建了一个createSong工厂方法在传入参数后直接返回一个new song
_normalizeSongs(list) { let ret = [] list.forEach((item) => { let {musicData} = item if (musicData.songid && musicData.albummid) { ret.push(createSong(musicData)) } }) return ret }
common/js/song.js
export default class Song { constructor({id, mid, singer, name, album, duration, image, url}) { this.id = id this.mid = mid this.singer = singer this.name = name this.album = album this.duration = duration this.image = image this.url = url } } export function createSong(musicData) { return new Song({ id: musicData.songid, mid: musicData.songmid, singer: filterSinger(musicData.singer), name: musicData.songname, album: musicData.albumname, duration: musicData.interval, image: `https://y.gtimg.cn/music/photo_new/T002R300x300M000${musicData.albummid}.jpg?max_age=2592000`, url: `http://ws.stream.qqmusic.qq.com/${musicData.songid}.m4a?fromtag=46` }) } function filterSinger(singer) { let ret = [] if (!singer) { return '' } singer.forEach((s) => { ret.push(s.name) }) return ret.join('/') }
最后在singer-detail组件的created阶段获取数据
created() { this._getDetail() }
上面我介绍了如何获取歌手详情页组件的相关数据,这些数据最终的目的是用来渲染的。
歌手图片实现
在需求分析中提到的歌手图片,这是一张宽高比为10:7的图片,我们在之前的博文中提到了如何实现宽高比相等的图片,这里解决思路一样
music-list.vue中stylus
.bg-image position: relative width: 100% height: 0 padding-top: 70% transform-origin: top background-size: cover
歌手详情页歌手图片,歌手名,返回和播放按钮都是在music-list.vue中实现的(html,css),music-list下的子组件song-list维护了歌手歌曲列表。
点击图片返回效果实现,给按钮添加点击事件back
back() { this.$router.back() },
歌曲列表滚动效果实现
歌曲列表滚动效果使用了基础组件scroll组件,这里重点说明几个关键点,滚动中特效的实现利用了CSS3 transform的translate3d和scale方法
向上滚动实现图片隐藏效果
首先将scroll组件样式overflow:hidden去掉
给图片div层添加一个同级div class="bg-layer"
music-list组件data维护了scrollY并在watch中设置监听,当scrollY发生改变时触发相应事件
向下滚动实现图片放大(transform:scale)
具体代码重点scrollY
scrollY(newVal) { let translateY = Math.max(this.minTransalteY, newVal) let zIndex = 0 let scale = 1 let blur =0 const percent = Math.abs(newVal / this.imageHeight) if (newVal > 0) { scale = 1 + percent zIndex = 10 } else { blur = Math.min(20, percent * 20) } this.$refs.layer.style[transform] = `translate3d(0,${translateY}px,0)` this.$refs.filter.style[backdrop] = `blur(${blur}px)` if (newVal < this.minTransalteY) { zIndex = 10 this.$refs.bgImage.style.paddingTop = 0 this.$refs.bgImage.style.height = `${RESERVED_HEIGHT}px` this.$refs.playBtn.style.display = "none" } else { this.$refs.bgImage.style.paddingTop = '70%' this.$refs.bgImage.style.height = 0 this.$refs.playBtn.style.display = '' } this.$refs.bgImage.style[transform] = `scale(${scale})` this.$refs.bgImage.style.zIndex = zIndex }
CSS3transform属性浏览器兼容处理
let elementStyle = document.createElement('div').stylelet vendor = (() => { let transformNames = { webkit: 'webkitTransform', Moz: 'MozTransform', O: 'OTransform', ms: 'msTransform', standard: 'transform' }for (let key in transformNames) { if (elementStyle[transformNames[key]] !== undefined) { return key } }return false })()export function prefixStyle(style) { if (vendor === false) { return false }if (vendor === 'standard') { return style }return vendor + style.charAt(0).toUpperCase() + style.substr(1) }
调测反思
在项目调测过程中,我们要结合Vue Devtools,比如我们在获得歌曲数组时在singer-detail中console.log(this.songs)会发现无法看到具体内容
但在Vue Devtools中的singer-detail.vue组件的data中可以很清楚的看到songs数组
总结
子路由使用
滚动处理
边界处理
浏览器兼容性
代码复用和可维护性
转载于:https://www.cnblogs.com/catbrother/p/9179610.html
vue音乐项目歌手详情页小结相关推荐
- vue音乐项目歌手页面滚动、吸顶效果
总结singer页面: 1.api中去获取 ['热',A-Z] 以及根据['热',A-Z]获取的所有歌手的数据 2.渲染数据 2.1 渲染左边 字母title ['热',A-Z] + 该字母开头的歌手 ...
- 微信小程序之网易云音乐(四)- 排行、歌手及歌手详情页模块开发
微信小程序之网易云音乐(四)- 排行.歌手及歌手详情页模块开发 一. 排行模块开发 二. 歌手模块开发 三. 歌手详情页开发 微信小程序之网易云音乐导航 一. 排行模块开发 rank.vue文件: & ...
- vue项目实现详情页后退缓存之前的数据
vue项目实现详情页后退缓存之前的数据 2019年02月19日 14:54:57 不想写代码的程序员 阅读数:244 一.需要缓存的内容: 1.后退缓存条件查询的数据 2.后退缓存分页信息 二.实现 ...
- 第6章 歌手详情页开发
包括子路由的配置及转场动画实现.Vuex 的介绍.Vuex 初始化歌手数据的配置.歌手详情页数据抓取和处理.Song 类的封装.music-list 组件开发. 6-1 歌手详情页布局和设计详解 6- ...
- 微信小程序电商项目商品详情页开发实战之数据绑定与事件应用
各位CSDN的朋友,我们都知道,现在微信小程序电商平台特别火爆,所以我将以一个生鲜电商项目为例,为大家讲述微信小程序的实战化开发,价值几万元的成熟项目,你可千万不要错过哦. 大家直接通过视频链接直接看 ...
- 音乐歌单Android,[CloudReader]Android - 仿网易云音乐歌单详情页
前段时间模仿网易云音乐UI使用DataBinding做了一个App:CloudReader,今天把其中的类似歌单详情页单独拿出来说一下,我觉得其中还是有些干货的,关联到的知识点还比较有价值,而且也有很 ...
- music功能 vue_vue_music:歌手详情页
在singer.vue中,点击某一歌手,根据路由跳转到singer-detail.vue 在vue-muscie:singer.vue页面的5.数据序列化后传入list-vue中相关逻辑 select ...
- Django项目-商品详情页
商品详情页分析和准备 1.商品分类 2.面包屑 3.热销排行 4.商品名字.价格.数量.规格(颜色,内存,) 总价(和数量有关系) 5.商品详情 规格与包装 售后服务 6. 商品评价(完成下单后) 商 ...
- 仿网易云android界面,Android - 仿网易云音乐歌单详情页
前段时间模仿网易云音乐UI使用DataBinding做了一个App:CloudReader,今天把其中的类似歌单详情页单独拿出来说一下,我觉得其中还是有些干货的,关联到的知识点还比较有价值,而且也有很 ...
最新文章
- 维护人员的VMware日常工作
- pytorch focal loss
- python常用函数-python常用魔法函数
- CTF盲水印工具安装(排雷)
- iNeuOS工业互联网操作系统,顺利从NetCore3.1升级到Net6的过程汇报,发布3.7版本...
- js中的preventDefault与stopPropagation详解(转)
- Spring: @Import @ImportResource引入资源
- ASP.NET——上传文件超过了最大请求长度
- python与java区别-python(一):python与java语法的异同之处
- Java开发笔记(一百四十)JavaFX的选择框
- linux下编程出现 对'sem_wait'未定义的引用解决方案
- 【Javassist官方文档翻译】第一章 读写字节码
- 搜索引擎四:CoreSeek配置MySql数据源
- 2022年来啦!丨新年回馈粉丝丨免费抽奖!
- 解决Node.js中下包速度慢的问题
- 搜狗泛站怎么做?搜狗泛域名泛目录收录方法
- 2022年危险化学品经营单位主要负责人特种作业证考试题库及答案
- Attention-Based Recurrent Neural Network Models for Joint Intent Detection and Slot Filling论文笔记
- 【已解决】华为手机短接后有提示音但在其他设备里显示未知设备或者USB-SER怎么办 | 华为荣耀手机短接后未知设备里面出现“USB-SER” 端口如何解决
- iOS 更改webView文字颜色丶文字大小丶背景色的方法
热门文章
- 第九章 硬件抽象层:HAL 心得笔记
- [leetcode] Construct Binary Tree from Preorder and Inorder Traversal
- linux 套接字选项定义
- Pthread:POSIX Threads Programming
- Ubuntu 18.04 关闭蓝牙开机启动
- 重学ES6 函数的扩展(下)
- IDC: 高性能计算投入产出比高达44倍
- Extjs4 常用布局总结
- [Config]如何利用ConfigurationSettings.AppSettings.GetValues读取配置文件中多个同Key的value...
- 26.使用ajaxSetup()方法设置全局Ajax默认选项