Coder Social home page Coder Social logo

wzs28150 / coolui-scroller Goto Github PK

View Code? Open in Web Editor NEW
191.0 4.0 46.0 9.38 MB

微信小程序下拉刷新上拉加载组件

Home Page: https://wzs28150.github.io/coolui-scroller/v3/

JavaScript 3.87% SCSS 2.34% HTML 93.79%
weapp scroller pull-to-refresh push-to-loadmore

coolui-scroller's Introduction

coolui-scroller

Version  License  Download  Stars

前言

初衷

本来写这个组件的初衷,是在我写了一个小程序之后,发现小程序如果要实现下拉刷新、上拉加载有两种方式:

  1. 页面级的:利用页面 Page 里提供的方法。下拉虽说是那个东西但是它只有下拉三个点的动画效果而且只能显示在头部就很尴尬。很多时候一个列表的头部往往会有一些组件比如搜索、分类导航等等。所以往往列表都是局部的非页面级的。这时候下拉时动画出现在最顶部就显得很突兀。
Page({
  onPullDownRefresh: function () {
    // 监听用户下拉刷新事件。
  },
  onReachBottom: function () {
    // 监听用户上拉触底事件。
  },
  onPageScroll: function () {
    // 监听用户滑动页面事件。
  },
})
  1. 组件级的:利用 scroll-view。 但是当你打开 scroll-view 官方文档时,映入眼帘的是一列列的参数属性方法。要完全弄懂里面的内容,恐怕你得上手写写,挨个试试里面的参数和方法才行。而对于下拉刷新这个效果文档上有个简易的 demo 可寻。上拉加载也只有 bindscrolltolower 这么个方法和 lower-threshold 阈值。所以要实现起来完全还得靠自己。

所以在写项目的最后我把页面的列表下拉刷新,上拉加载进行了初步的封装。单独拿出来方便之后重复使用。所以有了起初的 1.0 版。

发展

V2.0

scroll-view 组件初期并没有那么多配置,所以 1.0 实现的效果很有限。 后来随着官方 scroll-view 组件的不断的更新。增加了很多新的属性和事件使得下拉可以自定义起来。虽然也有很多地方不尽人意,但是可玩度还是有很多的。所以又升级了 2.0 版增加了很多下拉的自定义动画效果和上拉加载的效果。

2.0 版组件还是围绕着 scroll-view,写法上只有一个封装好的 scroller 组件。内置了一个基础的下拉效果。提供下拉的插槽位置。并给出了几个有趣的下拉效果 demo(如:天猫效果、京东小人效果)让下拉又有了更多的可能性;配置上也考虑了很多增加了列表为空时的设置上拉加载的配置。整个配置就是一个 Obj,细化到文字、背景。

V2.0 配置:

// data 中配置
scroll: {
  //  设置分页信息
  pagination: {
    page: 1,
    totalPage: 10,
    limit: 10,
    length: 100
  },
  // 设置数据为空时的图片
  empty: {
    img: 'http://coolui.coolwl.cn/assets/mescroll-empty.png'
  },
  // 设置下拉刷新
  refresh: {
    type: 'default',
    style: 'black',
    background: "#000"
  },
  // 设置上拉加载
  loadmore: {
    type: 'default',
    icon: 'http://upload-images.jianshu.io/upload_images/5726812-95bd7570a25bd4ee.gif',
    background: '#f2f2f2',
    // backgroundImage: 'http://coolui.coolwl.cn/assets/bg.jpg',
    title: {
      show: true,
      text: '加载中',
      color: "#999",
      shadow: 5
    }
  }
},

之后由于疫情及个人原因这个组件搁置了一阵子。当我再次打开它时便有了重构的想法。

V3.0

3.0 版打算把之前各个部分的插槽进行细化及拆分。并新增空列表插槽及组件、初次进入程序时的手势提示组件、顶部插槽及顶部插槽可用的组件(如:搜索组件、分类组件、下拉筛选组件)。

