![]() |
3 år sedan | |
---|---|---|
.. | ||
components | 3 år sedan | |
changelog.md | 3 år sedan | |
package.json | 3 år sedan | |
readme.md | 3 år sedan |
【uni-app自动分页器】超简单,低耦合!仅需两步轻松完成完整分页逻辑(下拉刷新、上拉加载更多),分页全自动处理。支持自定义加载更多的文字或整个view,自定义下拉刷新样式,自动管理空数据view,支持吸顶效果,支持国际化等。
【注意】由V1.9.0起,fixed属性默认值为true,z-paging默认会铺满屏幕。老项目更新请注意,使用侧滑滚动切换选项卡或需要局部使用z-paging请设置:fixed="false"。如果您希望fixed属性默认为false,请参考文档:z-paging.com,将fixed默认值设置为false。
z-paging
支持easycom组件规范,无需引用和注册组件即可直接使用,在正在运行的项目中导入z-paging
可能会提示:Unknown custom element:<z-paging> - did you register the component corrently?...
,此时需要重新运行项目即可。
自定义下拉刷新效果+分页演示 | 吸顶效果+分页演示 |
---|---|
![]() |
![]() |
滑动切换选项卡+分页演示 | 聊天记录模式+分页演示 |
---|---|
![]() |
![]() |
扫码体验 |
---|
![]() |
uni_modules
,下载完整示例时组件在uni_modules
目录下。<template>
中使用@query绑定js中分页请求的方法(z-paging
会将计算好的pageNo和pageSize两个参数传递到此方法中),然后通过v-model
绑定列表for循环的list。z-paging
的complete()
方法,将请求返回的数组传递给z-paging
处理,如:this.$refs.paging.complete(服务器返回的数组);
;若请求失败,调用:this.$refs.paging.complete(false);
即可。this.$refs.paging.reload()
刷新整个列表。<template>
<view class="content">
<z-paging ref="paging" v-model="dataList" @query="queryList">
<!-- list数据,建议像下方这样在item外层套一个view,而非直接for循环item,因为slot插入有数量限制 -->
<view>
<view class="item" v-for="(item,index) in dataList">
<view class="item-title">{{item.title}}</view>
</view>
</view>
</z-paging>
</view>
</template>
<script>
export default {
data() {
return {
dataList: [],
};
},
methods: {
queryList(pageNo, pageSize) {
//这里的pageNo和pageSize会自动计算好,直接传给服务器即可
//这里的请求只是演示,请替换成自己的项目的网络请求,请在网络请求回调中
//通过this.$refs.paging.complete(请求回来的数组);将请求结果传给z-paging
this.$request.queryList(pageNo, pageSize, (data) => {
this.$refs.paging.complete(data);
});
},
},
};
</script>
<style scoped>
</style>
<z-paging ref="paging" v-model="dataList" @query="queryList">
<!-- 设置自己的emptyView组件,非必须。空数据时会自动展示空数据组件,不需要自己处理 -->
<empty-view slot="empty"></empty-view>
<view>
<view class="item" v-for="(item,index) in dataList">
<view class="item-title">{{item.title}}</view>
</view>
</view>
</z-paging>
<z-paging ref="paging" v-model="dataList" loading-more-no-more-text="我也是有底线的!" @query="queryList">
<!-- 设置自己的emptyView组件,非必须。空数据时会自动展示空数据组件,不需要自己处理 -->
<view>
<view class="item" v-for="(item,index) in dataList">
<view class="item-title">{{item.title}}</view>
</view>
</view>
</z-paging>
use-custom-refresher
需要设置为true(默认为true),此时将不会使用uni自带的下拉刷新,转为使用z-paging自定义的下拉刷新,通过slot可以插入开发者自定义的下拉刷新view。<z-paging ref="paging" v-model="dataList" :refresher-threshold="80" @query="queryList">
<!-- 自定义下拉刷新view -->
<!-- 注意注意注意!!QQ小程序或字节跳动小程序中自定义下拉刷新不支持slot-scope,将导致custom-refresher无法显示 -->
<!-- 如果是QQ小程序或字节跳动小程序,请参照demo中的sticky-demo.vue中的写法,此处使用slot-scope是为了减少data中无关变量声明,降低依赖 -->
<custom-refresher slot="refresher" slot-scope="{refresherStatus}" :status="refresherStatus"></custom-refresher>
<!-- list数据,建议像下方这样在item外层套一个view,而非直接for循环item,因为slot插入有数量限制 -->
<view>
<view class="item" v-for="(item,index) in dataList" @click="itemClick(item)">
<view class="item-title">{{item.title}}</view>
<view class="item-detail">{{item.detail}}</view>
<view class="item-line"></view>
</view>
</view>
</z-paging>
<z-paging ref="paging" v-model="dataList" @query="queryList">
<view>
<view class="item" v-for="(item,index) in dataList">
<view class="item-title">{{item.title}}</view>
</view>
</view>
<view style="background-color: red" slot="loadingMoreNoMore">这是完全自定义的没有更多数据view</view>
</z-paging>
<!-- 使用页面滚动示例(无需设置z-paging的高度) -->
<template>
<view class="content">
<!-- 此时使用了页面的滚动,z-paging不需要有确定的高度,use-page-scroll需要设置为true -->
<!-- 注意注意!!这里的ref必须设置且必须等于"paging",否则mixin方法无效 -->
<z-paging ref="paging" v-model="dataList" use-page-scroll @query="queryList">
<!-- 如果希望其他view跟着页面滚动,可以放在z-paging标签内 -->
<!-- list数据,建议像下方这样在item外层套一个view,而非直接for循环item,因为slot插入有数量限制 -->
<view>
<view class="item" v-for="(item,index) in dataList" :key="index" @click="itemClick(item)">
<view class="item-title">{{item.title}}</view>
<view class="item-detail">{{item.detail}}</view>
<view class="item-line"></view>
</view>
</view>
</z-paging>
</view>
</template>
<script>
//使用页面滚动时引入此mixin,用于监听和处理onPullDownRefresh等页面生命周期方法(如果全局引入了,就不要这一步,全局引入示例见main.js)
import ZPagingMixin from '@/uni_modules/z-paging/components/z-paging/js/z-paging-mixin'
export default {
//注意这一步不要漏掉,必须注册mixins(如果全局引入了,就不要这一步,全局引入示例见main.js)
mixins: [ZPagingMixin],
data() {
//参见demo
},
methods: {
//参见demo
}
}
</script>
i18n-demo.vue
使用内置scroll-view滚动 | 使用页面滚动 | 使用nvue | |
---|---|---|---|
说明 | 默认模式,z-paging 需要有确定的高度,下拉刷新与上拉加载更多由z-paging 内部处理,配置简单。 |
use-page-scroll 设置为true时生效,使用页面滚动而非内置scroll-view滚动,无需固定z-paging 的高度,但需要在页面滚动到底部时调用z-paging 的doLoadMore() 方法。当使用页面的下拉刷新时,需要引入mixin(可全局引入),具体可参见demo。 |
创建nvue页面并引入z-paging 且运行在APP上生效,z-paging 将使用nvue独有的<list> 和<refresh> 代替原有的scroll-view和自定义的下拉刷新,可大幅提升性能。 |
性能 | 不佳 | 一般 | 优 |
优缺点 | 【优点】配置简单、耦合度低。普通的简单列表不会有明显卡顿。 【缺点】需要固定 z-paging 高度,超出页面部分渲染的资源无法自动回收,当列表item比较复杂或数据量过多时,可能会造成明显卡顿。 |
【优点】性能优于使用内置的scroll-view滚动,超出页面部分渲染的资源会自动回收,能适应绝大多数列表滚动的情况,即使列表item比较复杂,一般也不会感知到卡顿。 【缺点】配置略麻烦,耦合度较高。 |
【优点】原生渲染,极致性能,<list> 组件在不可见部分的渲染资源回收有特殊的优化处理,<refresh> 组件是app端独有的下拉刷新组件,性能远超普通vue页面中的自定义下拉刷新。【缺点】仅App端支持,nvue页面写法不如vue页面方便,在 z-paging 中一些配置和方法在nvue中不支持,且nvue页面中支持的第三方组件也比vue页面少。 |
z-paging
。【若无法下拉刷新】请确认要在@query所绑定的方法中调用this.$refs.paging.complete()
,无论是否需要网络请求都要调用,只有告知z-paging刷新状态结束了,才可以开始下次的下拉刷新。
【使用内置scroll-view滚动时】z-paging必须有确定的高度!否则上拉加载更多将无法触发,建议设置:fixed=true
即可不设置高度!!(不希望跟着滚动的view可以设置slot="top"
)。
【使用页面滚动时】使用z-paging内置的scroll-view滚动性能不及使用页面的滚动。若您要使用页面的滚动,请勿固定z-paging的高度,并且必须设置use-page-scroll
为true,否则将导致页面无法滚动(不希望跟着滚动的view可以设置slot="top"
)。
【使用页面滚动时】必须引入mixin(可全局引入)(具体可参照demo中的page-default-demo.vue
文件)
或在页面的onReachBottom
事件中调用this.$refs.paging.doLoadMore()
且在onPageScroll(e)
事件中调用this.$refs.paging.updatePageScrollTop(e.scrollTop)
。(具体可参照demo中的page-default-demo.vue
文件)
【出现实际上有更多数据,而显示没有更多数据时】默认的pageSize(每页显示数量)为10,如果您服务端不需要传pageSize(例如有默认的pageSize:8),则您需要将默认的pageSize改成您与后端约定好的(8),若没有修改,则z-paging会认为传给服务端的pageSize是10,而服务端只返回了8条,因此会直接判定为没有更多数据。
【若页面无法滚动】请检查z-paging是否有固定的高度;若您想使用页面滚动而非z-paging内置的scroll-view的滚动,请设置use-page-scroll
为true。
【关于自定义导航栏】若设置了:fixed=true
,则必须将自定义导航栏放在z-paging标签中且添加slot="top",如:<custom-nav slot="top"></custom-nav>
,如果有多个需要固定顶部的元素,则书写<view slot="top">需要固定顶部的元素</view>
。