scroll组件

制作scroll 组件,然后嵌套一个 DOM 节点,使得该节点就能够滚动。该组件中需要引入 BetterScroll 插件。

scroll.vue:

<template>
<div ref="wrapper">
<slot></slot>
</div>
</template> <script>
import BScroll from 'better-scroll'; export default {
name: 'scroll',
props: {
probeType: {
type: Number,
default: 1,
},
click: {
type: Boolean,
default: true,
},
listenScroll: {
type: Boolean,
default: false,
},
data: {
type: Array,
default: null,
},
},
mounted() {
setTimeout(() => {
this._initScroll();
}, 20);
},
methods: {
_initScroll() {
if (!this.$refs.wrapper) {
// eslint-disable-next-line no-useless-return
return;
}
this.scroll = new BScroll(this.$refs.wrapper, {
probeType: this.probeType,
click: this.click,
});
if (this.listenScroll) {
let me = this;
this.scroll.on('scroll', (pos) => {
me.$emit('scroll', pos);
});
}
},
disable() {
this.scroll && this.scroll.disable();
},
enable() {
this.scroll && this.scroll.enable();
},
refresh() {
this.scroll && this.scroll.refresh();
},
},
watch: {
data() {
setTimeout(() => {
this.refresh();
}, this.refreshDelay);
},
},
};
</script>

在 recommend 组件中引入 scroll 组件:

<scroll ref="scroll" class="recommend-content" :data="discList">
<div>
<div class="slider-wrapper" v-if="recommends.length">
...
</div>
</scroll> import Scroll from '../../base/scroll/scroll'; components: {
Slider,
Scroll,
},

注意:在 discList 数据渲染之前,scroll 组件所包裹的 DOM 节点是没有高度的,页面是无法滚动的,所以需要绑定数据,当discList 数据渲染后,scroll组件监听并调用refresh()方法才能使页面滚动。

由于轮播图和推荐歌单是两个不同接口返回的数据并且异步请求返回数据的时间点并不一致,scroll组件所监听到的数据就会不完整,所计算的DOM高度就偏小,会导致页面无法滚动或滚动不完整。

解决方法:

在图片中添加 loadImage 事件,当图片加载时就重新调用 scroll 组件的 refresh() 方法,重新计算 DOM 的高度,轮播图的图片有多张,每张图片加载后就会重新调用 refresh() 方法
<a :href="item.jumpurl">
<img class="needsclick" @load="loadImage" :src="item.picurl" >
</a> loadImage() {
if (!this.checkLoaded) {
this.$refs.scroll.refresh();
this.checkLoaded = true;
} },

图片懒加载

对于图片过多的页面,为了加速页面加载速度,需要将页面内未出现的可视区域内的图片先不加载,等到滚动到可视区的时候再去加载,也就是图片懒加载。

图片懒加载需要用到 vue-lazyload 插件

// main.js

import VueLazyLoad from 'vue-lazyload'

Vue.use(VueLazyLoad, {
loading: require('common/image/default.png')
}) // recommend.vue <img width="60" height="60" v-lazy="item.picUrl">

效果图:

Loading组件

loading.vue:

<template>
<div class="loading">
<img src="./loading.gif" alt="" width="24" height="24">
<p class="desc">{{title}}</p>
</div>
</template> <script>
export default {
name: 'loading',
props: {
title: {
type: String,
default: '正在载入……',
},
},
};
</script> <style lang="scss" scoped>
.loading {
width: 100%;
text-align: center; .desc {
line-height: 20px;
font-size: $font-size-small;
color: $color-text-l;
}
}
</style>

在recommend.vue中使用loading组件:

<div class="loading-container" v-show="!discList.length">
<loading></loading>
</div> import Loading from '../../base/loading/loading'; components: {
Slider,
Scroll,
Loading,
},

效果图:

参考文章:https://www.jianshu.com/p/b7a61470b79d