除了组件的变化外,核心列表准备加入长列表处理,解决数据量大时列表会出现的问题(如:setData 加载大数据的耗时高、列表渲染出来的 Dom 结构多、占用的内存高,造成页面被系统回收的概率变大等)。起初想以官方给出的 recycle-view 组件进行扩展。但是使用中,遇到很多坑及不方便之处。最让我接受不了的是需要设置 itemSize 这个方法。当我在不确定列表元素宽高的时候就很难设置。后来经过大量的思考和查资料及尝试。决定采用知乎上 daisy 提出的长列表解决方案。

该组件还在开发中各组件陆续上线~

v3.0 版

  1. 基于小程序原生组件 scroll-view 的扩展与封装,实现简单的上拉加载下拉刷新
  2. 扩展下拉刷新动画,有灵感的朋友可以丰富更多下拉动画
  3. 上传至 npm 包可安装下载并 npm 构建
  4. 修改参数配置使组件使用更便捷
  5. 增加加载插槽可以自定义加载更多样式
  6. 增加多组件配合使列表功能更丰富

开发进度

  1. 调整为虚拟长列表模式
  2. 支持多组件搭配,使插件更灵活
  3. 新增组件 coolui-scroller-item(列表项组件)
  4. 新增组件 coolui-scroller-page(长列表分页组件)
  5. 新增组件 coolui-scroller-empty(空列表组件)
  6. 新增组件 coolui-scroller-handtip(手势提示组件)
  7. 新增组件 coolui-scroller-loadmore(加载更多组件)
  8. 新增组件 coolui-scroller-nav(分类导航组件)
  9. 新增组件 coolui-scroller-refresh(下拉刷新组件)
  10. 新增组件 coolui-scroller-parallax(下拉刷新视差位移组件)
  11. 新增组件 coolui-scroller-search(搜索组件)
  12. 新增组件 coolui-scroller-sort(分类筛选及排序组件)
  13. 新增组件 coolui-scroller-floor(下拉二楼组件)

支持 coolui-scroller

做一个组件库是一个繁琐且长期的事情,接下来我将花费业余时间进行多版本的完善。 如果 coolui-scroller 对您的工作或者学习有所帮助,您可以捐赠 coolui-scroller 的研发工作,捐赠无门槛,哪怕是一瓶肥宅快乐水,也可以帮助我多敲半小时代码。

微信 支付宝
微信 支付宝

微信群

示例 demo

请微信扫码打开小程序查看

示例

示例代码: https://github.com/wzs28150/coolui-scroller/tree/demo

请 clone 下载到本地使用微信开发者工具查看

git clone -b demo  https://github.com/wzs28150/coolui-scroller.git

安装

npm 安装

npm i coolui-scroller --production

npm 构建

安装之后开发者工具点击 npm 构建:
npm构建1
当看到站点里面出现 miniprogram_npm 文件夹就算安装完成了
npm构建2

引入

1.调用组件

app.jsonindex.json中引入组件

"usingComponents": {
  "scroller": "coolui-scroller/scroller/index"
}

2.页面结构

<scroller class="my-scroller"> </scroller>

3.配置

在 js 的 data 中进行配置参数设置,v3.0 版将功能细化到各个组件中具体配置详见(组件)

4.组件

根据自己的业务场景选用组件,也可以在对应的插槽中自定义

coolui-scroller's People

Contributors

wzs28150 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

coolui-scroller's Issues

scroll-page卡顿问题

也许是因为单页的obj要比demo复杂的问题(一页15条,每条16个字段),滑动稍快一点在已转换为高度的边界就会卡顿了……这样并不符合长列表的预期,极端操作下每滑几页都会出现卡顿

全局设置名为`flex`的class,引起警告:设置 enable-flex 属性以使 flexbox 布局生效

我在全局设置了一个class

.flex {
display:flex;
}

微信开发者工具的console发出警告:设置 enable-flex 属性以使 flexbox 布局生效
查询发现https://developers.weixin.qq.com/community/develop/doc/00068cac8e05d8ac2ae86d8fc5ec00 这里提示要增加enable-flex属性到scroll-view

