Uniapp中怎么使用scrpll-view组件实现下拉刷新

 5057

uniapp中怎么使用scrpll-view组件实现下拉刷新?下面本篇文章给大家介绍一下uniapp使用scroll-view自定义下拉刷新的方法,希望对大家有所帮助!


Uniapp中怎么使用scrpll-view组件实现下拉刷新


uniapp下拉刷新

uniapp的下拉刷新有两个方法, 一种是整体的下拉刷新, 使用页面生命周期函数onPullDownRefresh; 另外一种是局部的下拉刷新也叫自定义下拉刷新, 使用scrpll-view组件中的自定义下拉刷新事件。


一、整个页面的刷新(onPullDownRefresh)

在 js 中定义 onPullDownRefresh 处理函数(和onLoad等生命周期函数同级),监听该页面用户下拉刷新事件。


二、自定义页面刷新(scroll-view)

组件中遇到的问题

触发不了下拉(原因排查)

1、scroll-view组件外部没有用view包裹. 官网虽然没有说这个问题, 但是如果外部没有一个view单独包裹着这个组件, 就没有办法触发scroll-view组件中的事件。

2、scroll-view没有设置固定高, 在css中设置height, 设置多高就在多高的区域展现. 比如设置高为50vh(100vh为满屏), 则组件里边的内容只会在半屏内上下滚动,不会触发page的滚动条只会触发scroll-view的滚动条. 如果高度不好给确定值, 可以使用scss(lang='scss')中的calc计算, 例子中有体现.(注意使用calc计算时, -左右一定要有空格)。

3、设置高为百分比的话也不能触发下拉. 高可以使用max-hight, 不能使用min-hight

4、没有设置scroll-y


没有滚动到顶部触发下拉, 而是在可视页面中触发下拉

官方默认无论page的滚动条在哪个位置, 只要在scroll-view页面上下拉都会触发下拉函数, 这样用户体验非常差. 可以使用@scroll滚动时触发的函数来获取scroll-view滚动条的位置, 进而来控制refresher-enabled开启和关闭自定义下拉刷新. 当scroll-view的滚动条滚动到顶部时, 使refresher-enabled为true, 其他条件为false。


直接上代码看: 

html:

  1. <template>
  2. <view>
  3.   <scroll-view
  4.     show-scrollbar="true"
  5.     style="height: 300px"
  6.     scroll-y="true"
  7.     :refresher-enabled="isOpenRefresh"
  8.     :refresher-triggered="triggered"
  9.     :refresher-threshold="100"
  10.     refresher-background="gray"
  11.     @refresherpulling="onPulling"
  12.     @refresherrefresh="onRefresh"
  13.     @refresherrestore="onRestore"
  14.     @refresherabort="onAbort"
  15.     @scroll="onScroll"
  16.   >
  17.   <view v-if="!isOpenRefresh">别拉了,没有更多了~</view>
  18.   <view class="item" v-for="(item, index) in dataList" :key="index">{{ item }}</view>
  19.   </scroll-view>
  20. </view>
  21. </template>

基本上下拉刷新用到的属性方法也就这几个了!


js:

  1. export default {
  2.   data() {
  3.     return {
  4.       triggered: false,
  5.       dataList: [],
  6.       arr: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
  7.       page: 0,
  8.       isOpenRefresh: true // 是否开启下拉
  9.     };
  10.   },
  11.   onLoad() {
  12.     this._freshing = false;
  13.     this.getData()
  14.   },
  15.   methods: {
  16.     dealArray(array, groupNum) {
  17.       let temp = [];
  18.       for (let i = 0, len = array.length; i < len; i += groupNum) {
  19.         temp.push(array.slice(i, i + groupNum));
  20.       }
  21.       return temp;
  22.     },
  23.     // 自定义下拉刷新控件被下拉
  24.     onPulling(e) {
  25.       console.log("onpulling", e);
  26.       if (e.detail.deltaY < 0) return  // 防止上滑页面也触发下拉
  27.       this.triggered = true;
  28.     },
  29.     // 自定义下拉刷新被触发
  30.     onRefresh() {
  31.       if (this._freshing) return;
  32.       this._freshing = true;
  33.       this.page++;
  34.       setTimeout(() => {
  35.         this.triggered = false;
  36.         this._freshing = false;
  37.         this.getData();
  38.       }, 500);
  39.     },
  40.     // 自定义下拉刷新被复位
  41.     onRestore() {
  42.       this.triggered = 'restore'; // 需要重置
  43.       console.error("onRestore");
  44.     },
  45.     // 自定义下拉刷新被中止
  46.     onAbort() {
  47.       console.error("onAbort");
  48.     },
  49.     getData() {
  50.       // 前端模拟分页
  51.       let temp = this.dealArray(this.arr, 3) 
  52.       if (this.page > temp.length - 1) {
  53.         this.isOpenRefresh = false
  54.         return 
  55.       }
  56.       this.dataList.push(...temp[this.page])
  57.     }
  58.   },
  59. };


style:

  1. <style>
  2. view {
  3.   text-align: center;
  4. }
  5. .item:nth-child(odd) {
  6.   background-color: antiquewhite;
  7. }
  8. .item:nth-child(even) {
  9.   background-color: aquamarine;
  10. }
  11. </style>

【注意】scroll-view 下拉刷新会出现上滑页面也触发下拉,可以在 @refresherpulling="onPulling"这个方法,如下 if (e.detail.deltaY < 0) return // 防止上滑页面也触发下拉


演示:


Uniapp中怎么使用scrpll-view组件实现下拉刷新


出现,在页面上任意位置只要下滑动页面就会触发下拉,这类问题。可以使用@scrolltoupper="scrolltoupper"触顶函数,在这里面做一个准入可以解决!


  1. // 触顶操作-准入
  2. scrolltoupper() {
  3.     this.isAllowRefresh = true
  4. }
  5.  
  6. // 自定义下拉刷新控件被下拉
  7.  
  8. onPulling(e) {
  9.     if (e.detail.deltaY < 0) return
  10.     if (!this.isAllowRefresh) return;
  11.     this.isRefresh = true;
  12.     console.log("onpulling", e);
  13. }

也可以使用@scroll="onScroll"监听 scroll-top的值,让其 ===0时触发,也就是到达顶部!再触发!但是遇到其必须滑动一下页面出现滚动条,他才会监听!我们可以init的时候初始化一下,令其变量初始为0!

  1. export default class Index extends mixins(uiMixin) {
  2.     scrollTop: number = 0
  3.     // 监听页面是否滚动 
  4.     onScroll(e) {  
  5.       this.scrollTop = e.detail.scrollTop
  6.     }
  7.     // 自定义下拉刷新被触发
  8.   onRefresh() {
  9.     if (this.scrollTop === 0) {
  10.         if (this._freshing) return;
  11.         this._freshing = true;
  12.         this.page++;
  13.         setTimeout(() => {
  14.           this.triggered = false;
  15.           this._freshing = false;
  16.           this.getData();
  17.        }, 500);
  18.     }
  19.   }
  20. })


本文网址:https://www.zztuku.com/index.php/detail-10215.html
站长图库 - Uniapp中怎么使用scrpll-view组件实现下拉刷新
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