在singer.vue中,点击某一歌手,根据路由跳转到singer-detail.vue

在vue-muscie:singer.vue页面的5.数据序列化后传入list-vue中相关逻辑

selectSinger(singer) {

//导航至singer-detail.vue页面

this.$router.push({

path: `/singer/${singer.id}`

})

//同时,将singer的信息放入vuex中

this.setSinger(singer)

},

由于singer-detail.vue页面具有共同性,因此封装成一个组件music-list.vue

1.singer-detail.vue

这个组件比较简单,一个壳子,获取数据传入组件

1.1获取数据

_getDetail() {

//如果在歌手详情页面刷新,无法获取singer.id,则直接返回歌手列表页面

if (!this.singer.id) {

this.$router.push('/singer')

}

getSingerDetail(this.singer.id).then((res) => {

if (res.code === ERR_OK) {

this.songs = this._normallizeSongs(res.data.list)

}

})

},

1.2 获取的数据序列化

_normallizeSongs(list) {

let ret = []

list.forEach((item) => {

let {musicData} = item

if (musicData.songid && musicData.albummid) {

ret.push(createSong(musicData))

}

})

return ret

}

这里使用createSong,创建一个song实例

2.music-list.vue

这个组件需求:

背景图 bgImage

标题title

歌手详情数据songs

2.1 页面

组件需要接收的数据props

props: {

bgImage: { //背景图片

type: String,

default: ''

},

songs: { //歌手详情数据songs

type: Array,

default: () => []

},

title: { //标题title

type: String,

default: ''

},

}

背景图片的利用:style 和 computed

computed: {

bgStyle() {

return `background-image:url(${this.bgImage})`

}

},

2.2 滚动列表

根据歌手查询到歌曲列表,需要滚动scroll.vue

@scroll="scroll" //需要派发滚动位置,触发的事件

:probe-type="probeType" //不需要截流

:listen-scroll="listenScroll" //派发滚动位置

:data="songs" //接收数据,初始化scroll

class="list"

ref="list">

2.3 滚动需求

为了能让他向上滚动,初始化的时候列表设置top值

mounted() {

//背景图图片的高度

this.imageHeight = this.$refs.bgImage.clientHeight

//滚动的边界:滚动到此 背景图片 ——(减去) 顶部title的高度

this.minTranslateY = -this.imageHeight + RESERVED_HEIGHT(40)

//初始化的时候列表设置top值:为了列表向上滚动而进行traslate3d

this.$refs.list.$el.style.top = `${this.$refs.bgImage.clientHeight}px`

},

左侧滚动

触发滚动事件

scroll(pos) {

this.scrollY = pos.y

},

监听滚动位置scrollY

watch: {

scrollY(newY) {

//往上滑动newY是负数 translateY往上移动是负数

//没有滑到临界值的时候translateY=newY 滑动顶部40的时候translateY=this.minTranslateY

let translateY = Math.max(this.minTranslateY, newY)

this.$refs.layer.style['transform'] = `translate3d(0, ${translateY}px,0)`

this.$refs.layer.style['webkitTransform'] = `translate3d(0, ${translateY}px,0)`

let zIndex = 0

//缩放

let scale = 1

//比例

let perscent = Math.abs(newY / this.imageHeight)

//高斯模糊

let blur = 0

//下拉的时候

if (newY > 0) {

scale = 1 + perscent

zIndex = 10

} else {

//上滑的时候:高斯模糊

blur = Math.min(20 * perscent, 20)

}

if (newY < this.minTranslateY) {

//上滑 `过` 临界值的时候,背景图片相应改变,按钮消失

zIndex = 10

this.$refs.bgImage.style.paddingTop = 0

this.$refs.bgImage.style.height = `${RESERVED_HEIGHT}px`

this.$refs.playButton.style.display = 'none'

} else {

//下滑 `未过` 临界值的时候

this.$refs.bgImage.style.paddingTop = '70%'

this.$refs.bgImage.style.height = '0'

this.$refs.playButton.style.display = ''

}

this.$refs.bgImage.style.zIndex = zIndex

//为什么从顶部显示scale缩放:因为下面的CSS .bg-image中 transform-origin: top

//下拉的时候放大效果

this.$refs.bgImage.style[transform] = `scale(${scale})`

//高斯模糊 IOS

this.$refs.bgImage.style[backdrop] = `blur(${blur}px)`

}

},

3.浏览器前缀

在使用transform以及back-drop的时候,需要根绝浏览器添加一些前缀,封装成方法调用

let elementStyle = document.createElement('div').style

//自执行函数:浏览器兼容的前缀

let vender = (() => {

const tranforNames = {

webkit:'webkitTransfrom',

Moz:'MozTransfrom',

O:'OTransfrom',

ms:'msTransfrom',

standard:'standard'

}

for(let key in transforNames){

if(elementStyle[transfromNames[key]] !== undefined){

return key

}

}

return false

})()

export function prefixStyle(style){

if(vendor === false){

return false

}

if(ventor === 'standard'){

return style

}

return vendor + style.charAt(0).toUpperCase() + style.substr(1)

}

在music-list.vue中引入

const transform = prefixStyle('transform')

