# z-paging 使用模版 
# ✅ uniapp 插件
| 编译条件 | 标题 | 备注 |
|---|---|---|
| https://ext.dcloud.net.cn/plugin?id=3935 (opens new window) | 【z-paging下拉刷新、上拉加载】插件地址 | |
| https://z-paging.zxlee.cn/ (opens new window) | 【z-paging下拉刷新、上拉加载】文档 |
auto-clean-list-when-reload: 默认true reload时立即自动清空原list,若立即自动清空,则在reload之后、请求回调之前页面是空白的 auto-scroll-to-top-when-reload: reload时自动滚动到顶部(如果reload时list被清空导致占位消失也可能会自动返回到顶部,因此如果是这种情况还需要将auto-clean-list-when-reload设置为false) refresher-status.sync: 绑定下拉刷新状态改变的变量(页面data中声明的值),当下拉刷新状态改变时,此变量会跟着改变(0-默认状态 1.松手立即刷新 2.刷新中 3.刷新成功) auto-show-back-to-top: 默认false 自动显示点击返回顶部按钮 back-to-top-with-animate: 默认true 点击返回顶部按钮返回到顶部时是否展示过渡动画 auto: 默认true z-paging mounted后自动调用reload方法(mounted后自动调用接口)✅ Copy success!
# 基本使用
<template> <view class="view-"> <z-paging ref="paging" v-model="dataList" @query="queryList" :auto-clean-list-when-reload="false" :auto-scroll-to-top-when-reload="false" :refresher-status.sync="refresherStatus" :auto-show-back-to-top="true" :back-to-top-with-animate="true" :auto="false"> <template #top> <navbarback pageTitle="列表" bg="#fff" type="black"></navbarback> </template> <template #bottom> </template> </z-paging> </view> </template> <script> export default { data() { return { statusBarHeight: getApp().globalData.systemInfo.statusBarHeight, dataList: [], refresherStatus:null, page:1, limit:10, pageV2: 1, // 当前点击的第几页 indexV2: 0, // 当前点击数组里的第几项 pageScene: -1, // -1 首次 0=不需要刷新 1=需要替换列表数据item } }, onLoad(options) { this.$nextTick(()=>{ this.initListQuery() }) }, onShow() { }, methods: { queryList(page, limit) { this.page = page this.limit = limit this.getDataList() }, initListQuery() { this.$refs.paging.reload() }, /** * 为了更新数据 * */ initListQueryUpdate() { console.log('更新当前分页的数据_________________start') this.pageV2 = this.getPageV2(this.indexV2, this.limit) this.getDataList(this.pageV2) console.log('更新当前分页的数据_________________end') }, /** * 计算当前点击的页码 * * @param {Object} index * @param {Object} mylimit */ getPageV2(index, mylimit) { if (!mylimit) { return 1; } // 计算当前是第几页 return Math.floor(index / mylimit) + 1; }, onClickAddApi() { // 需要刷新 this.pageScene = -1; this.indexV2 = 0 }, async getDataList(pageV2) { let dataList = [] try { let params = { page:pageV2>-1?pageV2:this.page, limit:this.limit } let res = await myFollowList(params); uni.hideLoading() if (res.code === 0) { let resData = res.data dataList = resData.list console.log(resData,'resData') } } catch (err) { console.log(err,'err') } if (this.$refs.paging) { return this.$refs.paging.complete(dataList); } } }, } </script> <style lang="scss"> page { background-color: #f2f2f2; } </style>✅ Copy success!
# 非全屏 的z-paging
<!-- 使用页面滚动演示(nvue)(不建议,在nvue中,使用内置的list组件性能优于页面滚动,参见common-demo-n.nvue) --> <!-- 注意,在nvue中使用页面滚动时,无法使用z-paging的下拉刷新(因为z-paging在nvue中的下拉刷新使用的是原生refresh组件,它只能在scroller和list中使用) --> <!-- 若使用页面滚动时需要下拉刷新功能,请在pages.json中设置"enablePullDownRefresh": true开启页面下拉刷新功能 --> <template> <view class="content"> <z-paging ref="paging" v-model="dataList" use-page-scroll @query="queryList"> <!-- 需要固定在顶部不滚动的view放在slot="top"的view中,如果需要跟着滚动,则不要设置slot="top" --> <!-- 注意!此处的z-tabs为独立的组件,可替换为第三方的tabs,若需要使用z-tabs,请在插件市场搜索z-tabs并引入,否则会报插件找不到的错误 --> <template #top> </template> <view class="item" style="border-bottom: 1px solid red;" v-for="(item,index) in dataList" :key="item.title" @click="itemClick(item)"> <text class="item-title">{{item.title}}</text> <text class="item-detail">{{item.id}}</text> <view class="item-line"></view> </view> </z-paging> </view> </template> <script> // import request from '../../http/request.js' // 使用页面滚动时引入此mixin,用于监听和处理onPullDownRefresh等页面生命周期方法(如果全局引入了,就不要这一步,全局引入示例见main.js) import ZPMixin from '@/uni_modules/z-paging/components/z-paging/js/z-paging-mixin' export default { // 注意这一步不要漏掉,必须注册mixins(如果全局引入了,就不要这一步,全局引入示例见main.js) mixins: [ZPMixin], data() { return { // v-model绑定的这个变量不要在分页请求结束中自己赋值!!! dataList: [], tabList: ['测试1','测试2','测试3','测试4'], tabIndex: 0 } }, methods: { tabsChange(index) { this.tabIndex = index; // 当切换tab或搜索时请调用组件的reload方法,请勿直接调用:queryList方法!! this.$refs.paging.reload(); }, queryList(pageNo, pageSize) { // 组件加载时会自动触发此方法,因此默认页面加载时会自动触发,无需手动调用 // 这里的pageNo和pageSize会自动计算好,直接传给服务器即可 // 模拟请求服务器获取分页数据,请替换成自己的网络请求 const params = { pageNo: pageNo, pageSize: pageSize, type: this.tabIndex + 1 } let listlist = [ { id:1001, }, { id:1001, }, { id:1001, }, { id:1001, }, { id:1001, }, { id:1001, }, { id:1001, }, { id:1001, }, { id:1001, }, { id:1001, }, { id:1001, }, { id:1001, }, { id:1001, }, { id:1001, }, { id:1001, }, ] this.$refs.paging.complete(listlist); return request.queryList(params).then(res => { // 将请求的结果数组传递给z-paging this.$refs.paging.complete(res.data.list); }).catch(res => { // 如果请求失败写this.$refs.paging.complete(false); // 注意,每次都需要在catch中写这句话很麻烦,z-paging提供了方案可以全局统一处理 // 在底层的网络请求抛出异常时,写uni.$emit('z-paging-error-emit');即可 this.$refs.paging.complete(false); }) }, itemClick(item) { console.log('点击了', item.title); } } } </script> <style> .content { background-color: white; } .item { flex-direction: row; position: relative; height: 150rpx; align-items: center; justify-content: space-between; padding: 0rpx 30rpx; } .item-detail { padding: 5rpx 15rpx; border-radius: 10rpx; font-size: 28rpx; color: white; background-color: #007AFF; } .item-line { position: absolute; bottom: 0; left: 0; right: 0; height: 1px; background-color: #eeeeee; } </style>✅ Copy success!