查看了coolui-scroller/scroller/index.wxml的第5行,使用了flex这样一个class,可能这里受到了我全局class的影响

在引用组件界面是否支持bindscroll监听?

在引用组件界面是否支持bindscroll监听?
比如像在监听滚动停止后, 处理一些事情.
或者isBackBtn是否支持启用滚动停止后设置多少秒进行隐藏isBackBtn, 因为如果isBackBtn一直显示的话, 在界面中会遮挡一些操作,以至于每个界面都得去调整它的bottom

空状态时 class slot-empty有背景色

目前我的项目采用了van-empty作为空状态的提示,但是默认的empty slot具有class slot-empty,因此导致背景色不一致。
.slot-empty {
// 修复下拉组件空状态时有背景色的问题
background-color: unset !important;
}
我在全局设置了这样一个class 用来取消您组件里的空状态背景色,但是还是希望可以提供方法来取消,谢谢

"coolui-scroller": "^3.3.3",存在滑动抖动的bug

在iOS机型先缓慢下拉刷新,刷新结束后再缓慢下拉刷新就会出现列表整体抖动的问题,演示小程序的“组合使用”里就可以复现,同样的步骤,Android机型上的现象是卡顿

scroller使用header的slot时,在iOS真机下会把header滚动出去

scroller使用header的slot时,在iOS真机下会把header滚动出去
版本号:3.3.2
当使用loadmore加载完更多的数据后,iOS真机会滚动出去,模拟器和安卓版不会。

好像是iOS真机计算scroller的height有问题

22_1704341612.mp4

示例代码:

wxml:

<scroller class="scroller"
          isEmpty="{{list.length===0}}"
          bind:loadmore="onLoadMore"
          bind:refresh="onRefresh">
    <view slot="header">
        <view>header</view>
    </view>
    <refresh slot="refresh"
             type="base"
             config="{{config}}"
    />
    <view class="default-margin-horizontal default-border store"
          wx:for="{{ list }}"
          wx:key="index"
          data-id="{{item.id}}">
        <view class="info">
            {{ item.name }}
        </view>
    </view>
    <loadmore slot="loadmore"
              status="{{loadMoreSetting.status}}"
              loading="{{loadMoreSetting.loading}}"
              noMore="{{loadMoreSetting.noMore}}"
              more="{{loadMoreSetting.more}}"/>
</scroller>

js:

Page({
    data: {
        config: {
            shake: false, // 是否开启下拉震动
            height: 70, // 下拉高度
            text: {
                color: '#FE6921', // 文字颜色
                shadow: 5, // 是否开启shadow阴影,0为不开启,数值越大阴影范围越大
            },
            background: {
                color: '#FFFFFF',
                height: 120, // 设置背景大于下拉高度
                // TODO
                // img: 'https://test.wzs.pub/pic/bg.jpg',
            },
        },
        loadMoreSetting: {
            status: 'more',
            loading: {text: '加载中...'},
            more: {text: '加载更多'},
            noMore: {text: '没有更多了'},
        },
        total: 6,
        page: {
            num: 1,
        },
        list: [],
    },

    async onLoad() {
        await this.onRefresh();
    },

    async onRefresh() {
        const page = this.data.page;
        page.num = 1;
        console.log('refresh');
        const setting = this.data.loadMoreSetting;
        setting.status = 'loading';
        this.setData({
            loadMoreSetting: setting,
        });
        const result = this.getStores();
        if (result.code === 0) {
            this.setData({
                list: result.data.list,
            });
        }
        setting.status = 'more';
        this.setData({
            loadMoreSetting: setting,
        });
    },

    async onLoadMore() {
        console.log('load more, page: ', this.data.page);
        const setting = this.data.loadMoreSetting;
        if (setting.status === 'loading') {
            return;
        }

        const page = this.data.page;
        const num = page.num + 1;
        if (num > this.data.total) {
            setting.status = 'noMore';
            this.setData({
                loadMoreSetting: setting,
            });
            return;
        }

        setting.status = 'loading';
        this.setData({
            loadMoreSetting: setting,
        });

        let result = this.getStores();
        if (result.code === 0) {
            const list = this.data.list.concat(result.data.list);
            this.setData({
                page: {
                    num: num,
                },
                list: list,
            });
        }
        setting.status = 'more';
        this.setData({
            loadMoreSetting: setting,
        });
    },

    getStores(event) {
        return {
            code: 0,
            data: {
                page: {
                    size: 10,
                    num: 1,
                    total: 2,
                },
                list: [
                    {
                        id: 1,
                        name: '店铺1',
                        address: '广东省广州市天河区',
                        phone: '123456789',
                    },
                    {
                        id: 2,
                        name: '店铺2',
                        address: '广东省广州市天河区',
                        phone: '123456789',
                    },
                    {
                        id: 3,
                        name: '店铺3',
                        address: '广东省广州市天河区',
                        phone: '123456789',
                    }
                ]
            }
        };
    },
});

