您好,登錄后才能下訂單哦!
這篇文章主要介紹了小程序怎么實現下拉刷新,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
enablePullDownRefresh是最容易實現下拉刷新的方法,在json文件中將enablePullDownRefresh設置為true,在Page中監聽onPullDownRefresh事件即可,支持點擊頂部標題欄回到頂部,自定義標題欄時會失效,還可以通過直接調用wx.startPullDownRefresh()觸發下拉刷新事件,產生下拉刷新動畫,處理完下拉刷新中的數據更新后調用wx.stopPullDownRefresh()結束動畫即可。
這種形式的下拉刷新的優點很明顯就是簡單,沒有限制,但是缺點也同樣明顯:
下拉動畫太過簡單,交互不夠優雅且不能自定義下拉動畫
當自定義標題欄時,fixed定位,在Android下標題欄也會被一起下拉
scroll-view是官方的一個滾動視圖組件,使用很簡單,想要設置上拉刷新代碼如下:
<scroll-view class="scroll" scroll-y bindscrolltoupper="refresh"> <view class="content">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 class="scroll" bindtouchstart="touchStart" bindtouchmove="touchMove" bindtouchend="touchEnd"> <view class="animation"> <view class="loading"></view> <text class="tip">{{state === 0 ? '下拉刷新' : state === 1? '松開刷新' : '刷新中'}}</text> </view> <view style="transform: translateY({{translateHeight}}rpx)"> <slot name="content"></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 < 0) return this.data.translateHeight += offset this.data.state = 0 lastY = e.touches[0].clientY if (this.data.translateHeight - this.data.scrollTop * scale > 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 <= 0) { this.stopRefresh() } }, // 停止刷新 stopRefresh () { this.setData({ translateHeight: 0, state: -1 }, () => { wx.pageScrollTo({ scrollTop: 0, duration: 0 }) }) } } })
這個下拉刷新組件最重要的是控制下拉刷新的時機,代碼體現就是定義了一個upperDistance,下拉刷新的距離來判斷是否執行刷新。手指滑動時,獲取滑動距離,translateHeight累加用于展示,在touchEnd事件中判斷滑動距離是否達到設定值,達到設定值就發送scrolltoupper事件,在父組件中監聽即可,否則停止刷新。
<header title="下拉刷新" background="#fff"></header> <refresh-scroll id="refreshScroll" bindscrolltoupper="refresh"> <view class="item" slot="content" wx:for="{{list}}">{{item}}</view> </refresh-scroll>
Page({ data: { list: [] }, onLoad: function () { this.refreshScroll = this.selectComponent('#refreshScroll') for (let i = 0; i < 10; i++) { this.data.list.push(i) } this.setData({ list: this.data.list }) }, onPageScroll (e) { this.refreshScroll.onPageScroll(e) }, onReachBottom () { wx.showLoading({ title: 'onReachBottom' }) setTimeout(() => { wx.hideLoading() }, 1000) }, refresh: function (e) { setTimeout(() => { this.refreshScroll.stopRefresh() }, 1000) } })
在使用時關鍵是要將頁面中onPageScroll中獲取的值傳遞下去,然后bindscrolltoupper監聽scrolltoupper事件,執行刷新操作然后再調用stopRefresh停止刷新,下來看真機上的測試效果:
iOS:
Android:
在真機測試時,表現都還不錯,當然了,這只是自定義下拉刷新的一個簡單組件例子,如果需要用于到實際項目,可能還需要自己去完善,畢竟不同的人應用的場景不同,這里只是給出了一個思路而已
感謝你能夠認真閱讀完這篇文章,希望小編分享的“小程序怎么實現下拉刷新”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。