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. TCP之“3次握手,4次挥手”问题

    你知道"3次握手,4次挥手"吗? 当面试官问你什么是"3次握手,4次挥手",你是不是要开启"诵经"模式了?作为程序员,要有"刨根问 ...

  2. Leetcode(9)-回文数

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...

  3. config file language All In One

    config file language All In One YAML YAML Ain't Markup Language .yaml / .yml https://yaml.org/ https ...

  4. CSS pseudo classes All In One

    CSS pseudo classes All In One CSS 伪类 https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes ...

  5. Tailwind CSS in Action

    Tailwind CSS in Action Tailwind CSS是一个高度可定制的低级CSS框架,它为您提供了构建定制设计所需的所有构造块,而无需烦恼要覆盖的烦人的自以为是的样式 https:/ ...

  6. HTML5 Animation Creator | Hype 官方文档

    HTML5 Animation Creator | Hype 官方文档 HTML5 Animation Build 7个 专业术语 场景,元素,属性,关键帧,动画,时间线,操作 Hype 官方文档 h ...

  7. website captcha

    website captcha 验证码 hCaptcha hCaptcha通过询问对人类来说很容易且对机器来说很困难的简单问题,可以帮助您喜欢的Web服务阻止机器人,垃圾邮件和滥用行为. https: ...

  8. js types & primitive & object

    js types & primitive & object js 数据类型 typeof null // "object" typeof undefined // ...

  9. 精密进近OCH的计算

    一.计算步骤 以I类精密进近为例,运行标准的制定大致分为以下几个步骤: 1)确定精密航段的超高障碍物. 2)计算当量高 3)计算高度损失 4)当量高与高度损失相加得到超障高OCH 5)对复飞段障碍物进 ...

  10. VS Code使用Git可视化管理源代码详细教程

    前言: 随着VS Code的功能和插件的不断强大和完善,它已经成为了我们日常开发中一个必不可缺的伙伴了.在之前我曾经写过一篇SourceTree使用教程详解(一个git可视化管理神器,想要了解的话可以 ...