IOS手机下拉刷新无法触发

IOS手机下拉的时候会有自带的弹性下拉,所以下拉刷新与界面默认下拉冲突导致不能触发下拉事件

that.selectComponent is not a function 报错

代码是用 Mpvue 写的,在微信开发者工具里报错,一直隐藏不掉
微信截图_20201125143534
代码如下:

<template>
  <div class="record">
    <van-tabs type="card" custom-class="rec-tabs" nav-class="rec-tabs-nav" tab-class="rec-tab" tab-active-class="rec-tab-active" @change="onChange">
      <van-tab title="今天" name="today">
        <div class="tab-inner">
          <coolui-scroll class="demo" :scrollOption="scroll" @refresh="refresh" @loadMore="loadMore">
            <!-- <view class="list-inner" slot="inner">
              <view class="item" v-for="(item, index) in list" :key="index">{{item + 1}}条内容
              </view>
            </view> -->
            <!-- 循环内容 -->
            <div class="record-inner" @click="gotoViolation(item.recordId)" v-if="todayRecord" v-for="(item, index) in todayRecord" :key="index">
              <van-cell-group>
                <van-cell :title="title[item.trashType]" title-class="record-title" custom-class="record-first">
                  <span class="tag" :class="className[item.status]">{{ status[item.status] }}</span>
                </van-cell>
                <van-cell :border="false">
                  <view slot="title" class="record-date-wrap">
                    <van-icon :name="config.url + '/static/images/ico-date.png'"/>
                    <span class="record-date">{{ item.createTime }}</span>
                  </view>
                </van-cell>
                <van-cell custom-class="record-last">
                  <view slot="title">
                    <van-icon :name="config.url + '/static/images/ico-local.png'"/>
                    <span class="record-community">{{ item.estateName }}</span><span class="record-point">{{ item.pointName }}点位</span>
                  </view>
                </van-cell>
              </van-cell-group>
            </div>
            <!-- 循环内容 end -->
          </coolui-scroll>
        </div>
      </van-tab>
      <van-tab title="历史记录" name="histroy">
        <div class="tab-inner">
          <coolui-scroll class="demoH" :scrollOption="scrollH" @refresh="refreshH" @loadMore="loadMoreH">
            <!-- <view class="list-inner" slot="inner">
              <view class="item" v-for="(item, index) in list" :key="index">{{item + 1}}条内容
              </view>
            </view> -->
            <view class="list-inner" slot="inner">
              <!-- 循环内容 -->
              <div class="record-inner" @click="gotoViolation(item.recordId)" v-for="(item, index) in histroyRecord" :key="index">
                <van-cell-group>
                  <van-cell :title="title[item.trashType]" title-class="record-title" custom-class="record-first">
                    <span class="tag" :class="className[item.status]">{{ status[item.status] }}</span>
                  </van-cell>
                  <van-cell :border="false">
                    <view slot="title" class="record-date-wrap">
                      <van-icon :name="config.url + '/static/images/ico-date.png'"/>
                      <span class="record-date">{{ item.createTime }}</span>
                    </view>
                  </van-cell>
                  <van-cell custom-class="record-last">
                    <view slot="title">
                      <van-icon :name="config.url + '/static/images/ico-local.png'"/>
                      <span class="record-community">{{ item.estateName }}</span><span class="record-point">{{ item.pointName }}点位</span>
                    </view>
                  </van-cell>
                </van-cell-group>
              </div>
              <!-- 循环内容 end -->
            </view>
          </coolui-scroll>
        </div>
      </van-tab>
    </van-tabs>
  </div>