4.song-list.vue

列表很常见,封装成组件song-list.vue

传入songs数据

功能:展示数据,传出点击的数据

  • {{song.name}}

    {{getDesc(song)}}

methods:{

getDesc(song) {

return `${song.singer} . ${song.album}`

},

selectItem(item, index) {

this.$emit('select', item, index)

},

}

music功能 vue_vue_music:歌手详情页相关推荐

  1. vue音乐项目歌手详情页小结

    技术栈 1,vue 2,vuex 3,vue-router(子路由) 需求分析 1)歌手列表点击歌手会跳转到下级页面歌手详情页,歌手详情页由四个部分组成 歌手图片 返回按钮:点击返回歌手tab页 随机 ...

  2. 第6章 歌手详情页开发

    包括子路由的配置及转场动画实现.Vuex 的介绍.Vuex 初始化歌手数据的配置.歌手详情页数据抓取和处理.Song 类的封装.music-list 组件开发. 6-1 歌手详情页布局和设计详解 6- ...

  3. 新闻管理的删除功能+新闻首页+详情页

    新闻管理的删除功能+新闻首页+详情页 1.删除功能: 在NewService中增加deleteNew接口: void deleteNew(Long id); 在NewServiceImpl中实现: @ ...

  4. 互联网早报:淘客APP开放新功能 增加定制详情页及私域购物车...

    行业热点 1.淘客APP开放新功能 增加定制详情页及私域购物车: 2.荣耀俱乐部 App 即将上线:荣耀产品相关内容.活动随后迁移: 3."高途课堂"于近日开始无偿接收优胜教育旗下 ...

  5. 微信小程序之网易云音乐(四)- 排行、歌手及歌手详情页模块开发

    微信小程序之网易云音乐(四)- 排行.歌手及歌手详情页模块开发 一. 排行模块开发 二. 歌手模块开发 三. 歌手详情页开发 微信小程序之网易云音乐导航 一. 排行模块开发 rank.vue文件: & ...

  6. SpringBoot--网上商城项目(自定义的参数解析器、购物车后台前台功能、商品详情页)

    目录 一.自定义的参数解析器 关于Mybatis-plus时间字段代码生成问题 报错信息:Caused by: java.lang.IllegalStateException: No typehand ...

  7. 微服务项目实战技术点汇总:“尚硅谷的谷粒在线教育”九、整合阿里云视频播放器、课程评论功能、讲师详情页、课程详情页、检索功能、课程和讲师列表功能

    文章目录 一.讲师 1.分页查询接口(后端) 1.controller 2.service 3.测试 2.分页显示讲师(前端) 3.讲师详情页(后端) 1.controller 2.测试 4.讲师详情 ...

  8. 歌手详情页:下拉方大歌手图片

    1.缩放图片: 1 // 背景图片的缩放 2 let scale = 1 3 const percent = Math.abs(newY/this.imageHeight)//这么计算,图片的高度相当 ...

  9. uni-app实战之社区交友APP(8)搜索列表页和文章详情页开发

    文章目录 前言 一.搜索列表页开发 1.搜索类型传递和占位符设置 2.搜索功能实现 二.帖子详情页开发 1.pages.json配置和页面通信 2.公共列表组件功能优化 3.详情页关注和顶踩功能完善 ...

最新文章

  1. 硕士Nature一作谈回乡当公务员:考公竞争激烈,科研经历是宝贵财富
  2. argparse subparsers()
  3. PHP代码程序,php代码自动执行
  4. keil查看程序运行时间_Keil系列教程05_工程目标选项配置(一)
  5. Nginx静态资源盗链的效果展示
  6. 为人示弱,做事留余 | 摸鱼系列
  7. linux模块创建proc,[Linux 运维]/proc/modules 以及内核模块工具
  8. [转载] Python利用openpyxl模块读取excel文件内容
  9. Netty高性能之道
  10. java网页版斗地主_JAVA控制台版斗地主
  11. 二进制和十进制的转换
  12. 龙卷风收音机android安卓版,龙卷风收音机安卓版
  13. MongoDB从入门到熟悉
  14. linux怎么越狱苹果手机,如何在苹果手机使用unc0ver越狱
  15. 使用Microsoft.Office.Interop.Excel批量编辑Excel文件
  16. 先帝爷下南阳御驾三请,联东吴灭曹魏鼎足三分~~~
  17. lyapunov直接法
  18. 读ICCV Best Student Paper有感
  19. 你真的能解释工厂模式吗?不屑解释工厂模式的大牛不是真牛
  20. 树莓派救援机器人制作

热门文章

  1. 计蒜之道 测试赛 (BCD)
  2. rgb 与 #开头16进制 HEX颜色值关系转换,颜色值透明度的百分数对应十六进制表
  3. 用R语言画相关性矩阵,带P值和*号
  4. Ceph剖析:Leader选举
  5. 复数辐角主值个人理解
  6. 普及游戏:小型团队如何赢得大赛
  7. mysql escape python_Python 操作 MYSQL
  8. 宁夏召开外派教师家属新春慰问座谈会
  9. [图] Google 迎来全新 Logo 启用无衬线字体
  10. 服务拆分理论和原理及方法