Better-scroll封裝與使用(內(nèi)含上拉觸底分頁詳解)

如下這一大段代碼就是封裝好的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)去查閱一些其他方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容