前端下拉刷新,上拉加載的實現一直都有很多坑,今天入以下 better-scroll 的坑,先附上 better-scroll 的官方文檔,如果要深入使用還是得看文檔 查看鏈接
第一步
先看下better-scroll實現時的dom結構,如下代碼
1 <div class="scroller" ref="scroller"> 2 <div class="scroll-list"> 3 <div class="scroll-item"></div> 4 <div class="scroll-item"></div> 5 <div class="scroll-item"></div> 6 <div class="scroll-item"></div> 7 <p class="loading">{{ loadingText}}</p> 8 </div> 9 </div>
如上
- 類 .scroller 就是初始化 better-scroll 時作用的 dom (容器), 這個元素需要有個固定的高度,然后需要設置 overflow 的樣式,經嘗試設置 overflow: hidden; 或者 overflow-y: auto; 都可以
- 類 .scroll-list 就是要滾動的容器,這個盒子不需要給多余的樣式(類似高度或者 overflow 的樣式),它的高度是列表的內容撐開的,但有一個要求,當初始化 better-scroll 時這個盒子的高度是大於容器 .scroller 的。
- 類 .loading 是列表底部類似 “上拉加載”,“沒有更多了”這樣的提示,可以根據列表的狀態動態的更改里面的內容
第二步
初始化 better-scroll, 代碼如下(可以將這一步放在第三步調用,不需要拎出來直接調用)
1 initScroller() { 2 //初始化betterScroll 3 let self = this 4 self.scroller = new BScroll(self.$refs.scroller, { 5 probeType: 1, 6 click: true 7 }) 8 self.scroller.on('touchend', function (position) { 9 if (position.y < this.maxScrollY - 30) { // 上拉加載 10 if (self.isNoMore) return self.loadingText = '沒有更多了...' 11 self.loadingText = '加載中...' 12 setTimeout(function () { 13 self.getList() 14 }, 1000) 15 } 16 if (position.y > 80) { // 下拉刷新 17 self.list.length= 0 18 self.loadingText = '刷新中...' 19 setTimeout(function () { 20 self.getList() 21 }, 1000) 22 } 23 }) 24 }
如上代碼(vue)
- 如果在 vue 中使用,並且在其他作用域需要使用初始化后的實例 scroller ,可以將其掛載的 vue 的 data 屬性上,在 mounted 或者 this.$nextTick(() => {/* 初始化代碼*/}) 方法中初始化
- 初始化時的第二個參數根據自己的需求傳遞,可以不傳
- 這時候你的頁面在上拉和下拉的時候就已經有了 Q 彈的效果,如果沒有請檢查自己的代碼
- 監聽 touchend 方法就是為了加上拉加載和下拉刷新
- this.maxScrollY 是 scroller 的屬性(this 指向 self.scroller 並不是指向 vue的)
- 加 setTimeout 是為了過度平滑一點有個加載中的效果,也可以不加
- 如果只是做下拉刷新上拉加載 probeType 設置為1就可以,其他值的定義請參考官方文檔
第三步
當頁面發生變化時刷新 better-scroll,如下 this 是vue中的代碼
1 getList () { 2 ... 3 .., 4 ... 5 this.$nextTick(() => { 6 this.loadingText = '上拉加載' 7 if (this.isNoMore) { 8 this.loadingText = '沒有更多了...' 9 } 10 this.scroller ? this.scroller.refresh() : this.initScroller() 11 }) 12 }
- 這里有個判斷,如果已經初始化就刷新 better-scroll 否則就初始化 better-scroll.(好處就是可以直接將其寫在請求列表之后,不用單獨拎出來調用 initScroller 代碼)
- 這個方法需要在dom掛載在頁面之后調用, vue 請寫在 $nextTick 方法中
以上代碼就是上拉加載下拉刷新的基本代碼
下面總結一些坑點
1. 手指觸摸了一點頁面就哧溜滑動了好多,可能是給容器設置 -webkit-overflow-scrolling: touch; 樣式了,刪掉即可
2. 添加better-scroll 后頁面需要橫向滾動的地方不能滾動,添加 eventPassthrough: 'horizontal' 配置,具體原因參考官方文檔該配置介紹
待續