</template>

<script>
  import {
    getDeliRecord
  } from '@/api'
  import {
    getStorageSync,
    showToast
  } from '@/api/wechat'
  import { handleError } from '@/utils'

  export default {
    props: {
      flag: {
        type: Boolean,
        default: true
      }
    },
    data() {
      return {
        config: this.CONFIG,
        openId: null,
        temp: null,
        todayRecord: null,
        histroyRecord: null,
        title: {
          1: '厨余垃圾',
          2: '其他垃圾'
        },
        status: {
          0: '正常',
          2: '违规',
          3: '待提高'
        },
        className: {
          0: 'success',
          2: 'fail',
          3: 'warn'
        },
        // coolui-scroll 配置
        list: [], // 测试字段
        scroll: {
          //  设置分页信息
          pagination: {
            page: 1,
            totalPage: 20,
            limit: 5,
            length: 100
          },
          // 设置数据为空时的图片
          empty: {
            img: 'http://coolui.coolwl.cn/assets/mescroll-empty.png'
          },
          // 设置下拉刷新
          refresh: {
            type: 'default',
            style: 'black',
            background: '#000'
          },
          // 设置上拉加载
          loadmore: {
            type: 'default',
            icon: 'http://upload-images.jianshu.io/upload_images/5726812-95bd7570a25bd4ee.gif',
            background: '#f2f2f2',
            // backgroundImage: 'http://coolui.coolwl.cn/assets/bg.jpg',
            title: {
              show: true,
              text: '加载中',
              color: '#999',
              shadow: 5
            }
          }
        },
        scrollH: {
          //  设置分页信息
          pagination: {
            page: 1,
            totalPage: 20,
            limit: 5,
            length: 100
          },
          // 设置数据为空时的图片
          empty: {
            img: 'http://coolui.coolwl.cn/assets/mescroll-empty.png'
          },
          // 设置下拉刷新
          refresh: {
            type: 'default',
            style: 'black',
            background: '#000'
          },
          // 设置上拉加载
          loadmore: {
            type: 'default',
            icon: 'http://upload-images.jianshu.io/upload_images/5726812-95bd7570a25bd4ee.gif',
            background: '#f2f2f2',
            // backgroundImage: 'http://coolui.coolwl.cn/assets/bg.jpg',
            title: {
              show: true,
              text: '加载中',
              color: '#999',
              shadow: 5
            }
          }
        }
      }
    },
    created() {
      this.openId = getStorageSync('openId')
      this.openId = 'oN5wB5b5lqb7dpetlQb6zgVSOhc0'
    },
    mounted() {
      this.init()
    },
    methods: {
      init() {
        this.getTodayRecord(1)
      },
      onChange(event) {
        // console.log(event)
        if (event.mp.detail.index === 0) {
          this.getTodayRecord(1)
        } else {
          this.getHistroyRecord(1)
        }
      },
      getTodayRecord(pageSize) {
        var record = {
          openId: this.openId,
          dataType: 't',
          pageNum: 5,
          pageSize: pageSize
        }
        this.getDeliRecord(record, 'todayRecord')
      },
      getHistroyRecord(pageSize) {
        var record = {
          openId: this.openId,
          dataType: 'h',
          pageNum: 5,
          pageSize: pageSize
        }
        this.getDeliRecord(record, 'histroyRecord')
      },
      getDeliRecord(record, which) {
        getDeliRecord(record).then(res => {
          if (handleError(res)) {
            // console.log(res.data)
            // console.log(res.data.data)
            if (!res.data.data) {
              showToast(res.data.msg)
              return
            }
            this[which] = res.data.data
          }
        })
      },
      gotoViolation(recordId) {
        const query = { recordId: recordId }
        this.$router.push({
          path: '/pages/violation/main',
          query
        })
      },
      // 加载数据
      getData(type) {
        var that = this
        // 可走后台接口
        if (type === 'refresh') {
          // 刷新时执行
          // 设置页数1
          var scroll = that.scroll
          scroll.pagination.page = 1
          setTimeout(function () {
            that.getTodayRecord(1)
            that.scroll = scroll
          }, 300)
        } else {
          // 加载时执行
          // 设置页数+1
          var _scroll = that.scroll
          _scroll.pagination.page = _scroll.pagination.page + 1

          if (_scroll.pagination.page <= that.scroll.pagination.totalPage) {
            that.getTodayRecord(_scroll.pagination.page)
            that.scroll = _scroll
          }

          that.selectComponent('.demo').loadEnd()
        }
      },
      // 下拉 刷新 页数设置1
      refresh() {
        this.getData('refresh')
      },
      // 上拉 加载 页数设置+1
      loadMore() {
        this.getData('loadMore')
      },
      // 自定义下拉刷新时执行 插槽下拉 返回的下拉进度p
      refreshPulling(e) {
        // p = e.detail.p
      },
      // 加载历史数据
      getDataH(type) {
        var that = this
        // 可走后台接口
        if (type === 'refresh') {
          // 刷新时执行
          // 设置页数1
          var scrollH = that.scrollH
          scrollH.pagination.page = 1
          setTimeout(function () {
            that.getHistroyRecord(1)
            // that.list = [1, 2, 3, 4, 5]
            that.scrollH = scrollH
          }, 300)
        } else {
          // 加载时执行
          // 设置页数+1
          var _scrollH = that.scrollH
          _scrollH.pagination.page = _scrollH.pagination.page + 1

          if (_scrollH.pagination.page <= that.scrollH.pagination.totalPage) {
            that.getHistroyRecord(_scrollH.pagination.page)
            // that.list = that.list.concat([1, 2, 3, 4, 5])
            that.scrollH = _scrollH
          }

          that.selectComponent('.demoH').loadEnd()
        }
      },
      // 下拉 刷新 页数设置1
      refreshH() {
        this.getDataH('refresh')
      },
      // 上拉 加载 页数设置+1
      loadMoreH() {
        this.getDataH('loadMore')
      }
    }
  }
