首頁 >微信小程式 >小程式開發 >小程式的下拉刷新問題

小程式的下拉刷新問題

hzc
hzc轉載
2020-06-22 11:18:163595瀏覽

在小程式中onLoad生命鉤子只在頁面建立時調用一次,在做navigateTo頁面跳轉後,返回上級頁面,由於navigateTo跳躍只是隱藏了當前頁面,因此返回上一級頁面時onLoad生命鉤子不會再執行,這樣帶來的好處是頁面能快速展示出來,但是onLoad中的請求數據不會即時更新,這時候就需要一個下拉刷新的操作來幫助用手動更新頁面數據,接下來這篇文章將會介紹小程式中實作下拉刷新的三種方式

enablePullDownRefresh

enablePullDownRefresh是最容易實作下拉刷新的方法,在json檔案中將enablePullDownRefresh設定為true,在Page中監聽onPullDownRefresh事件即可,支援點擊頂部標題欄回到頂部,自訂標題列時會失效,還可以透過直接呼叫wx.startPullDownRefresh()觸發下拉刷新事件,產生下拉刷新動畫,處理完下拉刷新中的資料更新後呼叫wx.stopPullDownRefresh()結束動畫即可。

這種形式的下拉刷新的優點很明顯就是簡單,沒有限制,但是缺點也同樣明顯:

  • 下拉動畫太過簡單,互動不夠優雅且無法自訂下拉動畫
  • 當自訂標題列時,fixed定位,在Android下方標題列也會被一起下拉

scroll-view

scroll-view是官方的一個滾動視圖元件,使用很簡單,想要設定上拉刷新程式碼如下:

<scroll-view>
  <view>content</view>
</scroll-view>

想要利用scroll- view實作上拉刷新,需要注意:

  • 一定要給scroll-view設定固定高度,否則監聽事件不會觸發
  • ##設定縱向捲動scroll-y
  • scroll-view內的內容高度一定要比scroll-view高度要高,否則無法產生縱向捲動,就無法觸發監聽事件
#scroll-view缺點:

  • 由於iOS有橡皮筋效果,因此最終效果會與Android有一定的差異
  • 剛開啟頁面時上拉是無法觸發上拉監聽事件,需要先向下捲動,觸發捲動,然後再上拉捲動才能觸發監聽事件
  • 當有自定義頭部時,scroll-view需要一個高度計算,減去頭部高度
scroll-view優點:

  • 可以自訂載入動畫
  • 程式碼相對簡單
  • #相對enablePullDownRefresh,scroll-view對捲動清單控制更方便:

    • scroll-into-view:捲動到指定元素
    • #enable-back-to-top:iOS點擊頂部狀態列、安卓雙擊標題列時,滾動條返回頂部,只支援垂直,且當自訂標題列後就會失效
官方不推薦使用scroll-view做下拉刷新,官方文件上有這樣一個tip


小程式的下拉刷新問題

#自訂下拉刷新

#自定義下拉刷新最主要希望解決的問題還是在Android使用enablePullDownRefresh時fixed定位的標題列或導覽列會被下拉的問題,同時兩端在下拉刷新時的動畫保持一致,其實實現起來並不難,接下來就看看具體實作:

wxml:

<view>
  <view>
    <view></view>
    <text>{{state === 0 ? '下拉刷新' : state === 1? '松开刷新' : '刷新中'}}</text>
  </view>
  <view>
    <slot></slot>
  </view>
</view>
這個檔案定義元件的模版,有一個滾動view包裹,綁定了touch事件,裡麵包含下拉刷新時的動畫,和一個slot,slot用於插入滾動清單的內容

wxss:

.animation {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 150rpx;
  margin-bottom: -150rpx;
  background-color: #fff;
}
.loading {
  width: 30rpx;
  height: 30rpx;
  border:6rpx solid #333333;
  border-bottom: #cccccc 6rpx solid;
  border-radius: 50%;
  animation:load 1.1s infinite linear;
      
}
@keyframes load{ 
  from{
    transform: rotate(0deg);
  }
  to{
    transform: rotate(360deg);
  }
}

.tip {
  margin-left: 10rpx;
  color: #666;
}
樣式檔案這沒什麼特別的

js:

let lastY = 0 // 上一次滚动的位置
let scale = 750 / wx.getSystemInfoSync().windowWidth // rpx转化比例
Component({
  options: {
    multipleSlots: true
  },
  data: {
    scrollTop: 0,
    translateHeight: 0, // 平移距离
    state: -1
  },
  properties: {
    // 触发下拉刷新的距离
    upperDistance: {
      type: Number,
      value: 150
    }
  },
  methods: {
    // 监听滚动,获取scrollTop
    onPageScroll (e) {
      this.data.scrollTop = e.scrollTop
    },
    touchStart (e) {
      lastY = e.touches[0].clientY
    },
    touchMove (e) {
      let clientY = e.touches[0].clientY
      let offset = clientY - lastY
      if (this.data.scrollTop > 0 || offset  this.data.upperDistance) {
        this.data.state = 1
      }
      this.setData({
        translateHeight: this.data.translateHeight,
        state: this.data.state
      })
    },
    touchEnd (e) {
      if (this.data.translateHeight - this.data.scrollTop * scale > this.data.upperDistance) {
        this.setData({
          translateHeight: 150
        })
        this.triggerEvent('scrolltoupper')
        this.setData({
          state: 2
        })
      } else if (this.data.scrollTop  {
        wx.pageScrollTo({
          scrollTop: 0,
          duration: 0
        })
      })
    }
  }
})
這個下拉刷新元件最重要的是控制下拉刷新的時機,程式碼體現就是定義了一個upperDistance,下拉刷新的距離來判斷是否執行刷新。手指滑動時,取得滑動距離,translateHeight累加用於展示,在touchEnd事件中判斷滑動距離是否達到設定值,達到設定值就發送scrolltoupper事件,在父組件中監聽即可,否則停止刷新。


使用:

<header></header>
<refresh-scroll>
  <view>{{item}}</view>
</refresh-scroll>
Page({
  data: {
    list: []
  },
  onLoad: function () {
    this.refreshScroll = this.selectComponent('#refreshScroll')
    for (let i = 0; i  {
      wx.hideLoading()
    }, 1000)
  },
  refresh: function (e) {
    setTimeout(() => {
      this.refreshScroll.stopRefresh()
    }, 1000)
  }
})

在使用時關鍵是要將頁面中onPageScroll中獲取的值傳遞下去,然後bindscrolltoupper監聽scrolltoupper事件,執行刷新操作然後再刷新調用stopRefresh停止刷新,下來看真機上的測試效果:


iOS:

小程式的下拉刷新問題

Android:
小程式的下拉刷新問題

在真機測試時,表現都還不錯,當然了,這只是自訂下拉刷新的一個簡單元件例子,如果需要用於到實際項目,可能還需要自己去完善,畢竟不同的人應用的場景不同,這裡只是給了一個思路而已

#總結

本篇文章介紹了小程式下拉刷新時的三種方法,前兩種都是小程式官方提供的,最後一種是個人的思考總結,寫的也比較簡單,想要專案應用,還需要自己完善,只希望為大家做自訂下拉刷新提供一個思路。

推薦教學:《微信小程式

以上是小程式的下拉刷新問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除