VUE移动端音乐APP学习【四】:scroll组件及loading组件开发的更多相关文章

  1. 获取qq音乐json数据---某课网音乐app学习

    移动端qq音乐地址:https://m.y.qq.com/ .抓取QQ音乐数据 请求首页时,有如下链接,回调了jsonp https://c.y.qq.com/splcloud/fcgi-bin/p. ...

  2. 【音乐App】—— Vue-music 项目学习笔记:项目准备

    前言: 学习慕课网Vue高级实战课程后,在实践中总结一些这个项目带给自己的收获,希望可以再次巩固关于Vue开发的知识.这一篇主要梳理:项目概况.项目准备.页面骨架搭建.项目github地址:https ...

  3. 如何用vue打造一个移动端音乐播放器

    写在前面 没错,这就是慕课网上的那个vue音乐播放器,后台是某音乐播放器的线上接口扒取,虽然这类项目写的人很多,但不得不说这还是个少有的适合vue提升的好项目,做这个项目除了想写一个比较大并且功能复杂 ...

  4. vue移动音乐app开发学习(三):轮播图组件的开发

    本系列文章是为了记录学习中的知识点,便于后期自己观看.如果有需要的同学请登录慕课网,找到Vue 2.0 高级实战-开发移动端音乐WebApp进行观看,传送门. 完成后的页面状态以及项目结构如下: 一: ...

  5. vue移动音乐app开发学习(二):页面骨架的开发

    本系列文章是为了记录学习中的知识点,便于后期自己观看.如果有需要的同学请登录慕课网,找到Vue 2.0 高级实战-开发移动端音乐WebApp进行观看,传送门. 完成后的页面状态以及项目结构如下: 一: ...

  6. vue移动音乐app开发学习(一):环境搭建

    本系列文章是为了记录学习中的知识点,便于后期自己观看.如果有需要的同学请登录慕课网,找到Vue 2.0 高级实战-开发移动端音乐WebApp进行观看,传送门. 一:使用vue-cli脚手架搭建: 1: ...

  7. day 84 Vue学习四之过滤器、钩子函数、路由、全家桶等

      本节目录 一 vue过滤器 二 生命周期的钩子函数 三 vue的全家桶 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 Vue的过滤器 1 moment.js 在这里我们先介绍一个 ...

  8. 【音乐App】—— Vue-music 项目学习笔记:搜索页面开发

    前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记. 项目github地址:https://github.com/66Web/ljq_vue_music,欢迎Star. 搜索歌手歌曲 搜索历史保存 ...

  9. 【音乐App】—— Vue-music 项目学习笔记:播放器内置组件开发(二)

    前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记. 项目github地址:https://github.com/66Web/ljq_vue_music,欢迎Star. 播放模式切换 歌词滚动显示 ...

随机推荐

  1. whiteboard & coding interview practice

    whiteboard & coding interview practice 白板 & 面试 & 编码练习 Algorithm https://www.freecodecamp ...

  2. LeetCode & list cycle

    LeetCode & list cycle 链表是否存在环检测 singly-linked list 单链表 "use strict"; /** * * @author x ...

  3. Baidu Apollo use: command " rosbag " not fonud

    https://github.com/ApolloAuto/apollo/issues/181 1.If using dev docker env, you need run apollo.sh bu ...

  4. 【转】ICP算法(Iterative Closest Point迭代最近点算法)

    原文网址:https://www.cnblogs.com/sddai/p/6129437.html.转载主要方便随时可以查看,如有版权要求请及时联系. 最近在做点云匹配,需要用c++实现ICP算法,下 ...

  5. Maven报错:Unsupported major.minor version 51.0

    这个错误时因为JDK版本的问题,比如本机的JDK为1.6,但是项目编译时用的JDK为1.7那么就会出现这个异常,因为本机JDK版本较低不能执行编译版本为高版本的Class文件,各JDK版本对应的错误编 ...

  6. Google单元测试框架gtest之官方sample笔记2--类型参数测试

    gtest 提供了类型参数化测试方案,可以测试不同类型的数据接口,比如模板测试.可以定义参数类型列表,按照列表定义的类型,每个测试case都执行一遍. 本例中,定义了2种计算素数的类,一个是实时计算, ...

  7. 一文吃透如何部署kubernetes高可用集群

    使用 k8s 官方提供的部署工具 kubeadm 自动安装,需要在 master 和 node 节点上安装 docker 等组件,然后初始化,把管理端的控制服务和 node 上的服务都以 pod 的方 ...

  8. Docker SDK for Python

    一.概述 Docker引擎API的Python库.它允许您执行docker命令所做的任何操作,但可以在Python应用程序中运行容器.管理容器.管理群集等. 官方文档: https://docker- ...

  9. 分布式实时处理系统——C++高性能编程

    [前言]基于通信基础,介绍Hurricane实时处理系统的工程实现,主要使用C++语言. 一.IPC.socket.异步I/O epoll 二.C++11 1.linux内存管理中使用RALL原则,C ...

  10. 【函数分享】每日PHP函数分享(2021-3-1)

    array_filter - 使用回调函数过滤数组的元素 说明 array_filter ( array $array , callable|null $callback = null , int $ ...