在项目中经常用到滚动,结合Better-scroll封装了sroll.vue组件
参考链接:https://ustbhuangyi.github.io...
http://www.imooc.com/article/...
**better-scroll 只处理容器(wrapper)的第一个子元素(content)的滚动,其它的元素都会被忽略**。

1.html部分

这个很简单,有一个插槽slot
**better-scroll 只处理容器(wrapper)的第一个子元素(content)的滚动,其它的元素都会被忽略。**


<template>
<div ref="wrapper">
<slot></slot>
</div>
</template>

2.功能

  1. 滚动特性props:是否截流滚动、是否派发事件、是否有数据传入
  2. 初始化Better-scroll

export default {
props: {
probeType: {
//有时候我们需要知道滚动的位置。
//当 probeType 为 1 的时候,会非实时(屏幕滑动超过一定时间后:截流)派发scroll 事件;
//当 probeType 为 2 的时候,会在屏幕滑动的过程中实时(不截流)的派发 scroll 事件;
//当 probeType 为 3 的时候,不仅在屏幕滑动的过程中,而且在 momentum(回弹) 滚动动画运行过程中实时派发 scroll 事件。
//如果没有设置该值,其默认值为 0,即不派发 scroll 事件
type: Number,
default: 1
},
click: {
//click是否派发click事件,通常判断浏览器派发的click还是betterscroll派发的click,
//可以用event._constructed判断,为true,则是betterscroll派发的
type: Boolean,
defalut: true
},
data: {
//滚动的界面是否有了数据(这些数据多数是异步获取的)
//根据这个当有数据的时候refresh,在watch中有相关逻辑
type: Array,
default: null
},
listenScroll: {
//是否派发滚动位置
type: Boolean,
default: false
},
//实现上拉刷新
pullup: {
type: Boolean,
default: false
},
//实现下拉刷新
pulldown: {
type: Boolean,
default: false
},
//开始滚动的时候派发一个事件
beforeScroll: {
type: Boolean,
default: false
}
},
data() {
return { }
},
mounted() {
setTimeout(() => {
this._initScroll() //初始化
}, 20)
},
methods: {
_initScroll() {
if (!this.$refs.wrapper) {
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) => {
//pos.y
//往上滑动负数,往下滑动正数
me.$emit('scroll', pos)
})
}
//上拉刷新,滚动到底部派发一个事件
if (this.pullup) {
this.scroll.on('scrollEnd', () => {
if(this.scroll.y <= (this.scroll.maxScrollY + 50)) {
this.$emit('scrllToEnd')
}
})
}
//是否派发顶部下拉事件,用于下拉刷新
if (this.pulldown) {
this.scroll.on('touchend', (pos) => {
//下拉动作
if (pos.y > 50) {
this.$emit('pulldown')
}
})
}
//开始滚动的时候派发一个事件
//比如,搜索下拉框,滚动下拉框的时候,派发开始滚动事件,从而收起键盘
if (this.beforeScroll) {
this.scroll.on('beforeScrollStart', () => {
this.$emit('beforeScroll')
})
}
},
enable() {
this.scroll && this.scroll.enable()
},
disable() {
this.scroll && this.scroll.disable()
},
refresh() {
this.scroll && this.scroll.refresh()
},
scrollTo() {
this.scroll && this.scroll.scrollTo.apply(this.scroll, arguments)
},
scrollToElement() {
this.scroll && this.scroll.scrollToElement.apply(this.scroll, arguments)
}
},
watch: {
data() {
setTimeout(() => {
this.refresh()
}, 20)
}
}
}

3.使用

在recommend.vue中使用

注:样式


//控制高度才能滚动
.recommend {
position: fixed;
width: 100%;
top: 88px;
bottom: 0;
}
.recommend-content {
height: 100%;
overflow: hidden;
}

原文地址:https://segmentfault.com/a/1190000016979411