</script>

<style lang="scss">
  .van-tabs__scroll {
    margin: 0 !important;
    background: none !important;
  }
  .van-tabs__content {
    margin-top: 14px;
  }
  .rec-tabs{
    margin-top: 14px;
    height: 170px !important;
    line-height: 170px !important;
  }
  .rec-tabs-nav {
    margin-bottom: 14px !important;
    border-color: #f98839 !important;
  }
  .rec-tab {
    border-right-color: #f98839 !important;
    color: #f98839 !important;
  }
  .rec-tab-active {
    background-color: #f98839 !important;
    color: #fff !important;
  }
  .record-first {
    border-radius: 4px 4px 0 0;
  }
  .record-last {
    border-radius: 0 0 4px 4px;
  }
  .record-title {
    font-size: 16px;
    font-weight: bold;
  }
</style>

<style lang="scss" scoped>
  .record {
    padding: 0 16px 10px;
    height: 100vh;
    .tab-inner {
      height: calc(100vh - 44px);
    }
    .record-inner {
      margin-bottom: 10px;
      .tag {
        font-size: 12px;
        color: #ffffff;
        width: 50px;
        height: 24px;
        line-height: 24px;
        display: inline-block;
        text-align: center;
        background-size: 100% 100% !important;
        &.warn {
          background-image: url($url + '/static/images/btn-warn.png');
        }
        &.success {
          background-image: url($url + '/static/images/btn-success.png');
        }
        &.fail {
          background-image: url($url + '/static/images/btn-fail.png');
        }
      }
      .record-date-wrap {
        display: flex;
        align-items: center;
      }
      .record-date, .record-community, .record-point {
        margin-left: 12px;
        color: #999999;
        font-size: 14px;
      }
    }
  }
