滚动列表是一个基础组件  他是基于scroll组件实现的

在base文件夹下面创建一个list-view文件夹 里面有list-view.vue组件

 
 

<template>
<!-- 当父组件传递给子组件的数据发生变化的时候 scroll可以监听到此时高度会发生变化 -->
<!-- 子组件这里的:data和props里面的data相对于 -->
<!-- 父传子的时候 data是对应的props里面的值 -->
<scroll class="listview" :daaaaa="data" >
<!-- scroll插件作用于第一个子元素 ul--> <!-- 父元素传来的data数组的形式是[{title:"热门",items:Array(3)},{title:"A",items:Array[4]}] -->
<!-- 外层的ul下的li 代表每一个title对应的items -->
<ul>
<!--这里面的每一个li 是代表一个组别 比如热门歌手组别 姓氏为A的组别 姓氏为B的组别等等 -->
<li v-for="(group,index) in data" class="list-group" :key="index">
<h2 class="list-group-title">{{group.title}}</h2>
<!-- 内层的ul下的li 代表每一个title对应的items下的Array里面的内容 -->
<ul>
<!-- 这里面的每一个li代表每个组别里面的每一位歌手 -->
<li v-for="(item,index) in group.items" class="list-group-item" :key="index">
<img v-lazy="item.avatar" class="avatar">
<span class="name">{{item.name}}</span>
</li>
</ul>
</li>
</ul>
</scroll>
</template>
<script> //因为是滚动列表 所以导入Scroll组件
import Scroll from '../scroll/scroll.vue' export default { // 接受父盒子传入的数据
props:{
data:{
type:Array,
default:[]
}
},
components:{
Scroll
}
}
</script>
<style lang="stylus" scoped>
@import '../../common/stylus/variable.styl'
.listview
position: relative
width: 100%
height: 100%
overflow: hidden
background: $color-background
.list-group
padding-bottom: 30px
.list-group-title
height: 30px
line-height: 30px
padding-left: 20px
font-size: $font-size-small
color: $color-text-l
background: $color-highlight-background
.list-group-item
display: flex
align-items: center
padding: 20px 0 0 30px
.avatar
width: 50px
height: 50px
border-radius: 50%
.name
margin-left: 20px
color: $color-text-l
font-size: $font-size-medium
</style>

在singer.vue中

<template>
<!-- better-scroll的滚动条件是:父容器的高度是固定的
子容器要撑开他 所以这个fixed布局是为了固定父容器的高度
-->
<div class="singer">
<!-- 这个singer类就相当于是scroll的父类元素 -->
<!-- 给子组件传递值 singers -->
<!-- 给data加上:data 说明后面跟的singers是变量 -->
<!-- 父组件真正传递的值是singers -->
<list-view :data="singers"></list-view>
</div>
</template>
<script> import ListView from '../../base/listview/listview.vue'
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=this._normalizeSinger(res.data.list)
console.log(this._normalizeSinger(res.data.list))
}
})//虽然这个方法可以返回数据 但并不是我们想要的
//按照需求 我们应该得到热门歌手数据 和 可以根据歌手的姓氏
//来查找到该歌手 于是我们在写一个方法来操作这个方法得到的数据
},
_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) // 为了得到有序列表 处理map
let hot=[]
let ret=[]
for(let key in map){//map是对象也可以用for in 遍历来做
let val=map[key] //这里是map对象的key键对应的键值
if(val.title.match(/[a-zA-Z]/)){
ret.push(val)
}else if(val.title==="热门"){
hot.push(val)
}
} //为了要让ret里面的数据是按字母升序排列 那么我们可以
ret.sort((a,b)=>{
// 因为ret数组中的数是对象 所以要比较两个对象的title的首字母的大小来判断顺序
return a.title.charCodeAt(0)-b.title.charCodeAt(0)
}) return hot.concat(ret);
}
},
components:{
ListView
}
}
</script>
<style lang="stylus" scoped>
.singer
position: fixed
top: 88px
bottom: 0
width: 100% </style>

