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

小程式的下拉刷新問題

Jun 22, 2020 am 11:18 AM
前端小程式

在小程式中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。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器