使用 uniapp 框架开发需要自定义下拉刷新和自动加载?自带的 scrolltolower 事件有时候在意料之外触发?这个组件正在尝试高质量解决这些问题!该组件有以下特点:
- 使用 scroll-view 自定义下拉 + wxs 高性能操作 dom ,使用 IntersectionObserver 精准控制自动加载。
- 微信小程序、H5、APP体验基本一致。
- 除了 uniapp 运行时依赖,没有任何第三方依赖。
- 基于常用业务场景实现了一套开箱即用的规则,不喜欢的话支持自定义配置进行控制。
你有两种种方式预览
- 使用浏览器访问该地址:https://dimple-uni-scroll.vercel.app 进行预览(pc端注意开启开发者模式调整到移动设备)。
- 这个项目本身就是一个 uniapp 项目,git clone该项目到本地后,可使用HBuiderX导入该项目进行预览。
// 在命令行里执行
$ npm i @dimple-smile/uni-scroll
// 在你的代码里写
import DimpleUniScroll from '@dimple-smile/uni-scroll'
下面是一个简单的使用例子
注意:如果使用父元素使用flex:1设置高度,需要添加overflow: auto属性,让flex:1的元素变成滚动容器
在src/pages/index/index.vue文件里能看到预览使用的栗子
<template>
<view style="height: 400px">
<d-scroll :total="total" :skip="skip" @fetch="fetch">
<view v-for="(item, index) in list" :key="index">{{ index }}</view>
</d-scroll>
</view>
</template>
<script>
import DScroll from '@dimple-smile/uni-scroll'
export default {
components: { DScroll },
data() {
return {
list: [],
total: -1, // 默认值不能设置为0,初始值为0时无法判断是 一开始就无数据 还是 请求之后为无数据,当然可以用noData和noMore自行控制
skip: -1, // 默认值不能设置为0,理由同上,当然可以用noData和noMore自行控制
}
},
methods: {
async fetch(e) {
const { stop } = e
await this.getData(e)
stop()
},
async getData(options = {}) {
const { page = 1, skip = 0, limit = 20 } = options
const { total, data } = await new Promise((res) => setTimeout(() => res({ total: 100, data: Array(limit).fill('') }), 2000))
this.total = total
if (page === 1) this.list = []
this.list.push(...data)
this.skip = this.list.length
},
},
async mounted() {
uni.showLoading({ title: '加载中' })
await this.getData()
uni.hideLoading()
},
}
</script>
注意:limit、skip、total三个参数配合可以得出,是否没有数据 以及 是否已经加载完数据。注意都要在请求之后再改变skip和total,默认值不要设置为0。当然可以用noData和noMore自行控制。
注意:fetch是必须要handle的,handle后需要手动调用回调得到参数对象里的stop方法才能停止下拉/上拉动作。
src文件夹存放着组件的全部源码。入口为src/components/dimple-uni-scroll.vue。
@dimple-smile
Love
只要不商用,注明出处即可。
GNU General Public License version 3
谢谢你的使用~