用Vue来实现音乐播放器(十六):滚动列表的实现的更多相关文章

  1. 用Vue来实现音乐播放器(六):JSONP的封装

    在npm上下载jsonp的包 这个包的用法 传入的参数是地址加上地址参数的混合  但是想封装一个将地址和地址参数分别传入的jsonp方法 所以来封装一个 import originJSONP from ...

  2. vue小练习--音乐播放器

    1 首先建一个文件夹 放几首歌曲 2 看代码 1)基本版本 <!DOCTYPE html> <html lang="zh-CN"> <head> ...

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

    1.频繁切换歌曲时,歌词会跳来跳去 原因: // 歌词跳跃是因为内部有一个currentLyric对像内部有一些功能来完成歌词的跳跃 //每个currentLyric能实现歌曲的播放跳到相应的位置 是 ...

  4. Vue实战:音乐播放器(一) 页面效果

    先看一下效果图 首页 歌单详情页 歌手列表 歌手详情页 排行页面 榜单的详情页(排序样式) 搜索页面 搜索结果 播放器内核 歌词自动滚动 播放列表 用户中心

  5. 用Vue来实现音乐播放器(十七):歌手页右侧快速入口实现

    快速入口的列表是其实是之前处理的歌手的数据中的关于title的列表 shorcutList属性是计算属性   通过ret数组中的title计算到的 所以我们要在singer.vue组件中将数据传入到l ...

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

    state:所有组件的所有状态和数据  放入同一个内存空间去管理 我们把它称为state Vue Components:state里面的数据可以方便的映射到组件上 然后渲染组件 Actions:当组件 ...

  7. 用Vue来实现音乐播放器(十八):右侧快速入口点击高亮

    问题一:当我们点击右侧快速入口的时候  被点击的地方高亮 首先我们要知道右侧快速入口是为什么高亮??因为当watch()监控到scrollY的变化了的时候  将scrollY的值和listHeight ...

  8. 用Vue来实现音乐播放器(十四):歌手数据接口抓取

    第一步:在api文件夹下创建一个singer.js文件 返回一个getSingerList()方法  使他能够在singer.vue中调用 import jsonp from '../common/j ...

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

    1.歌单详情页是推荐页面的二级路由页面 将推荐页面歌单的数据传到歌曲详情页面  利用vuex 1.首先在state下定义一个歌单对象 disc{} 2.在mutaions-types中  定义一个别名 ...

随机推荐

  1. Python 入门之编码

    Python 入门之编码 1.编码初识: (1)ASCII码 :256 个 英文1个字节,不支持中文 (2)GBK(国标) : 英文1个字节 中文两个字节 (3)unicode (万国码):英文4个字 ...

  2. HNUSTOJ-1253 Babelfish(字典树)

    1253: Problem C: Babelfish 时间限制: 1 Sec  内存限制: 128 MB提交: 14  解决: 3[提交][状态][讨论版] 题目描述 Problem C: Babel ...

  3. WNMP环境搭建步骤 nginx1.4.3+php-5.3.27+mysql-5.5+RunHiddenConsole

    安装目录:D:/webServer/所需软件:     mysql-installer-community-5.5.34.0.msi         下载:http://cdn.mysql.com/D ...

  4. Dire Wolf——HDU5115(区间DP)

    题意 就是有一对狼,每个狼有初始的攻击力,并且还能给左右两边的狼提供攻击力加成,当冒险家杀死一头狼的时候他也会受到这个狼目前攻击力的伤害 实例解析 33 5 78 2 0 有三头狼,刚开始第二头狼给他 ...

  5. 使用Log4Net将系统日志信息记录到记事本和数据库中

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/hxpjava1/article/details/32714855 一.使用Log4Net将日志记录到 ...

  6. 利用CSS的translate属性或利用CSS实现图片居中的效果

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 封装class类--不分割类名

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. APP元素定位工具weditor

    github地址https://github.com/openatx/weditor python -m weditor --shortcut adb devices 在页面上输入手机设备号,点Con ...

  9. [转载]转一篇Systemverilog的一个牛人总结

    原文地址:转一篇Systemverilog的一个牛人总结作者:dreamylife Systemverilog 数据类型 l       合并数组和非合并数组 1)合并数组: 存储方式是连续的,中间没 ...

  10. 08java进阶——异常

    1.异常的概念 package cn.jxufe.java.chapter08.demo01; public class Test01ArithmeticException { public stat ...