</style>

Nav分类导航组件左右滑动不生效

添加了 触摸开始和结束事件 并没有生效 而且组件封装的时候 这两个方法是否可以直接封装到组件内,外部使用只需要一个参数是否开启滑动切换即可?

loadmore组件的no more颜色属性不起作用

loadmore slot里,设置color,不生效:
.js文件:

        loadMoreSetting: {
            status: 'more',
            loading: {text: '加载中...', color: '#FFFFFF'},
            more: {text: '加载更多', color: '#FFFFFF'},
            noMore: {text: '没有更多了', color: '#FFFFFF'},
        },

slot:

            <loadmore slot="loadmore"
                      status="{{loadMoreSetting.status}}"
                      loading="{{loadMoreSetting.loading}}"
                      noMore="{{loadMoreSetting.noMore}}"
                      more="{{loadMoreSetting.more}}"/>

看了一下源码,把block修改为view就可以了。

将:

<view class="coolui-scroller-loadmore">
  <block wx:if="{{status === 'more'}}" style="color: {{more.color}}">{{more.text}}</block>
  <block wx:elif="{{status === 'loading'}}">
    <view class="cool-indicator cool-indicator--isopened">
      <view class="cool-indicator__body">
        <view class="cool-loading">
          <view class="cool-loading__ring" style="border-color:{{loading.color}} transparent transparent;"></view>
          <view class="cool-loading__ring"  style="border-color:{{loading.color}} transparent transparent;"></view>
          <view class="cool-loading__ring"  style="border-color:{{loading.color}} transparent transparent;"></view>
        </view>
      </view>
    </view>
    <text class="at-indicator__content" style="color: {{loading.color}}">{{loading.text}}</text>
  </block>
  <block wx:elif="{{status === 'noMore'}}" style="color: {{noMore.color}}">{{noMore.text}}</block>
</view>

里面的block修改view

<view class="coolui-scroller-loadmore">
  <view wx:if="{{status === 'more'}}" style="color: {{more.color}}">{{more.text}}</view>
  <view wx:elif="{{status === 'loading'}}">
    <view class="cool-indicator cool-indicator--isopened">
      <view class="cool-indicator__body">
        <view class="cool-loading">
          <view class="cool-loading__ring" style="border-color:{{loading.color}} transparent transparent;"></view>
          <view class="cool-loading__ring"  style="border-color:{{loading.color}} transparent transparent;"></view>
          <view class="cool-loading__ring"  style="border-color:{{loading.color}} transparent transparent;"></view>
        </view>
      </view>
    </view>
    <text class="at-indicator__content" style="color: {{loading.color}}">{{loading.text}}</text>
  </view>
  <view wx:elif="{{status === 'noMore'}}" style="color: {{noMore.color}}">{{noMore.text}}</view>
</view>

下拉刷新在真机上效果非常卡顿

请问,我这边使用中,在开发工具中运行预览,滑动很流畅。
但是真机预览或发布后,在手机上下拉刷新会非常卡顿。
扫描文档中的二维码,测试下拉效果,也非常卡顿。
有什么办法可以消除这个问题吗?
感谢

下拉组件有问题

下拉组件拉到一点点松手会触发加载中,然后无论等多久,下次下拉一定是加载中图标和"下拉刷新字样"!

使用了hidden之后导致的高度问题

版本是3.x,有下面一个问题:
业务场景:有两个tab,tab里面都是放了两个上拉加载更多,第一个直接显示,第二个给了hidden来切换显示(如图下)
image
但是会发现一个bug,就是你切过去之后,第二个列表内容不会显示(如果用wx:if则会显示)。经过深入探究发现原来是hidden导致的问题,导致了scroll-view获取的高度为0了(如下图),这个怎么处理好呢?因为我总不能切换tab之后就重新渲染组件吧?(会重新刷新数据了),所以是不是源码中的获取高度的地方得改改呢?
b48bca3472f9132f152ea2048203049
image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.