如下這一大段代碼就是封裝好的better-scroll組件基本內(nèi)容了。
包含了常用的屬性,方法,并進(jìn)行了初始化,以及父子組件傳值常用的方法和數(shù)據(jù)參考值。
<template>
<div ref="wrapper">
<slot></slot>
</div>
</template>
<script type="text/ecmascript-6">
import BScroll from 'better-scroll'
export default {
name:'bscroll',
data(){
return {
scroll:null
}
},
props: {
/**
* 1 滾動(dòng)的時(shí)候會(huì)派發(fā)scroll事件,會(huì)截流。
* 2 滾動(dòng)的時(shí)候?qū)崟r(shí)派發(fā)scroll事件,不會(huì)截流。
* 3 除了實(shí)時(shí)派發(fā)scroll事件,在swipe的情況下仍然能實(shí)時(shí)派發(fā)scroll事件
*/
probeType: {
type: Number,
default: 3
},
/**
* 點(diǎn)擊列表是否派發(fā)click事件
*/
click: {
type: Boolean,
default: true
},
/**
* 是否開啟橫向滾動(dòng)
*/
scrollX: {
type: Boolean,
default: false
},
/**
* 是否派發(fā)滾動(dòng)事件
*/
listenScroll: {
type: Boolean,
default: false
},
/**
* 列表的數(shù)據(jù)
*/
data: {
// type: Array,
default: null
},
/**
* 有時(shí)候我們使用 BetterScroll 在某個(gè)方向模擬滾動(dòng)的時(shí)候,希望在另一個(gè)方向保留原生的滾動(dòng)
*/
eventPassthrough:{
type:String,
default:null
},
/**
* 是否派發(fā)滾動(dòng)到底部的事件,用于上拉加載
*/
pullup: {
type: Boolean,
default: false
},
/**
* 是否派發(fā)頂部下拉的事件,用于下拉刷新
*/
pulldown: {
type: Boolean,
default: false
},
scrollYpos:{
type: Number,
default: 0
},
cateFlag:{
type: String,
default: '1'
}
/**
* 是否派發(fā)列表滾動(dòng)開始的事件
*/
// beforeScroll: {
// type: Boolean,
// default: false
// },
/**
* 當(dāng)數(shù)據(jù)更新后,刷新scroll的延時(shí)。
*/
// refreshDelay: {
// type: Number,
// default: 20
// }
},
mounted() {
// 保證在DOM渲染完畢后初始化better-scroll
//注:如下使用nextTick可能會(huì)不生效,不生效就使用setTimeout來控制延遲加載,
//一般設(shè)置20ms,但有時(shí)不生產(chǎn)可以將這個(gè)值調(diào)大,
//不生效的解決辦法,可以將頁面數(shù)據(jù)傳進(jìn)data中進(jìn)行監(jiān)聽
// this.$nextTick(function(){
// this._initScroll()
// // this.refresh()
// })
setTimeout(() => {
this._initScroll()
}, 20);
},
methods: {
_initScroll() {
if (!this.$refs.wrapper) {
return
}
// better-scroll的初始化
this.scroll = new BScroll(this.$refs.wrapper, {
probeType: this.probeType,
click: this.click,
scrollX: this.scrollX,
disableTouch: false ,
eventPassthrough:this.eventPassthrough
})
// 是否派發(fā)滾動(dòng)事件
if (this.listenScroll) {
this.scroll.on('scroll', (pos) => {
this.$emit('scroll', pos)
})
}
// 是否派發(fā)滾動(dòng)到底部事件,用于上拉加載
if (this.pullup) {
this.scroll.on('scrollEnd', () => {
// 滾動(dòng)到底部
if (this.scroll.y <= (this.scroll.maxScrollY + 50)) {
this.$emit('scrollToEnd')
}
})
}
// 是否派發(fā)頂部下拉事件,用于下拉刷新
if (this.pulldown) {
this.scroll.on('touchEnd', (pos) => {
// 下拉動(dòng)作
if (pos.y > 50) {
this.$emit('pulldown')
}
})
}
// 是否派發(fā)列表滾動(dòng)開始的事件
if (this.beforeScroll) {
this.scroll.on('beforeScrollStart', () => {
this.$emit('beforeScroll')
})
}
},
// disable() {
// // 代理better-scroll的disable方法
// this.scroll && this.scroll.disable()
// },
// enable() {
// // 代理better-scroll的enable方法
// this.scroll && this.scroll.enable()
// },
refresh() {
// 代理better-scroll的refresh方法
this.scroll && this.scroll.refresh()
console.log('刷了')
},
scrollTo() {
// 代理better-scroll的scrollTo方法
this.scroll && this.scroll.scrollTo.apply(this.scroll, arguments)
},
// scrollToElement() {
// // 代理better-scroll的scrollToElement方法
// this.scroll && this.scroll.scrollToElement.apply(this.scroll, arguments)
// }
},
watch: {
// 監(jiān)聽數(shù)據(jù)的變化,延時(shí)refreshDelay時(shí)間后調(diào)用refresh方法重新計(jì)算,保證滾動(dòng)效果正常
data:{
handler(newText,oldText){
setTimeout(() => {
this.refresh()//數(shù)據(jù)更新后先刷新一下scroll組件
// this.scrollTo(0,0)//數(shù)據(jù)每次更新將滾動(dòng)到頂部
}, this.refreshDelay)
},
immediate:true,
},
}
}
</script>
<style scoped>
</style>
在其他頁面使用:
主要就是匹配的Bscorll這個(gè)組件內(nèi)定義的一些值和方法。用與這個(gè)組件與頁面之間的數(shù)據(jù)交互。

image.png
例如實(shí)現(xiàn)一個(gè)上拉加載下一頁數(shù)據(jù):
頁面內(nèi)使用這個(gè)組件時(shí)打開需要的屬性:

image.png
在封裝的Bscroll組件內(nèi)打開props中的pullup屬性:
/**
* 是否派發(fā)滾動(dòng)到底部的事件,用于上拉加載
*/
pullup: {
type: Boolean,
default: false
},
為true則會(huì)觸發(fā)觸底事件。并通過內(nèi)部scrollEnd觸底事件來發(fā)送出一個(gè)事件用于頁面監(jiān)聽
// 是否派發(fā)滾動(dòng)到底部事件,用于上拉加載
// 是否派發(fā)滾動(dòng)到底部事件,用于上拉加載
if (this.pullup) {
this.scroll.on('scrollEnd', () => {//監(jiān)聽Bscroll插件內(nèi)部的觸底方法
// 滾動(dòng)到底部
if (this.scroll.y <= (this.scroll.maxScrollY + 50)) { //maxScorllY是內(nèi)部固有的屬性值
this.$emit('scrollToEnd') //通過子父組件發(fā)送出一個(gè)事件,用于頁面接收
}
})
}
在使用組件的頁面監(jiān)聽這個(gè)事件

image.png
然后在這個(gè)事件內(nèi)執(zhí)行分頁操作
//分頁
pullup(){
//觸底之后會(huì)觸發(fā)此事件
if(this.cateFlag2){
return
}
this.offset = this.offset+10
this.$request('/comment/music',{
id:this.$route.params.id,
limit:10,
offset:this.offset
}).then(res=>{
this.comments = this.comments.concat(res.data.comments)
console.log(res.data.comments)
})
},
其他事件如下拉觸頂刷新也類似。封裝的文件內(nèi)一些方法和屬性不是這個(gè)插件的全部, 是部分常用的。有其他需求可以自己到官網(wǎng)去查閱一些其他方法。