内容简介:由于最近一个移动端项目中许多地方有滚动需求, 横向,纵向的都有,所以就基于better-scroll封装了一个通用的滚动组件,期间也踩了一些坑,有时候会滚动失效,初始化的时候就不能滚动等等...better-scroll地址:当然, 我们还可以添加更多的配置功能, 这个需要依据你自己的需求来了,详情配置去better-scroll官网看看
写在前面
由于最近一个移动端项目中许多地方有滚动需求, 横向,纵向的都有,所以就基于better-scroll封装了一个通用的滚动组件,期间也踩了一些坑,有时候会滚动失效,初始化的时候就不能滚动等等...
better-scroll地址: https://ustbhuangyi.github.io...
滚动组件代码
<template>
<div ref="wrapper">
<slot></slot>
</div>
</template>
<script>
import BScroll from "better-scroll";
export default {
props: {
probeType: {
type: Number, // 非实时派发scroll事件, 类型由0,1,2,3
default: 1
},
scrollX: {
type: Boolean, // 是否横向滚动
default: false
},
scrollY: {
type: Boolean, // 是否纵向滚动
default: true
},
click: {
type: Boolean, // 是否派发点击事件
default: true
},
listenScroll: {
type: Boolean, // 监听滚动
default: false
},
data: {
type: Array, // 组件数据,可用于重新刷新scroll组件
default: null
},
pullup: {
type: Boolean, // 上拉加载更多,请求接口
default: false
},
beforeScroll: {
type: Boolean, // 滚动之前做些什么
default: false
},
refreshDelay: {
type: Number, // scroll刷新时间
default: 20
}
},
mounted() {
// 也可以使用nextTick来初始化
setTimeout(() => {
this.initScroll();
}, 20);
},
methods: {
// 初始化
initScroll() {
if (!this.$refs.wrapper) {
return;
}
// 根据自己的需求传入配置项
this.scroll = new BScroll(this.$refs.wrapper, {
probeType: this.probeType,
click: this.click,
scrollX: this.scrollX
});
if (this.listenScroll) {
let me = this;
this.scroll.on("scroll", pos => {
me.$emit("scroll", pos);
});
}
if (this.pullup) {
this.scroll.on("scrollEnd", () => {
if (this.scroll.y <= this.scroll.maxScrollY + 50) {
this.$emit("scrollToEnd");
}
});
}
if (this.beforeScroll) {
this.scroll.on("beforeScrollStart", () => {
this.$emit("beforeScroll");
});
}
},
disable() {
this.scroll && this.scroll.disable();
},
enable() {
this.scroll && this.scroll.enable();
},
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来刷新scroll组件
data() {
setTimeout(() => {
this.refresh();
}, this.refreshDelay);
}
}
};
</script>
<style lang="less" scoped>
</style>
当然, 我们还可以添加更多的配置功能, 这个需要依据你自己的需求来了,详情配置去better-scroll官网看看
使用scroll组件
纵向滚动
<scroll ref="scroll" class="main-content" :data="data">
<div>
添加需要滚动的DOM元素: 如ul>li等, 或者多个子组件
</div>
</scroll>
// 下面是样式
.main {
width: 100%;
height: calc(100vh - 52px);
background-color: #f7f8fa;
.main-content {
height: 100%;
overflow: hidden;
position: relative;
}
}
纵向滚动主要是要注意的是: scroll下的第一个子元素,它的高度需要让内容来撑开!!! 否则无法滚动
图片中已经标识出来了...
横向滚动
<template>
<div class="app-list-wrapper">
<scroll :scrollX="true" :scrollY="false" ref="scroll" class="icon-content">
<div class="icons">
<div v-for="i in 8" :key="i" class="icon">
<appIcon style="margin-right: 16px"></appIcon>
</div>
</div>
</scroll>
</div>
</template>
// 样式
<style lang="less" scoped>
.app-list-wrapper {
width: 100%;
.icon-content {
// scroll容器
width: 100%;
overflow: hidden;
.icons {
// 注意scroll容器下的第一个元素
padding-left: 20px;
display: inline-block;
white-space: nowrap;
// 子元素样式
.icon {
display: inline-block;
}
}
}
}
</style>
横向滚动下我们传入配置值就行了; 这里主要是注意样式的书写! 也就是scroll下的第一个子元素的宽度要由内容撑宽才可以...,代码块中也标注出来了.
踩过的坑点
-
纯静态页面的滚动
举个栗子,我现在写了一个弹出层,就是静态数据渲染,但是需求也需要滚动,因为单页可能显示不下, 虽说better-scroll的原理是第一个子元素超出父盒子就可以实现滚动了, 弹出层只有在点击弹窗的时候才会渲染,所以是无法滚动的, 在弹窗出来后再手动刷新scroll组件; 这里我们就可以通过那个data属性搞事情了,每次点击弹窗后,往data中丢个数据,这样会触发scroll组件的watch, 然后手动刷新,就可以实现滚动了...
// 部分代码示例
<t-aside :data="onOff"></t-aside> // 侧边栏弹出层组件
methods: {
showPopup() {
this.onOff.push('1'), // 刷新scroll组件
this.$refs.aside.show();
}
}
-
scroll容器数据变化导致无法正常滚动, 可能情况是:
- 初始化的时候就有问题,去检查一下第一个子元素高度||宽度是否是由其子元素撑开的
-
接口数据还未请求回来就初始化了, 比如图片,此时初始化就没算上图片的高度,
这时候就需要手动调用this.$refs.scroll.refresh()来刷新scroll组件, 矫正滚动高度
3.其他坑点待发现...欢迎大佬一起交流
以上所述就是小编给大家介绍的《基于better-scroll的vue滚动组件》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Open Data Structures
Pat Morin / AU Press / 2013-6 / USD 29.66
Offered as an introduction to the field of data structures and algorithms, Open Data Structures covers the implementation and analysis of data structures for sequences (lists), queues, priority queues......一起来看看 《Open Data Structures》 这本书的介绍吧!