vue_music:封装scroll.vue组件的更多相关文章

  1. html5音频audio对象封装成vue组件的方式调用以及setTimeout如何在vue2生效 (vue2正在熟悉中,ajax还是用jQuery来写舒服些,里面含有一些php写法可略过) 此网页应用在PC不考虑手机端

    // vue2 组件封装如下: <template> <div> <div><!--vue element 组件的引用 Switch 开关 不懂请自行百度(重 ...

  2. 一篇文章带你使用Typescript封装一个Vue组件

    一.搭建项目以及初始化配置 vue create ts_vue_btn 这里使用了vue CLI3自定义选择的服务,我选择了ts.stylus等工具.然后创建完项目之后,进入项目.使用快捷命令code ...

  3. 【vue系列之三】从一个vue-pdf-shower,说说vue组件和npm包

    前言 从去年年初开始,自己便下决心要写一个vue系列的博客,但时至今日,才写系列的第三篇博客,想来甚是惭愧. 但是慢归慢,每一篇都要保证质量,以及要写出自己的心路历程,防止自己工作中填的坑再让读者走一 ...

  4. vue2.0 如何自定义组件(vue组件的封装)

    一.前言 之前的博客聊过 vue2.0和react的技术选型:聊过vue的axios封装和vuex使用.今天简单聊聊 vue 组件的封装. vue 的ui框架现在是很多的,但是鉴于移动设备的复杂性,兼 ...

  5. 从零开始教你封装自己的vue组件

    组件(component)是vue.js最强大的功能之一,它可以实现功能的复用,以及对其他逻辑的解耦.但经过一段时间的使用,我发现自己并没有在业务中发挥出组件的最大价值.相信很多刚开始使用vue的朋友 ...

  6. 如何封装使用api形式调用的vue组件

    在实际开发中一般有两种封装vue组件的方法:一种就是常用的的通过props父组件传值给子组件的方法: 子组件 父组件: 还有一种就是通过调用api的形式,下面例子是本人在实际项目中封装的一个自定义图标 ...

  7. 手把手教你封装 Vue 组件,并使用 npm 发布

    Vue 开发插件 开发之前先看看官网的 开发规范 我们开发的之后期望的结果是支持 import.require 或者直接使用 script 标签的形式引入,就像这样: // 这里注意一下包的名字前缀是 ...

  8. vue组件封装及父子组件传值,事件处理

    vue开发中,把有统一功能的部分提取出来,作为一个独立的组件,在需要使用的时候引入,可以有效减少代码冗余.难点在于如果封装,使用,如何传参,派发事件等,我会采取倒叙的方式进行说明.(本文总结于Vue2 ...

  9. 一个 VUE 组件:实现子元素 scroll 父元素容器不跟随滚动(兼容PC、移动端)

    介绍 我们经常遇到一种情况.当滑动滚动条区域时,子元素滚动条到底部或顶部时就会触发父级滚动条,父级滚动条同理会继续向上触发,直至body容器.这是浏览器默认的滚动行为. 但是很多情况,我们想要子元素滚 ...

随机推荐

  1. CentOS yum源的配置

    yum操作 1.用YUM安装软件包命令:yum install 2.用YUM删除软件包命令:yum remove 3.使用YUM查找软件包命令:yum search4.列出所有可安装的软件包命令:yu ...

  2. Codeforces 163E(ac自动机、树状数组)

    要点 显然ac自动机的板子就可以暴力一下答案了 为了优化时间复杂度,考虑套路fail树的dfs序.发现本题需要当前这个尾点加上所有祖先点的个数,考虑使用树状数组差分一下,在父点+1,在子树后-1,每次 ...

  3. CodeForces - 1005A-Tanya and Stairways(模拟)

    Little girl Tanya climbs the stairs inside a multi-storey building. Every time Tanya climbs a stairw ...

  4. python 3 学习字符串和编码

    字符串和编码 阅读: 895464 字符编码 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字 ...

  5. SpringBoot---Web开发---WebSocket

    [广播式] 1. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...

  6. AnyCAD OpenSource 版本下载和编译

    下载: SVN下载地址:https://anycad.svn.codeplex.com/svn 或者直接下载:http://anycad.codeplex.com/SourceControl/late ...

  7. Java 面向对象,封装,继承

    1相关概念的理解 1.1面向过程.面向对象 面向过程与面向对象都是编程中,编写程序的一种思维方式. 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.(职员思想) 面向 ...

  8. Java基础(Java概述、环境变量、注释、关键字、标识符、常量)

    第1天 Java基础语法 今日内容介绍 u Java开发环境搭建 u HelloWorld案例 u 注释.关键字.标识符 u 数据(数据类型.常量) 第1章 Java开发环境搭建 1.1 Java概述 ...

  9. swift基础-3

    fallthrough 贯穿 case  可以不必写break 如果不需要知道区间内 每一项的值  可以使用 下划线 —— 来代替变量名 忽略 对该值的访问 for index in 1...5{ p ...

  10. cf1027F. Session in BSU(并查集 匈牙利)

    题意 题目链接 $n$个人,每个人可以在第$a_i$天或第$b_i$,一天最多考一场试,问在最优的情况下,最晚什么时候结束 Sol 自己只能想到暴力匈牙利二分图匹配,然而还是被构造数据卡了.. 标算很 ...