1. 程式人生 > >Vue中使用better-scroll所遇到的若干問題

Vue中使用better-scroll所遇到的若干問題

(better-scroll可適用於滾動列表、輪播圖、索引列表、開屏引導、上拉載入、下拉重新整理等應用場景)

最近在做一個基於Vue的webapp,用到了better-scroll這個外掛,遇到一些常見的問題,把它總結一下:

首先在vue中使用better-scroll,第一步安裝:

    執行命令:npm install better-scroll --S

    引入:import better-scroll from 'better-scroll'

better-scroll滾動原理:

  <div class="wrapper">
    <ul class="content">
      <li>...</li>
      <li>...</li>
      ...
    </ul>
  </div>


官方文件上扣下來的一張圖,wrapper掉了一個a 忽略忽略...安靜

    綠色部分為 wrapper,也就是父容器,它要有固定的高度。黃色部分為 content,它是父容器的第一個子元素,它的高度會隨著內容的大小而撐高。當 content 的高度不超過父容器的高度,是不能滾動的,而它一旦超過了父容器的高度,我們就可以滾動內容區了,這就是 better-scroll 的滾動原理。

better-scroll初始化:

  vue中使用better-scroll要注意它的初始化必須在資料載入完成後,因為它在初始化的時候,會計算父元素和子元素的高度和寬度,來決定是否可以縱向和橫向滾動。因此,我們在初始化它的時候,必須確保父元素和子元素的內容已經正確渲染了。如果子元素或者父元素 DOM 結構發生改變的時候,必須重新呼叫 scroll.refresh()

 方法重新計算來確保滾動效果的正常。

<template>
  <div class="wrapper" ref="wrapper">
    <div>

     <ul class="content">
        <li v-for="item in data">{{item}}</li>
      </ul>

      <div class="bottom-tip">
      <span class="loading-hook">檢視更多</span>
     </div> 

    <div>
  </div>
</template>
<script>
  import BScroll from 'better-scroll'
  export default {
    data() {
      return {
        data: []
      }
    },
    created() {
      this.loadData()
    },
    methods: {
      loadData() {
        var self = this;
       requestData().then((res) => {
          this.data = res.data.concat(this.data)
          this.$nextTick(() => {
            if (!this.scroll) {
              this.scroll = new Bscroll(this.$refs.wrapper, {    
                pullUpLoad:{
           threshold: -30, // 負值是當上拉到超過低部 30px;正值是距離底部距離時,
          }
              })
              this.scroll.on('touchend', (pos) => {
                // 下拉動作
                if (pos.y > 50) {
                  self.loadData()
                }
              })
              this.scroll.on('pullingUp', (pos) => {
          document.querySelector('.loading-hook').innerText = '載入中...';
          setTimeout(function () {
           // 恢復文字值
           document.querySelector('.loading-hook').innerText = '檢視更多';
           // 向列表新增資料
           self.loadData();
          }, 1000);
         }) 
            } else {
                this.scroll.finishPullUp() 
                this.scroll.refresh()
            }
          })
        })
      }
    }
  }
</script>