diff --git a/manifest.json b/manifest.json index 3b9be0f..2b342a8 100644 --- a/manifest.json +++ b/manifest.json @@ -2,8 +2,8 @@ "name" : "心灵空间", "appid" : "__UNI__BBBDFD2", "description" : "心灵空间", - "versionName" : "1.0.11", - "versionCode" : 1011, + "versionName" : "1.0.22", + "versionCode" : 1022, "transformPx" : false, /* 5+App特有相关 */ "app-plus" : { @@ -30,7 +30,7 @@ "prompt" : "template", "template" : { "title" : "用户协议和隐私政策", - "message" : "请你务必审慎阅读、充分理解“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。
  你可阅读《用户协议》《隐私协议》了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。", + "message" : "请你务必审慎阅读、充分理解“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。
你可阅读《用户协议》《隐私协议》了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。", "buttonAccept" : "同意", "buttonRefuse" : "暂不同意" } @@ -56,7 +56,8 @@ ], "minSdkVersion" : 23, "targetSdkVersion" : 35, - "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ] + "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ], + "schemes" : "soulspace" }, /* ios打包配置 */ "ios" : { @@ -70,13 +71,14 @@ ] } }, - "idfa" : false, - "plistcmds" : [ "Delete :NSUserTrackingUsageDescription" ], + "idfa" : true, "privacyDescription" : { "NSPhotoLibraryUsageDescription" : "保障您在此app中的修改头像、申诉反馈上传图片功能的正常使用", "NSPhotoLibraryAddUsageDescription" : "保障您在此app中的修改头像、申诉反馈上传图片功能的正常使用", - "NSCameraUsageDescription" : "保障您在此app中的修改头像、申诉反馈上传图片功能的正常使用" - } + "NSCameraUsageDescription" : "保障您在此app中的修改头像、申诉反馈上传图片功能的正常使用", + "NSUserTrackingUsageDescription" : "请放心,开启权限不会获取您在其他站点的隐私信息,该权限仅用于标识设备并保障服务安全与提示浏览体验" + }, + "urltypes" : "soulspace" }, /* SDK配置 */ "sdkConfigs" : { diff --git a/pages.json b/pages.json index 9b3fe83..bd42fd2 100644 --- a/pages.json +++ b/pages.json @@ -412,6 +412,21 @@ "popGesture": "none" } } + }, + { + "path": "uni_modules/uni-upgrade-center-app/pages/upgrade-popup", + "style": { + "app-plus": { + "animationDuration": 200, + "animationType": "fade-in", + "background": "transparent", + "backgroundColorTop": "transparent", + "popGesture": "none", + "scrollIndicator": false, + "titleNView": false + }, + "disableScroll": true + } } ], "tabBar": { diff --git a/pages/component/commonComponents/selectGoods.vue b/pages/component/commonComponents/selectGoods.vue index d834414..98c5ea5 100644 --- a/pages/component/commonComponents/selectGoods.vue +++ b/pages/component/commonComponents/selectGoods.vue @@ -14,15 +14,15 @@ - - + + ¥{{selectGoodsData.price}} {{ slotProps.row.productName }} - - - ¥{{slotProps.row.price}} - - + @@ -129,6 +120,38 @@ export default { ...mapState(["userInfo"]), }, methods: { + getPrice(slotProps) { + if ( + Number(slotProps.row.isVipPrice) === 1 && + Number(slotProps.row.vipPrice) > 0 + ) { + return ` + + ¥${Number(slotProps.row.vipPrice).toFixed(2)} + + + ¥${Number(slotProps.row.price).toFixed(2)} + + `; + } else if (Number(slotProps.row.activityPrice) > 0) { + return ` + + ¥${Number(slotProps.row.activityPrice).toFixed(2)} + + + ¥${Number(slotProps.row.price).toFixed(2)} + + `; + } else { + return ` + ¥${Number(slotProps.row.price).toFixed(2)} + `; + } + }, // 放大图片 previewImage(url) { console.log(url); diff --git a/pages/curriculum/list/index.vue b/pages/curriculum/list/index.vue index f80af38..52c64d8 100644 --- a/pages/curriculum/list/index.vue +++ b/pages/curriculum/list/index.vue @@ -9,8 +9,7 @@ - - + 暂无数据 - + {{item.title}} diff --git a/pages/detail/orderLCont.vue b/pages/detail/orderLCont.vue index b82632d..17c53fb 100644 --- a/pages/detail/orderLCont.vue +++ b/pages/detail/orderLCont.vue @@ -153,7 +153,7 @@ {{ orderContet.shippingMoney }} - - - 积分 : - - - {{ orderContet.jfDeduction }} - + + + 积分抵扣: + + -   + {{ orderContet.jfDeduction }} + + + 天医币抵扣: + + -   + ¥{{ orderContet.realMoney }} + - 实付款 : + 实付款: - {{ orderContet.realMoney }} + ¥ {{ orderContet.bookBuyConfigEntity.realMoney }} + + + + + + + + + {{ orderContet.jfDeduction }} 积分 + diff --git a/pages/goods/index.vue b/pages/goods/index.vue index 73d36d0..872f631 100644 --- a/pages/goods/index.vue +++ b/pages/goods/index.vue @@ -13,7 +13,7 @@ - - + + - + {{ v.text }} @@ -110,12 +110,12 @@ - + @@ -149,7 +149,7 @@ {{ v.text }} @@ -95,10 +94,10 @@ + + diff --git a/uni_modules/z-address-popup/package.json b/uni_modules/z-address-popup/package.json new file mode 100644 index 0000000..5d756cd --- /dev/null +++ b/uni_modules/z-address-popup/package.json @@ -0,0 +1,78 @@ +{ + "id": "z-address", + "displayName": "三级联动弹窗,地址选择弹窗,可选长度", + "version": "1.0.0", + "description": "三级联动,地址选择,可选长度", + "keywords": [ + "三级联动弹窗", + "地址选择弹窗", + "地区选择弹窗" +], + "repository": "https://github.com/zhouwei1994/uni-app-demo", + "engines": { + "HBuilderX": "^3.0.0" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "465081029" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/z-address-popup/readme.md b/uni_modules/z-address-popup/readme.md new file mode 100644 index 0000000..fdd7c20 --- /dev/null +++ b/uni_modules/z-address-popup/readme.md @@ -0,0 +1,28 @@ +# 三级联动弹窗,地址选择弹窗,可选长度 + +三级联动弹窗,地址选择弹窗,可选长度 + +| `QQ交流群(607391225)` | `微信交流群(加我好友备注"进群")` | +| ----------------------------|--------------------------- | +|![QQ交流群](http://qn.kemean.cn//upload/202004/14/15868301778472k7oubi6.png)|![微信交流群](https://qn.kemean.cn/upload/202010/13/weiXin_group_code.jpg)| +| QQ群号:607391225 |微信号:zhou0612wei| + +### [点击跳转-5年的web前端开源的uni-app快速开发模板-下载看文档](https://ext.dcloud.net.cn/plugin?id=2009) + +### 案例一 +``` + +``` + +### 属性 +| 名称 | 类型 | 默认值 | 描述 | +| ----------------------------|--------------- | ------------- | ---------------------------------------------------| +| dataList | Array | [] | 默认值| +| length | Number | 3 | 地区选择长度(1-3) | +| force | Boolean | true | 强制选择,选择长度必须达到指定长度| +| value | Boolean | false | 控制弹窗是否打开 | + +### 事件 +| 名称 | 类型 | 描述 | +| -----------------|------------------ | --------------------------| +| @change | function | 选择时数据返回 | diff --git a/uni_modules/z-address/changelog.md b/uni_modules/z-address/changelog.md new file mode 100644 index 0000000..96b273b --- /dev/null +++ b/uni_modules/z-address/changelog.md @@ -0,0 +1,2 @@ +## 1.0.0(2021-05-12) +1. 支持uni_modules diff --git a/uni_modules/z-address/components/z-address/z-address.vue b/uni_modules/z-address/components/z-address/z-address.vue new file mode 100644 index 0000000..0ffac09 --- /dev/null +++ b/uni_modules/z-address/components/z-address/z-address.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/uni_modules/z-address/package.json b/uni_modules/z-address/package.json new file mode 100644 index 0000000..e3c96af --- /dev/null +++ b/uni_modules/z-address/package.json @@ -0,0 +1,78 @@ +{ + "id": "z-address", + "displayName": "三级联动,地址选择,可选长度", + "version": "1.0.0", + "description": "三级联动,地址选择,可选长度", + "keywords": [ + "三级联动", + "地址选择", + "地区选择" +], + "repository": "https://github.com/zhouwei1994/uni-app-demo", + "engines": { + "HBuilderX": "^3.0.0" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "465081029" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/z-address/readme.md b/uni_modules/z-address/readme.md new file mode 100644 index 0000000..9c3d676 --- /dev/null +++ b/uni_modules/z-address/readme.md @@ -0,0 +1,27 @@ +# 三级联动,地址选择,可选长度 + +三级联动,地址选择,可选长度 + +| `QQ交流群(607391225)` | `微信交流群(加我好友备注"进群")` | +| ----------------------------|--------------------------- | +|![QQ交流群](http://qn.kemean.cn//upload/202004/14/15868301778472k7oubi6.png)|![微信交流群](https://qn.kemean.cn/upload/202010/13/weiXin_group_code.jpg)| +| QQ群号:607391225 |微信号:zhou0612wei| + +### [点击跳转-5年的web前端开源的uni-app快速开发模板-下载看文档](https://ext.dcloud.net.cn/plugin?id=2009) + +### 案例一 +``` + +``` + +### 属性 +| 名称 | 类型 | 默认值 | 描述 | +| ----------------------------|--------------- | ------------- | ---------------------------------------------------| +| dataList | Array | [] | 默认值| +| length | Number | 3 | 地区选择长度(1-3) | +| force | Boolean | true | 强制选择,选择长度必须达到指定长度| + +### 事件 +| 名称 | 类型 | 描述 | +| -----------------|------------------ | --------------------------| +| @change | function | 选择时数据返回 | diff --git a/uni_modules/z-loading/components/z-loading/z-loading.vue b/uni_modules/z-loading/components/z-loading/z-loading.vue index d3e11fa..ea2866a 100644 --- a/uni_modules/z-loading/components/z-loading/z-loading.vue +++ b/uni_modules/z-loading/components/z-loading/z-loading.vue @@ -56,7 +56,7 @@ export default { height: 120rpx; border-radius: 50%; border: 3rpx solid transparent; - border-top-color: #3AB3AE; + border-top-color: #54a966; -webkit-animation: spin 2s linear infinite; animation: spin 2s linear infinite; } diff --git a/uni_modules/z-nav-bar/components/z-nav-bar/z-nav-bar.vue b/uni_modules/z-nav-bar/components/z-nav-bar/z-nav-bar.vue index 373b3aa..05bfa9d 100644 --- a/uni_modules/z-nav-bar/components/z-nav-bar/z-nav-bar.vue +++ b/uni_modules/z-nav-bar/components/z-nav-bar/z-nav-bar.vue @@ -357,6 +357,7 @@ export default { }, //导航字体是否是白色颜色 isWhite() { + // console.log(whiteList,'this.navFontColor') return whiteList.includes(this.navFontColor); }, //右上角是否有两个按钮 @@ -404,9 +405,9 @@ export default { let currentPages = getCurrentPages(); let pageLen = currentPages.length; //判断是否是第一个页面,如果是有设置back为true的页面,将不显示返回箭头,而显示返回首页按钮 - if (pageLen == 1 && !mainPagePath.includes(currentPages[0].route)) { - this.firstPage = true; - } + // if (pageLen == 1 && !mainPagePath.includes(currentPages[0].route)) { + // this.firstPage = true; + // } }, //方法 methods: { @@ -425,7 +426,7 @@ export default { this.$emit("homeClick"); } else { uni.switchTab({ - url: '/pages/home/index', + url: '/pages/homePage/index/index', }); } }, @@ -602,7 +603,6 @@ export default { /* #endif */ /* #ifdef APP-PLUS-NVUE */ lines: 1; - max-width: calc(100vw - 100px) !important; /* #endif */ flex-direction: row; align-items: center; diff --git a/uni_modules/z-paging/changelog.md b/uni_modules/z-paging/changelog.md new file mode 100644 index 0000000..e07e38d --- /dev/null +++ b/uni_modules/z-paging/changelog.md @@ -0,0 +1,14 @@ +## 2.0.1(2021-08-16) +1.自定义下拉刷新view无需设置`refresher-threshold`,将根据view自动计算高度。 +2.修复在iOS 13中下拉刷新抖动的问题。 +3.新增`inside-more`,支持在分页未满一屏时自动加载下一页。 +4.修复z-paging prop代码自动补全无效的问题,完善代码自动补全文档注释。 +5.修复在微信小程序中提示:uni is not defined的bug。 +6.修复在某些情况下,下拉刷新页面会跟着下拉的bug。 +7.其他细节优化。 +## 2.0.0(2021-08-16) +1.自定义下拉刷新view无需设置`refresher-threshold`,将根据view自动计算高度。 +2.修复在iOS 13中下拉刷新抖动的问题。 +3.新增`inside-more`,支持在分页未满一屏时自动加载下一页。 +4.修复z-paging prop代码自动补全无效的问题,完善代码自动补全文档注释。 +5.其他细节优化。 diff --git a/uni_modules/z-paging/components/z-paging-empty-view/z-paging-empty-view.vue b/uni_modules/z-paging/components/z-paging-empty-view/z-paging-empty-view.vue new file mode 100644 index 0000000..a8e6513 --- /dev/null +++ b/uni_modules/z-paging/components/z-paging-empty-view/z-paging-empty-view.vue @@ -0,0 +1,170 @@ + + + + + + + + + + + diff --git a/uni_modules/z-paging/components/z-paging-swiper-item/z-paging-swiper-item.vue b/uni_modules/z-paging/components/z-paging-swiper-item/z-paging-swiper-item.vue new file mode 100644 index 0000000..9871555 --- /dev/null +++ b/uni_modules/z-paging/components/z-paging-swiper-item/z-paging-swiper-item.vue @@ -0,0 +1,86 @@ + + + + + + + + + + + diff --git a/uni_modules/z-paging/components/z-paging-swiper/z-paging-swiper.vue b/uni_modules/z-paging/components/z-paging-swiper/z-paging-swiper.vue new file mode 100644 index 0000000..ee21c0c --- /dev/null +++ b/uni_modules/z-paging/components/z-paging-swiper/z-paging-swiper.vue @@ -0,0 +1,126 @@ + + + + + + + + + + + diff --git a/uni_modules/z-paging/components/z-paging/components/z-paging-load-more.vue b/uni_modules/z-paging/components/z-paging/components/z-paging-load-more.vue new file mode 100644 index 0000000..8b31f8c --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/components/z-paging-load-more.vue @@ -0,0 +1,161 @@ + + + + + + + + + + diff --git a/uni_modules/z-paging/components/z-paging/components/z-paging-refresh.vue b/uni_modules/z-paging/components/z-paging/components/z-paging-refresh.vue new file mode 100644 index 0000000..b2e48db --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/components/z-paging-refresh.vue @@ -0,0 +1,259 @@ + + + + + + + + + + diff --git a/uni_modules/z-paging/components/z-paging/css/z-paging-main.css b/uni_modules/z-paging/components/z-paging/css/z-paging-main.css new file mode 100644 index 0000000..6b25469 --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/css/z-paging-main.css @@ -0,0 +1,161 @@ +/* z-paging +github地址:https://github.com/SmileZXLee/uni-z-paging +dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 +反馈QQ群:790460711 +*/ + +.z-paging-content { + position: relative; + /* #ifndef APP-NVUE */ + display: flex; + width: 100%; + height: 100%; + /* #endif */ + flex-direction: column; +} + +.z-paging-content-fixed { + position: fixed; + /* #ifndef APP-NVUE */ + height: auto; + width: auto; + /* #endif */ + top: 0; + left: 0; + bottom: 0; + right: 0; +} + +.zp-page-scroll-top, +.zp-page-scroll-bottom { + /* #ifndef APP-NVUE */ + width: auto; + /* #endif */ + position: fixed; + left: 0; + right: 0; + z-index: 999; +} + +.zp-scroll-view-super { + flex: 1; + position: relative; +} + +.zp-custom-refresher-container { + overflow: hidden; +} + +.zp-scroll-view { + height: 100%; + width: 100%; +} + +.zp-scroll-view-absolute { + position: absolute; + top: 0; + left: 0; +} + +.zp-paging-touch-view { + width: 100%; + height: 100%; + position: relative; +} + +.zp-fixed-bac-view { + position: absolute; + width: 100%; + top: 0; + left: 0; + height: 200px; +} + +.zp-paging-main { + height: 100%; + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: column; +} + +.zp-paging-container { + flex: 1; + position: relative; +} + +.zp-chat-record-loading-container { + /* #ifndef APP-NVUE */ + display: flex; + width: 100%; + /* #endif */ + /* #ifdef APP-NVUE */ + width: 750rpx; + /* #endif */ + align-items: center; + justify-content: center; + height: 60rpx; + font-size: 26rpx; +} + +.zp-chat-record-loading-custom-image { + width: 35rpx; + height: 35rpx; + /* #ifndef APP-NVUE */ + animation: loading-flower 1s linear infinite; + /* #endif */ +} + +.zp-custom-refresher-container { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + justify-content: center; + align-items: center; +} + +.zp-back-to-top { + width: 76rpx; + height: 76rpx; + z-index: 999; + position: absolute; + bottom: 0rpx; + right: 25rpx; + transition-duration: .3s; + transition-property: opacity; +} + +.zp-back-to-top-show { + opacity: 1; +} + +.zp-back-to-top-hide { + opacity: 0; +} + +.zp-back-to-top-img { + /* #ifndef APP-NVUE */ + width: 100%; + height: 100%; + /* #endif */ + /* #ifdef APP-NVUE */ + flex: 1; + /* #endif */ + z-index: 999; +} + +.zp-empty-view { + /* #ifdef APP-NVUE */ + height: 100%; + /* #endif */ + flex: 1; +} + +.zp-n-refresh-container { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + justify-content: center; + width: 750rpx; +} diff --git a/uni_modules/z-paging/components/z-paging/css/z-paging-static.css b/uni_modules/z-paging/components/z-paging/css/z-paging-static.css new file mode 100644 index 0000000..714edeb --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/css/z-paging-static.css @@ -0,0 +1,38 @@ +/* z-paging +github地址:https://github.com/SmileZXLee/uni-z-paging +dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 +反馈QQ群:790460711 + +公用的静态css资源 */ + +.zp-loading-more-line-loading-image { + margin-right: 8rpx; + width: 28rpx; + height: 28rpx; + /* #ifndef APP-NVUE */ + animation: loading-flower 1s steps(12) infinite; + /* #endif */ + color: #666666; +} + +.zp-loading-image-ios{ + width: 20px; + height: 20px; +} + +.zp-loading-image-android{ + width: 32rpx; + height: 32rpx; +} + +@keyframes loading-flower { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} diff --git a/uni_modules/z-paging/components/z-paging/js/z-paging-config.js b/uni_modules/z-paging/components/z-paging/js/z-paging-config.js new file mode 100644 index 0000000..58c00eb --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/js/z-paging-config.js @@ -0,0 +1,32 @@ +// z-paging +// github地址:https://github.com/SmileZXLee/uni-z-paging +// dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 +// 反馈QQ群:790460711 +// z-paging配置文件 + +let config = null; +let getedStorage = false; +const storageKey = 'Z-PAGING-CONFIG-STORAGE-KEY' + +function setConfig(value) { + try { + uni.setStorageSync(storageKey, value); + } catch {} +} + +function getConfig() { + try { + if (getedStorage) { + return config; + } + config = uni.getStorageSync(storageKey); + getedStorage = true; + } catch { + return null; + } +} + +module.exports = { + setConfig, + getConfig +}; diff --git a/uni_modules/z-paging/components/z-paging/js/z-paging-i18n.js b/uni_modules/z-paging/components/z-paging/js/z-paging-i18n.js new file mode 100644 index 0000000..949f799 --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/js/z-paging-i18n.js @@ -0,0 +1,150 @@ +// z-paging +// github地址:https://github.com/SmileZXLee/uni-z-paging +// dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 +// 反馈QQ群:790460711 +// z-paging国际化(支持中文、中文繁体和英文) + +const i18nUpdateKey = 'z-paging-i18n-update'; + +const refresherDefaultText = { + 'en': 'Pull down to refresh', + 'zh-cn': '继续下拉刷新', + 'zh-hant-cn': '繼續下拉重繪', +} +const refresherPullingText = { + 'en': 'Release to refresh', + 'zh-cn': '松开立即刷新', + 'zh-hant-cn': '鬆開立即重繪', +} +const refresherRefreshingText = { + 'en': 'Refreshing...', + 'zh-cn': '正在刷新...', + 'zh-hant-cn': '正在重繪...', +} + +const loadingMoreDefaultText = { + 'en': 'Click to load more', + 'zh-cn': '点击加载更多', + 'zh-hant-cn': '點擊加載更多', +} +const loadingMoreLoadingText = { + 'en': 'Loading...', + 'zh-cn': '正在加载...', + 'zh-hant-cn': '正在加載...', +} +const loadingMoreNoMoreText = { + 'en': 'No more data', + 'zh-cn': '没有更多了', + 'zh-hant-cn': '沒有更多了', +} +const loadingMoreFailText = { + 'en': 'Load failed,click to reload', + 'zh-cn': '加载失败,点击重新加载', + 'zh-hant-cn': '加載失敗,點擊重新加載', +} + +const emptyViewText = { + 'en': 'No data', + 'zh-cn': '没有数据哦~', + 'zh-hant-cn': '沒有數據哦~', +} + +const emptyViewReloadText = { + 'en': 'Reload', + 'zh-cn': '重新加载', + 'zh-hant-cn': '重新加載', +} + +const emptyViewErrorText = { + 'en': 'Sorry,load failed', + 'zh-cn': '很抱歉,加载失败', + 'zh-hant-cn': '很抱歉,加載失敗', +} + +const refresherUpdateTimeText = { + 'en': 'Last update: ', + 'zh-cn': '最后更新:', + 'zh-hant-cn': '最後更新:', +} + +const refresherUpdateTimeNoneText = { + 'en': 'None', + 'zh-cn': '无', + 'zh-hant-cn': '無', +} + +const refresherUpdateTimeTodayText = { + 'en': 'Today', + 'zh-cn': '今天', + 'zh-hant-cn': '今天', +} + +const refresherUpdateTimeYesterdayText = { + 'en': 'Yesterday', + 'zh-cn': '昨天', + 'zh-hant-cn': '昨天', +} + +// 插件内部使用,请勿直接调用 +function getPrivateLanguage(myLanguage, followSystemLanguage = true) { + let systemLanguage = ''; + if (followSystemLanguage) { + systemLanguage = uni.getSystemInfoSync().language; + } + let language = myLanguage || uni.getStorageSync(i18nUpdateKey) || systemLanguage; + language = language.toLowerCase(); + var reg = new RegExp('_', ''); + language = language.replace(reg, '-'); + if (language.indexOf('zh') !== -1) { + if (language === 'zh' || language === 'zh-cn' || language.indexOf('zh-hans') !== -1) { + return 'zh-cn'; + } + return 'zh-hant-cn'; + } + if (language.indexOf('en') !== -1) { + return 'en'; + } + return 'zh-cn'; +} + +// 获取当前语言,格式为:zh-cn、zh-hant-cn、en。followSystemLanguage:获取的结果是否是在不跟随系统语言下获取到的 +function getLanguage(followSystemLanguage = true) { + return getPrivateLanguage(false, followSystemLanguage); +} + +// 获取当前语言,格式为:简体中文、繁體中文、English。followSystemLanguage:获取的结果是否是在不跟随系统语言下获取到的 +function getLanguageName(followSystemLanguage = true) { + const language = getLanguage(followSystemLanguage); + const languageNameMap = { + 'zh-cn': '简体中文', + 'zh-hant-cn': '繁體中文', + 'en': 'English' + }; + return languageNameMap[language]; +} + +function setLanguage(myLanguage) { + uni.setStorageSync(i18nUpdateKey, myLanguage); + uni.$emit(i18nUpdateKey, myLanguage); +} + +module.exports = { + refresherDefaultText, + refresherPullingText, + refresherRefreshingText, + loadingMoreDefaultText, + loadingMoreLoadingText, + loadingMoreNoMoreText, + loadingMoreFailText, + emptyViewText, + emptyViewReloadText, + emptyViewErrorText, + getPrivateLanguage, + getLanguage, + getLanguageName, + setLanguage, + refresherUpdateTimeText, + refresherUpdateTimeNoneText, + refresherUpdateTimeTodayText, + refresherUpdateTimeYesterdayText +} diff --git a/uni_modules/z-paging/components/z-paging/js/z-paging-main.js b/uni_modules/z-paging/components/z-paging/js/z-paging-main.js new file mode 100644 index 0000000..93d3d2d --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/js/z-paging-main.js @@ -0,0 +1,2745 @@ +// z-paging +// github地址:https://github.com/SmileZXLee/uni-z-paging +// dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 +// 反馈QQ群:790460711 + +import zStatic from './z-paging-static' +import zConfig from './z-paging-config' +import zUtils from './z-paging-utils' +import zI18n from './z-paging-i18n' +import zPagingRefresh from '../components/z-paging-refresh' +import zPagingLoadMore from '../components/z-paging-load-more' +import zPagingEmptyView from '../../z-paging-empty-view/z-paging-empty-view' + +const currentVersion = 'V1.9.8'; +const systemInfo = uni.getSystemInfoSync(); +const commonDelayTime = 100; +const i18nUpdateKey = 'z-paging-i18n-update'; +const errorUpdateKey = 'z-paging-error-emit'; +let config = null; +// #ifdef APP-NVUE +const weexDom = weex.requireModule('dom'); +const weexAnimation = weex.requireModule('animation'); +// #endif + +/* +当z-paging未使用uni_modules管理时,控制台会有警告:WARNING: Module not found: Error: Can't resolve '@/uni_modules/z-paging'... +此时注释下方try中的代码即可 +*/ +try { + const contextKeys = require.context('@/uni_modules/z-paging', false, /\z-paging-config$/).keys(); + if (contextKeys.length) { + const suffix = '.js'; + config = require('@/uni_modules/z-paging/z-paging-config' + suffix); + } +} catch {} + +//获取默认配置信息 +function _getConfig(key, defaultValue) { + if (!config) { + const temConfig = zConfig.getConfig(); + if (zConfig && temConfig) { + config = temConfig; + } + } + if (!config) { + return defaultValue; + } + let value = config[toKebab(key)]; + if (value === undefined) { + value = config[key]; + } + if (value !== undefined) { + return value; + } + return defaultValue; +} +//驼峰转短横线 +function toKebab(value) { + return value.replace(/([A-Z])/g, "-$1").toLowerCase(); +} + +export default { + name: "z-paging", + components: { + zPagingRefresh, + zPagingLoadMore, + zPagingEmptyView + }, + data() { + return { + base64Arrow: zStatic.base64Arrow, + base64Flower: zStatic.base64Flower, + base64BackToTop: zStatic.base64BackToTop, + systemInfo: null, + currentData: [], + totalData: [], + pageNo: 1, + showLoadingMore: false, + insideOfPaging: -1, + refresherTriggered: false, + loading: false, + firstPageLoaded: false, + pagingLoaded: false, + loaded: false, + isUserReload: true, + scrollEnable: true, + scrollTop: 0, + oldScrollTop: 0, + refresherTouchstartY: 0, + lastRefresherTouchmove: null, + refresherReachMaxAngle: true, + refresherTransform: 'translateY(0px)', + refresherTransition: '', + finalRefresherDefaultStyle: 'black', + //当前加载类型 0-下拉刷新 1-上拉加载更多 + loadingType: 0, + //底部加载更多状态 0-默认状态 1.加载中 2.没有更多数据 3.加载失败 + loadingStatus: 0, + //下拉刷新状态 0-默认状态 1.松手立即刷新 2.刷新中 + refresherStatus: 0, + scrollViewStyle: {}, + pullDownTimeStamp: 0, + pageScrollTop: -1, + isTouchmoving: false, + isLocalPaging: false, + totalLocalPagingList: [], + realTotalData: [], + isAddedData: false, + isTotalChangeFromAddData: false, + isTouchEnded: false, + isUserPullDown: false, + privateRefresherEnabled: -1, + privateScrollWithAnimation: -1, + myParentQuery: -1, + chatRecordLoadingMoreText: '', + moveDistance: 0, + loadingMoreDefaultSlot: null, + backToTopClass: 'zp-back-to-top zp-back-to-top-hide', + showBackToTopClass: false, + tempLanguageUpdateKey: 0, + isLoadFailed: false, + isIos: systemInfo.platform === 'ios', + privateShowRefresherWhenReload: false, + nRefresherLoading: true, + nListIsDragging: false, + nShowBottom: true, + nFixFreezing: false, + nShowRefresherReveal: false, + nShowRefresherRevealHeight: 0, + nIsFirstPageAndNoMore: false, + nFirstPageAndNoMoreChecked: false, + nLoadingMoreFixedHeight: false, + wxsPropType: '', + refresherRevealStackCount: 0, + renderPropScrollTop: -1, + renderPropUsePageScroll: -1, + wxsIsScrollTopInTopRange: true, + wxsScrollTop: 0, + wxsPageScrollTop: 0, + wxsOnPullingDown: false, + disabledBounce: false, + cacheScrollNodeHeight: -1, + customNoMore: -1, + customRefresherHeight: -1, + showCustomRefresher: false, + checkScrolledToBottomTimeOut: null, + isIos13: systemInfo.system && systemInfo.system.length && systemInfo.system.indexOf('iOS 13') != -1 + }; + }, + props: { + //自定义pageNo,默认为1 + defaultPageNo: { + type: [Number, String], + default: _getConfig('defaultPageNo', 1), + observer: function(newVal, oldVal) { + this.pageNo = newVal; + }, + }, + //自定义pageSize,默认为10 + defaultPageSize: { + type: [Number, String], + default: _getConfig('defaultPageSize', 10), + }, + //为保证数据一致,设置当前tab切换时的标识key,并在complete中传递相同key,若二者不一致,则complete将不会生效 + dataKey: { + type: [Number, Object], + default: function() { + return _getConfig('dataKey', null); + }, + }, + //自动注入的list名,可自动修改父view(包含ref="paging")中对应name的list值 + autowireListName: { + type: String, + default: function() { + return _getConfig('autowireListName', ''); + }, + }, + //自动注入的query名,可自动调用父view(包含ref="paging")中的query方法 + autowireQueryName: { + type: String, + default: function() { + return _getConfig('autowireQueryName', ''); + }, + }, + //调用complete后延迟处理的时间,单位为毫秒,默认0毫秒 + delay: { + type: [Number, String], + default: _getConfig('delay', 0), + }, + //i18n国际化设置语言,支持简体中文(zh-cn)、繁体中文(zh-hant-cn)和英文(en) + language: { + type: String, + default: _getConfig('language', '') + }, + //i18n国际化默认是否跟随系统语言,默认为是 + followSystemLanguage: { + type: Boolean, + default: _getConfig('followSystemLanguage', true) + }, + //设置z-paging的style,部分平台可能无法直接修改组件的style,可使用此属性代替 + pagingStyle: { + type: Object, + default: function() { + return _getConfig('pagingStyle', {}); + }, + }, + //设置z-paging的容器(插槽的父view)的style + pagingContentStyle: { + type: Object, + default: function() { + return _getConfig('pagingContentStyle', {}); + }, + }, + //z-paging是否自动高度,若自动高度则会自动铺满屏幕 + autoHeight: { + type: Boolean, + default: _getConfig('autoHeight', false) + }, + //z-paging是否自动高度时,附加的高度,注意添加单位px或rpx,若需要减少高度,则传负数 + autoHeightAddition: { + type: [Number, String], + default: _getConfig('autoHeightAddition', '0px') + }, + //loading(下拉刷新、上拉加载更多)的主题样式,支持black,white,默认black + defaultThemeStyle: { + type: String, + default: function() { + return _getConfig('defaultThemeStyle', 'black'); + } + }, + //下拉刷新的主题样式,支持black,white,默认black + refresherThemeStyle: { + type: String, + default: function() { + return _getConfig('refresherThemeStyle', ''); + } + }, + //底部加载更多的主题样式,支持black,white,默认black + loadingMoreThemeStyle: { + type: String, + default: function() { + return _getConfig('loadingMoreThemeStyle', ''); + } + }, + //是否只使用下拉刷新,设置为true后将关闭mounted自动请求数据、关闭滚动到底部加载更多,强制隐藏空数据图。默认为否 + refresherOnly: { + type: Boolean, + default: _getConfig('refresherOnly', false) + }, + //使用页面滚动,默认为否,当设置为是时则使用页面的滚动而非此组件内部的scroll-view的滚动,使用页面滚动时z-paging无需设置确定的高度且对于长列表展示性能更高,但配置会略微繁琐 + usePageScroll: { + type: Boolean, + default: _getConfig('usePageScroll', false) + }, + //z-paging是否使用fixed布局,若使用fixed布局,则z-paging的父view无需固定高度,z-paging高度默认为100%,默认为否(当使用内置scroll-view滚动时有效) + fixed: { + type: Boolean, + default: _getConfig('fixed', false) + }, + //是否开启底部安全区域适配 + safeAreaInsetBottom: { + type: Boolean, + default: _getConfig('safeAreaInsetBottom', false) + }, + //是否可以滚动,使用内置scroll-view和nvue时有效,默认为是 + scrollable: { + type: Boolean, + default: _getConfig('scrollable', true) + }, + //z-paging mounted后自动调用reload方法(mounted后自动调用接口),默认为是。请使用简便写法:auto + mountedAutoCallReload: { + type: Boolean, + default: _getConfig('mountedAutoCallReload', true) + }, + //z-paging mounted后自动调用reload方法(mounted后自动调用接口),默认为是 + auto: { + type: Boolean, + default: _getConfig('auto', true) + }, + //reload时自动滚动到顶部,默认为否 + autoScrollToTopWhenReload: { + type: Boolean, + default: _getConfig('autoScrollToTopWhenReload', false) + }, + //reload时立即自动清空原list,默认为是,若立即自动清空,则在reload之后、请求回调之前页面是空白的 + autoCleanListWhenReload: { + type: Boolean, + default: _getConfig('autoCleanListWhenReload', false) + }, + //调用reload方法时自动显示下拉刷新view,默认为否 + showRefresherWhenReload: { + type: Boolean, + default: _getConfig('showRefresherWhenReload', false) + }, + //调用reload方法时自动显示加载更多view,且为加载中状态,默认为否 + showLoadingMoreWhenReload: { + type: Boolean, + default: _getConfig('showLoadingMoreWhenReload', false) + }, + //是否使用自定义的下拉刷新,默认为是,即使用z-paging的下拉刷新。设置为false即代表使用uni scroll-view自带的下拉刷新,h5、App、微信小程序以外的平台不支持uni scroll-view自带的下拉刷新 + useCustomRefresher: { + type: Boolean, + default: _getConfig('useCustomRefresher', true) + }, + //自定义下拉刷新下拉帧率,默认为40,过高可能会出现抖动问题(use-custom-refresher为true时生效) + refresherFps: { + type: [Number, String], + default: _getConfig('refresherFps', 40) + }, + //自定义下拉刷新允许触发的最大下拉角度,默认为40度,当下拉角度小于设定值时,自定义下拉刷新动画不会被触发 + refresherMaxAngle: { + type: [Number, String], + default: _getConfig('refresherMaxAngle', 40) + }, + //自定义下拉刷新的角度由未达到最大角度变到达到最大角度时,是否继续下拉刷新手势,默认为否 + refresherAngleEnableChangeContinued: { + type: Boolean, + default: _getConfig('refresherAngleEnableChangeContinued', false) + }, + //自定义下拉刷新默认状态下的文字(use-custom-refresher为true时生效) + refresherDefaultText: { + type: [String, Object], + default: _getConfig('refresherDefaultText', null) + }, + //自定义下拉刷新松手立即刷新状态下的文字(use-custom-refresher为true时生效) + refresherPullingText: { + type: [String, Object], + default: _getConfig('refresherPullingText', null) + }, + //自定义下拉刷新刷新中状态下的文字(use-custom-refresher为true时生效) + refresherRefreshingText: { + type: [String, Object], + default: _getConfig('refresherRefreshingText', null) + }, + //是否开启自定义下拉刷新刷新结束回弹效果,默认为是(use-custom-refresher为true时生效) + refresherEndBounceEnabled: { + type: Boolean, + default: _getConfig('refresherEndBounceEnabled', true) + }, + //自定义底部加载更多样式 + loadingMoreCustomStyle: { + type: Object, + default: function() { + return _getConfig('loadingMoreCustomStyle', {}); + } + }, + //自定义底部加载更多加载中动画样式 + loadingMoreLoadingIconCustomStyle: { + type: Object, + default: function() { + return _getConfig('loadingMoreLoadingIconCustomStyle', {}); + } + }, + //自定义底部加载更多加载中动画图标类型,可选flower或circle,默认为flower + loadingMoreLoadingIconType: { + type: String, + default: _getConfig('loadingMoreLoadingIconType', 'flower') + }, + //自定义底部加载更多加载中动画图标图片 + loadingMoreLoadingIconCustomImage: { + type: String, + default: _getConfig('loadingMoreLoadingIconCustomImage', '') + }, + //底部加载更多加载中view是否展示旋转动画,默认为是 + loadingMoreLoadingAnimated: { + type: Boolean, + default: _getConfig('loadingMoreLoadingAnimated', true) + }, + //是否启用加载更多数据(含滑动到底部加载更多数据和点击加载更多数据),默认为是 + loadingMoreEnabled: { + type: Boolean, + default: _getConfig('loadingMoreEnabled', true) + }, + //是否启用滑动到底部加载更多数据,默认为是 + toBottomLoadingMoreEnabled: { + type: Boolean, + default: _getConfig('toBottomLoadingMoreEnabled', true) + }, + //滑动到底部"默认"文字,默认为【点击加载更多】 + loadingMoreDefaultText: { + type: [String, Object], + default: _getConfig('loadingMoreDefaultText', null) + }, + //滑动到底部"加载中"文字,默认为【正在加载...】 + loadingMoreLoadingText: { + type: [String, Object], + default: _getConfig('loadingMoreLoadingText', null) + }, + //滑动到底部"没有更多"文字,默认为【没有更多了】 + loadingMoreNoMoreText: { + type: [String, Object], + default: _getConfig('loadingMoreNoMoreText', null) + }, + //滑动到底部"加载失败"文字,默认为【加载失败,点击重新加载】 + loadingMoreFailText: { + type: [String, Object], + default: _getConfig('loadingMoreFailText', null) + }, + //当没有更多数据且分页内容未超出z-paging时是否隐藏没有更多数据的view,默认为否 + hideLoadingMoreWhenNoMoreAndInsideOfPaging: { + type: Boolean, + default: _getConfig('hideLoadingMoreWhenNoMoreAndInsideOfPaging', false) + }, + //当没有更多数据且分页数组长度少于这个值时,隐藏没有更多数据的view,默认为0,代表不限制。 + hideLoadingMoreWhenNoMoreByLimit: { + type: Number, + default: _getConfig('hideLoadingMoreWhenNoMoreByLimit', 0) + }, + //当分页未满一屏时,是否自动加载更多,默认为否(nvue无效) + insideMore: { + type: Boolean, + default: _getConfig('insideMore', false) + }, + //是否显示默认的加载更多text,默认为是 + showDefaultLoadingMoreText: { + type: Boolean, + default: _getConfig('showDefaultLoadingMoreText', true) + }, + //是否显示没有更多数据的view + showLoadingMoreNoMoreView: { + type: Boolean, + default: _getConfig('showLoadingMoreNoMoreView', true) + }, + //是否显示没有更多数据的分割线,默认为是 + showLoadingMoreNoMoreLine: { + type: Boolean, + default: _getConfig('showLoadingMoreNoMoreLine', true) + }, + //自定义底部没有更多数据的分割线样式 + loadingMoreNoMoreLineCustomStyle: { + type: Object, + default: function() { + return _getConfig('loadingMoreNoMoreLineCustomStyle', {}); + }, + }, + //是否强制隐藏空数据图,默认为否 + hideEmptyView: { + type: Boolean, + default: _getConfig('hideEmptyView', false) + }, + //空数据图描述文字,默认为“没有数据哦~” + emptyViewText: { + type: [String, Object], + default: _getConfig('emptyViewText', null) + }, + //是否显示空数据图重新加载按钮(无数据时),默认为否 + showEmptyViewReload: { + type: Boolean, + default: _getConfig('showEmptyViewReload', false) + }, + //加载失败时是否显示空数据图重新加载按钮,默认为是 + showEmptyViewReloadWhenError: { + type: Boolean, + default: _getConfig('showEmptyViewReloadWhenError', true) + }, + //空数据图点击重新加载文字,默认为“重新加载” + emptyViewReloadText: { + type: [String, Object], + default: _getConfig('emptyViewReloadText', null) + }, + //空数据图图片,默认使用z-paging内置的图片 + emptyViewImg: { + type: String, + default: _getConfig('emptyViewImg', '') + }, + //空数据图“加载失败”描述文字,默认为“很抱歉,加载失败” + emptyViewErrorText: { + type: [String, Object], + default: _getConfig('emptyViewErrorText', null) + }, + //空数据图“加载失败”图片,默认使用z-paging内置的图片 + emptyViewErrorImg: { + type: String, + default: _getConfig('emptyViewErrorImg', '') + }, + //空数据图样式 + emptyViewStyle: { + type: Object, + default: function() { + return _getConfig('emptyViewStyle', {}); + } + }, + //空数据图img样式 + emptyViewImgStyle: { + type: Object, + default: function() { + return _getConfig('emptyViewImgStyle', {}); + } + }, + //空数据图描述文字样式 + emptyViewTitleStyle: { + type: Object, + default: function() { + return _getConfig('emptyViewTitleStyle', {}); + } + }, + //空数据图重新加载按钮样式 + emptyViewReloadStyle: { + type: Object, + default: function() { + return _getConfig('emptyViewReloadStyle', {}); + } + }, + //加载中时是否自动隐藏空数据图,默认为是 + autoHideEmptyViewWhenLoading: { + type: Boolean, + default: _getConfig('autoHideEmptyViewWhenLoading', true) + }, + //第一次加载后自动隐藏loading slot,默认为是 + autoHideLoadingAfterFirstLoaded: { + type: Boolean, + default: _getConfig('autoHideLoadingAfterFirstLoaded', true) + }, + //自动显示点击返回顶部按钮,默认为否 + autoShowBackToTop: { + type: Boolean, + default: _getConfig('autoShowBackToTop', true) + }, + //点击返回顶部按钮显示/隐藏的阈值(滚动距离),单位为px,默认为400rpx + backToTopThreshold: { + type: [Number, String], + default: _getConfig('backToTopThreshold', '400rpx') + }, + //点击返回顶部按钮的自定义图片地址,默认使用z-paging内置的图片 + backToTopImg: { + type: String, + default: _getConfig('backToTopImg', '') + }, + //点击返回顶部按钮返回到顶部时是否展示过渡动画,默认为是 + backToTopWithAnimate: { + type: Boolean, + default: _getConfig('backToTopWithAnimate', true) + }, + //点击返回顶部按钮与底部的距离,注意添加单位px或rpx,默认为160rpx + backToTopBottom: { + type: [Number, String], + default: _getConfig('backToTopBottom', '160rpx') + }, + //点击返回顶部按钮的自定义样式 + backToTopStyle: { + type: Object, + default: function() { + return _getConfig('backToTopStyle', {}); + }, + }, + //控制是否出现滚动条,默认为否 + showScrollbar: { + type: Boolean, + default: _getConfig('showScrollbar', false) + }, + //iOS设备上滚动到顶部时是否允许回弹效果,默认为否。关闭回弹效果后可使滚动到顶部与下拉刷新更连贯,但是有吸顶view时滚动到顶部时可能出现抖动。 + scrollToTopBounceEnabled: { + type: Boolean, + default: _getConfig('scrollToTopBounceEnabled', false) + }, + //iOS设备上滚动到底部时是否允许回弹效果,默认为是。 + scrollToBottomBounceEnabled: { + type: Boolean, + default: _getConfig('scrollToBottomBounceEnabled', true) + }, + //在设置滚动条位置时使用动画过渡,默认为否 + scrollWithAnimation: { + type: Boolean, + default: _getConfig('scrollWithAnimation', false) + }, + //值应为某子元素id(id不能以数字开头)。设置哪个方向可滚动,则在哪个方向滚动到该元素 + scrollIntoView: { + type: String, + default: _getConfig('scrollIntoView', '') + }, + //距底部/右边多远时(单位px),触发 scrolltolower 事件,默认为100rpx + lowerThreshold: { + type: [Number, String], + default: _getConfig('lowerThreshold', '100rpx') + }, + //iOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只支持竖向,默认为是 + enableBackToTop: { + type: Boolean, + default: _getConfig('enableBackToTop', true) + }, + //是否开启自定义下拉刷新,默认为是 + refresherEnabled: { + type: Boolean, + default: _getConfig('refresherEnabled', true) + }, + //设置自定义下拉刷新阈值,默认为80rpx + refresherThreshold: { + type: [Number, String], + default: _getConfig('refresherThreshold', '80rpx') + }, + //设置系统下拉刷新默认样式,支持设置 black,white,none,none 表示不使用默认样式,默认为black + refresherDefaultStyle: { + type: String, + default: _getConfig('refresherDefaultStyle', 'black') + }, + //设置自定义下拉刷新区域背景颜色 + refresherBackground: { + type: String, + default: _getConfig('refresherBackground', '#ffffff00') + }, + //设置固定的自定义下拉刷新区域背景颜色 + refresherFixedBackground: { + type: String, + default: _getConfig('refresherFixedBackground', '#ffffff00') + }, + //设置固定的自定义下拉刷新区域高度,默认为0 + refresherFixedBacHeight: { + type: [Number, String], + default: _getConfig('refresherFixedBacHeight', 0) + }, + //设置自定义下拉刷新下拉超出阈值后继续下拉位移衰减的比例,范围0-1,值越大代表衰减越多。默认为0.7(nvue无效) + refresherOutRate: { + type: Number, + default: _getConfig('refresherOutRate', 0.7) + }, + //是否显示最后更新时间,默认为否 + showRefresherUpdateTime: { + type: Boolean, + default: _getConfig('showRefresherUpdateTime', false) + }, + //如果需要区别不同页面的最后更新时间,请为不同页面的z-paging的`refresher-update-time-key`设置不同的字符串 + refresherUpdateTimeKey: { + type: String, + default: _getConfig('refresherUpdateTimeKey', 'default') + }, + //本地分页时上拉加载更多延迟时间,单位为毫秒,默认200毫秒 + localPagingLoadingTime: { + type: [Number, String], + default: _getConfig('localPagingLoadingTime', 200) + }, + //使用聊天记录模式,默认为否 + useChatRecordMode: { + type: Boolean, + default: _getConfig('useChatRecordMode', false) + }, + //slot="top"的view的z-index,默认为99,仅使用页面滚动时有效 + topZIndex: { + type: Number, + default: _getConfig('topZIndex', 99) + }, + //z-paging内容容器父view的z-index,默认为1 + superContentZIndex: { + type: Number, + default: _getConfig('superContentZIndex', 1) + }, + //z-paging内容容器部分的z-index,默认为10 + contentZIndex: { + type: Number, + default: _getConfig('contentZIndex', 10) + }, + //空数据view的z-index,默认为9 + emptyViewZIndex: { + type: Number, + default: _getConfig('emptyViewZIndex', 9) + }, + //使用页面滚动时,是否在不满屏时自动填充满屏幕,默认为是 + autoFullHeight: { + type: Boolean, + default: _getConfig('autoFullHeight', true) + }, + //自动拼接complete中传过来的数组(使用聊天记录模式时无效) + concat: { + type: Boolean, + default: _getConfig('concat', true) + }, + //nvue中修改列表类型,可选值有list、waterfall和scroller,默认为list + nvueListIs: { + type: String, + default: _getConfig('nvueListIs', 'list') + }, + //nvue waterfall配置,仅在nvue中且nvueListIs=waterfall时有效,配置参数详情参见:https://uniapp.dcloud.io/component/waterfall + nvueWaterfallConfig: { + type: Object, + default: function() { + return _getConfig('nvueWaterfallConfig', {}); + } + }, + //nvue 控制是否回弹效果,iOS不支持动态修改 + nvueBounce: { + type: Boolean, + default: function() { + return _getConfig('nvueBounce', true); + } + }, + //nvue中通过代码滚动到顶部/底部时,是否加快动画效果(无滚动动画时无效),默认为否 + nvueFastScroll: { + type: Boolean, + default: function() { + return _getConfig('nvueFastScroll', false); + } + }, + //是否将错误信息打印至控制台,默认为是 + showConsoleError: { + type: Boolean, + default: function() { + return _getConfig('showConsoleError', true); + } + }, + //父组件v-model所绑定的list的值 + value: { + type: Array, + default: function() { + return []; + } + } + }, + mounted() { + this.wxsPropType = (new Date()).getTime().toString(); + this.renderJsIgnore; + if (!this.refresherOnly && (this.mountedAutoCallReload && this.auto)) { + this.$nextTick(() => { + this._preReload(); + }) + } + this.$nextTick(() => { + this.systemInfo = uni.getSystemInfoSync(); + if (!this.usePageScroll && this.autoHeight) { + this._setAutoHeight(); + } + this.loaded = true; + }) + this.updatePageScrollTopHeight(); + this.updatePageScrollBottomHeight(); + if (this.finalRefresherEnabled && this.useCustomRefresher) { + this.$nextTick(() => { + this.isTouchmoving = true; + }) + } + uni.$on(i18nUpdateKey, () => { + this.tempLanguageUpdateKey = (new Date()).getTime(); + }) + uni.$on(errorUpdateKey, () => { + if (this.loading) { + this.complete(false); + } + }) + // #ifdef APP-NVUE + if (!this.isIos && !this.useChatRecordMode) { + this.nLoadingMoreFixedHeight = true; + } + // #endif + }, + destroyed() { + uni.$off(i18nUpdateKey); + uni.$off(errorUpdateKey); + }, + watch: { + value(newVal, oldVal) { + let dataType = Object.prototype.toString.call(newVal); + if (dataType === '[object Undefined]') { + zUtils.consoleErr('v-model所绑定的值不存在!'); + return; + } + if (dataType !== '[object Array]') { + zUtils.consoleErr('v-model所绑定的值必须为Array类型!'); + return; + } + if (!zUtils.arrayIsEqual(newVal, this.totalData)) { + this.totalData = newVal; + } + }, + totalData(newVal, oldVal) { + if ((!this.isUserReload || !this.autoCleanListWhenReload) && this.firstPageLoaded && !newVal.length && + oldVal.length) { + return; + } + newVal = [...newVal]; + if (this.autoFullHeight && this.usePageScroll && this.isTotalChangeFromAddData) { + this.$nextTick(() => { + // this._checkScrollViewShouldFullHeight((scrollViewNode, pagingContainerNode) => { + // this._preCheckShowLoadingMoreWhenNoMoreAndInsideOfPaging(newVal, scrollViewNode, + // pagingContainerNode) + // }); + }) + } else { + this._preCheckShowLoadingMoreWhenNoMoreAndInsideOfPaging(newVal) + } + if (!this.usePageScroll && (this.pageNo === this.defaultPageNo || this.defaultPageNo + 1)) { + setTimeout(() => { + this._checkScrollViewOutOfPage(); + }, commonDelayTime) + } + this.realTotalData = newVal; + this.$emit('input', newVal); + this.$emit('update:list', newVal); + this.$emit('listChange', newVal); + this._callMyParentList(newVal); + this.firstPageLoaded = false; + this.isTotalChangeFromAddData = false; + this.$nextTick(() => { + this._getNodeClientRect('.zp-paging-container-content').then((res) => { + if (res) { + this.$emit('pagingContentHeightChanged', res[0].height); + } + }); + // #ifdef APP-NVUE + if (this.useChatRecordMode && this.nIsFirstPageAndNoMore && this.pageNo === this + .defaultPageNo && !this.nFirstPageAndNoMoreChecked) { + this.nFirstPageAndNoMoreChecked = true; + this._scrollToBottom(false); + } + // #endif + }) + }, + currentData(newVal, oldVal) { + this._currentDataChange(newVal, oldVal); + }, + loadingStatus(newVal, oldVal) { + this.$emit('loadingStatusChange', newVal); + // #ifdef APP-NVUE + if (this.useChatRecordMode) { + if (this.pageNo === this.defaultPageNo && newVal === 2) { + this.nIsFirstPageAndNoMore = true; + return; + } + } + this.nIsFirstPageAndNoMore = false; + // #endif + }, + oldScrollTop(newVal, oldVal) { + if (!this.usePageScroll) { + this.$emit('scrollTopChange', newVal); + this.$emit('update:scrollTop', newVal); + this._checkShouldShowBackToTop(newVal, oldVal); + if (this.isIos) { + if (newVal > 5) { + this.wxsScrollTop = 6; + } else { + this.wxsScrollTop = 0; + } + } else { + this.wxsScrollTop = newVal; + } + } + }, + pageScrollTop(newVal, oldVal) { + if (this.usePageScroll) { + this.$emit('scrollTopChange', newVal); + this.$emit('update:scrollTop', newVal); + this._checkShouldShowBackToTop(newVal, oldVal); + if (this.isIos) { + if (newVal > 5) { + this.wxsPageScrollTop = 6; + } else { + this.wxsPageScrollTop = 0; + } + } else { + this.wxsPageScrollTop = newVal; + } + } + }, + defaultThemeStyle: { + handler(newVal) { + if (newVal.length) { + this.finalRefresherDefaultStyle = newVal; + } + }, + immediate: true + }, + usePageScroll: { + handler(newVal) { + this.$nextTick(() => { + this.renderPropUsePageScroll = newVal; + }) + if (this.loaded && this.autoHeight) { + this._setAutoHeight(!newVal); + } + }, + immediate: true + }, + autoHeight(newVal, oldVal) { + if (this.loaded && !this.usePageScroll) { + this._setAutoHeight(newVal); + } + }, + autoHeightAddition(newVal, oldVal) { + if (this.loaded && !this.usePageScroll && this.autoHeight) { + this._setAutoHeight(newVal); + } + }, + refresherDefaultStyle: { + handler(newVal) { + if (newVal.length) { + this.finalRefresherDefaultStyle = newVal; + } + }, + immediate: true + }, + refresherStatus(newVal, oldVal) { + if (newVal !== oldVal) { + this.$emit('refresherStatusChange', newVal); + this.$emit('update:refresherStatus', newVal); + } + }, + useChatRecordMode(newVal, oldVal) { + if (newVal) { + this.nLoadingMoreFixedHeight = false; + } + }, + finalScrollTop(newVal, oldVal) { + if (!this.useChatRecordMode) { + if (newVal < 6) { + this.renderPropScrollTop = 0; + } else { + this.renderPropScrollTop = 10; + } + } + }, + nIsFirstPageAndNoMore: { + handler(newVal) { + const cellStyle = !this.useChatRecordMode || newVal ? {} : { + transform: 'rotate(180deg)' + }; + this.$emit('update:cellStyle', cellStyle); + }, + immediate: true + } + }, + computed: { + pageSize() { + return this.defaultPageSize; + }, + pullDownDisTimeStamp() { + return 1000 / this.refresherFps; + }, + finalRefresherEnabled() { + if (this.useChatRecordMode) { + return false; + } + if (this.privateRefresherEnabled === -1) { + return this.refresherEnabled; + } + return this.privateRefresherEnabled === 1; + }, + finalScrollWithAnimation() { + if (this.privateScrollWithAnimation !== -1) { + const scrollWithAnimation = this.privateScrollWithAnimation === 1; + this.privateScrollWithAnimation = -1; + return scrollWithAnimation; + } + return this.scrollWithAnimation; + }, + zPagingLoadMoreConfig() { + return { + loadingStatus: this.loadingStatus, + defaultThemeStyle: this.finalLoadingMoreThemeStyle, + loadingMoreCustomStyle: this.loadingMoreCustomStyle, + loadingMoreLoadingIconCustomStyle: this.loadingMoreLoadingIconCustomStyle, + loadingMoreLoadingIconType: this.loadingMoreLoadingIconType, + loadingMoreLoadingIconCustomImage: this.loadingMoreLoadingIconCustomImage, + loadingMoreLoadingAnimated: this.loadingMoreLoadingAnimated, + showLoadingMoreNoMoreLine: this.showLoadingMoreNoMoreLine, + loadingMoreNoMoreLineCustomStyle: this.loadingMoreNoMoreLineCustomStyle, + loadingMoreDefaultText: this.finalLoadingMoreDefaultText, + loadingMoreLoadingText: this.finalLoadingMoreLoadingText, + loadingMoreNoMoreText: this.finalLoadingMoreNoMoreText, + loadingMoreFailText: this.finalLoadingMoreFailText + }; + }, + zScopedSlots() { + return this.$scopedSlots; + }, + finalNvueListIs() { + if (this.usePageScroll) { + return 'view'; + } + const nvueListIsLowerCase = this.nvueListIs.toLowerCase(); + if (nvueListIsLowerCase === 'list' || nvueListIsLowerCase === 'waterfall' || nvueListIsLowerCase === + 'scroller') { + return nvueListIsLowerCase; + } + return 'list'; + }, + finalNvueSuperListIs() { + if (this.usePageScroll) { + return 'view'; + } + return 'scroller'; + }, + finalPagingStyle() { + let pagingStyle = this.pagingStyle; + if (!this.systemInfo) { + return pagingStyle; + } + const windowTop = this.systemInfo.windowTop; + const windowBottom = this.systemInfo.windowBottom; + if (!this.usePageScroll && this.fixed) { + if (windowTop && windowTop !== undefined) { + pagingStyle.top = windowTop + 'px'; + } + let bottom = 0; + if (windowBottom && windowBottom !== undefined) { + bottom = windowBottom; + } + if (this.safeAreaInsetBottom) { + bottom += this.safeAreaBottom; + } + pagingStyle.bottom = bottom + 'px'; + } + return pagingStyle; + }, + finalEnableBackToTop() { + if (this.usePageScroll) { + return false; + } + return this.enableBackToTop; + }, + finalBackToTopThreshold() { + return this._convertTextToPx(this.backToTopThreshold); + }, + finalLowerThreshold() { + return this._convertTextToPx(this.lowerThreshold); + }, + finalRefresherThreshold() { + let refresherThreshold = this.refresherThreshold; + let idDefault = false; + if (refresherThreshold === '80rpx') { + idDefault = true; + if (this.showRefresherUpdateTime) { + refresherThreshold = '120rpx'; + } + } + if (idDefault && this.customRefresherHeight > 0) { + return this.customRefresherHeight; + } + return this._convertTextToPx(refresherThreshold); + }, + finalRefresherFixedBacHeight() { + return this._convertTextToPx(this.refresherFixedBacHeight); + }, + finalScrollTop() { + if (this.usePageScroll) { + return this.pageScrollTop; + } + return this.oldScrollTop; + }, + finalBackToTopStyle() { + let tempBackToTopStyle = this.backToTopStyle; + if (!tempBackToTopStyle.bottom) { + tempBackToTopStyle.bottom = this.windowBottom + this._convertTextToPx(this.backToTopBottom) + 'px'; + } + return tempBackToTopStyle; + }, + finalTempLanguage() { + if (this.language.length) { + return this.language; + } + return this.tempLanguage; + }, + finalLanguage() { + let language = this.finalTempLanguage.toLowerCase(); + return zI18n.getPrivateLanguage(language, this.followSystemLanguage); + }, + finalRefresherDefaultText() { + return this._getI18nText('refresherDefaultText', this.refresherDefaultText); + }, + finalRefresherPullingText() { + return this._getI18nText('refresherPullingText', this.refresherPullingText); + }, + finalRefresherRefreshingText() { + return this._getI18nText('refresherRefreshingText', this.refresherRefreshingText); + }, + finalLoadingMoreDefaultText() { + return this._getI18nText('loadingMoreDefaultText', this.loadingMoreDefaultText); + }, + finalLoadingMoreLoadingText() { + return this._getI18nText('loadingMoreLoadingText', this.loadingMoreLoadingText); + }, + finalLoadingMoreNoMoreText() { + return this._getI18nText('loadingMoreNoMoreText', this.loadingMoreNoMoreText); + }, + finalLoadingMoreFailText() { + return this._getI18nText('loadingMoreFailText', this.loadingMoreFailText); + }, + finalEmptyViewText() { + if (this.isLoadFailed) { + return this.finalEmptyViewErrorText; + } else { + return this._getI18nText('emptyViewText', this.emptyViewText); + } + }, + finalEmptyViewReloadText() { + return this._getI18nText('emptyViewReloadText', this.emptyViewReloadText); + }, + finalEmptyViewErrorText() { + return this._getI18nText('emptyViewErrorText', this.emptyViewErrorText); + }, + finalEmptyViewImg() { + if (this.isLoadFailed) { + return this.emptyViewErrorImg; + } else { + return this.emptyViewImg; + } + }, + finalShowEmptyViewReload() { + if (this.isLoadFailed) { + return this.showEmptyViewReloadWhenError; + } else { + return this.showEmptyViewReload; + } + }, + finalRefresherThemeStyle() { + if (this.refresherThemeStyle.length) { + return this.refresherThemeStyle; + } + return this.defaultThemeStyle; + }, + finalLoadingMoreThemeStyle() { + if (this.loadingMoreThemeStyle.length) { + return this.loadingMoreThemeStyle; + } + return this.defaultThemeStyle; + }, + finalPagingContentStyle() { + if (this.contentZIndex != 1) { + this.pagingContentStyle['z-index'] = this.contentZIndex; + this.pagingContentStyle['position'] = 'relative'; + } + return this.pagingContentStyle; + }, + finalScrollViewStyle() { + if (this.superContentZIndex != 1) { + this.scrollViewStyle['z-index'] = this.superContentZIndex; + this.scrollViewStyle['position'] = 'relative'; + } + return this.scrollViewStyle; + }, + finalRefresherOutRate() { + if (this.refresherOutRate < 0) { + return 0; + } + if (this.refresherOutRate > 1) { + return 1; + } + return this.refresherOutRate; + }, + finalRefresherTransform() { + if (this.refresherTransform === 'translateY(0px)') { + return 'none'; + } + return this.refresherTransform; + }, + showEmpty() { + const showEmpty = !this.refresherOnly && !this.totalData.length && (this.autoHideEmptyViewWhenLoading ? this + .isAddedData : true) && !this.hideEmptyView && (this.autoHideEmptyViewWhenLoading ? (!this + .firstPageLoaded && !this.loading) : true); + return showEmpty; + }, + tempLanguage() { + let systemLanguage = false; + const temp = this.tempLanguageUpdateKey; + if (this.followSystemLanguage) { + systemLanguage = systemInfo.language; + } + return uni.getStorageSync(i18nUpdateKey) || systemLanguage || 'zh-cn'; + }, + safeAreaBottom() { + if (!this.systemInfo) { + return 0; + } + let safeAreaBottom = 0; + // #ifdef MP-WEIXIN + safeAreaBottom = this.systemInfo.screenHeight - this.systemInfo.safeArea.bottom; + // #endif + // #ifdef APP-PLUS || H5 + safeAreaBottom = this.systemInfo.safeAreaInsets.bottom || 0; + // #endif + return Math.abs(safeAreaBottom); + }, + renderJsIgnore() { + if ((this.usePageScroll && this.useChatRecordMode) || !this.refresherEnabled || !this.useCustomRefresher) { + this.$nextTick(() => { + this.renderPropScrollTop = 10; + }) + } + return 0; + }, + windowTop() { + if (!this.systemInfo) { + return 0; + } + const windowTop = this.systemInfo.windowTop; + return windowTop || 0; + }, + windowBottom() { + if (!this.systemInfo) { + return 0; + } + let windowBottom = this.systemInfo.windowBottom || 0; + if (this.safeAreaInsetBottom) { + windowBottom += this.safeAreaBottom; + } + return windowBottom; + }, + showRefresher() { + const showRefresher = this.finalRefresherEnabled && this.useCustomRefresher && this.isTouchmoving; + // #ifndef APP-NVUE + if (this.customRefresherHeight === -1 && showRefresher) { + setTimeout(() => { + this._updateCustomRefresherHeight(); + }, 100) + } + // #endif + return showRefresher; + }, + nWaterfallColumnCount() { + if (this.finalNvueListIs !== 'waterfall') { + return 0; + } + return this._getNvueWaterfallSingleConfig('column-count', 2); + }, + nWaterfallColumnWidth() { + return this._getNvueWaterfallSingleConfig('column-width', 'auto'); + }, + nWaterfallColumnGap() { + return this._getNvueWaterfallSingleConfig('column-gap', 'normal'); + }, + nWaterfallLeftGap() { + return this._getNvueWaterfallSingleConfig('left-gap', 0); + }, + nWaterfallRightGap() { + return this._getNvueWaterfallSingleConfig('right-gap', 0); + }, + nViewIs() { + const finalNvueListIs = this.finalNvueListIs; + return finalNvueListIs === 'scroller' || finalNvueListIs === 'view' ? 'view' : finalNvueListIs === + 'waterfall' ? 'header' : 'cell'; + }, + nSafeAreaBottomHeight() { + return this.safeAreaInsetBottom ? this.safeAreaBottom : 0; + } + }, + methods: { + //请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为是否成功(默认是是) + complete(data, success = true) { + this.customNoMore = -1; + this.addData(data, success); + }, + //【保证数据一致】请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为dataKey,需与:data-key绑定的一致,第三个参数为是否成功(默认为是) + completeByKey(data, dataKey = null, success = true) { + if (dataKey !== null && this.dataKey !== null && dataKey !== this.dataKey) { + return; + } + this.customNoMore = -1; + this.addData(data, success); + }, + //【通过totalCount判断是否有更多数据】请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为totalCount(列表总数),第三个参数为是否成功(默认为是) + completeByTotalCount(data, totalCount, success = true) { + if (totalCount == 'undefined') { + this.customNoMore = -1; + } else { + let dataTypeRes = this._checkDataType(data, success, false); + data = dataTypeRes.data; + success = dataTypeRes.success; + if (totalCount >= 0 && success) { + this.$nextTick(() => { + let nomore = true; + let realTotalDataCount = this.realTotalData.length; + if (this.pageNo == this.defaultPageNo) { + realTotalDataCount = 0; + } + let exceedCount = realTotalDataCount + data.length - totalCount; + if (exceedCount >= 0) { + nomore = false; + exceedCount = this.defaultPageSize - exceedCount; + if (exceedCount > 0 && exceedCount < data.length) { + data = data.splice(0, exceedCount); + } + } + this.completeByNoMore(data, nomore, success); + }) + return; + } + } + this.addData(data, success); + }, + //【自行判断是否有更多数据】请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为是否有更多数据,第三个参数为是否成功(默认是是) + completeByNoMore(data, nomore, success = true) { + if (nomore != 'undefined') { + this.customNoMore = nomore == true ? 1 : 0; + } + this.addData(data, success); + }, + //与上方complete方法功能一致,新版本中设置服务端回调数组请使用complete方法 + addData(data, success = true) { + this.$nextTick(() => { + if (this.delay > 0) { + setTimeout(() => { + this._addData(data, success, false); + }, this.delay) + } else { + this._addData(data, success, false); + } + }) + }, + //设置i18n国际化语言 + setI18n(language) { + zI18n.setLanguage(language); + }, + //获取当前z-paging的语言 + getLanguage() { + return this.finalLanguage; + }, + //当前版本号 + getVersion() { + return `z-paging ${currentVersion}`; + }, + //添加聊天记录 + addChatRecordData(data, toBottom = true, toBottomWithAnimate = true) { + let dataType = Object.prototype.toString.call(data); + if (dataType !== '[object Array]') { + data = [data]; + } + if (!this.useChatRecordMode) { + return; + } + this.isTotalChangeFromAddData = true; + //#ifndef APP-NVUE + this.totalData = [...this.totalData, ...data]; + //#endif + //#ifdef APP-NVUE + if (this.nIsFirstPageAndNoMore) { + this.totalData = [...this.totalData, ...data]; + } else { + this.totalData = [...data, ...this.totalData]; + } + //#endif + if (toBottom) { + setTimeout(() => { + //#ifndef APP-NVUE + this._scrollToBottom(toBottomWithAnimate); + //#endif + //#ifdef APP-NVUE + if (this.nIsFirstPageAndNoMore) { + this._scrollToBottom(toBottomWithAnimate); + } else { + this._scrollToTop(toBottomWithAnimate); + } + //#endif + }, commonDelayTime) + } + }, + //从顶部添加数据,不会影响分页的pageNo和pageSize + addDataFromTop(data, toTop = true, toTopWithAnimate = true) { + let dataType = Object.prototype.toString.call(data); + if (dataType !== '[object Array]') { + data = [data]; + } + this.totalData = [...data, ...this.totalData]; + if (toTop) { + setTimeout(() => { + this._scrollToTop(toTopWithAnimate); + }, commonDelayTime) + } + }, + //重新设置列表数据,调用此方法不会影响pageNo和pageSize,也不会触发请求。适用场景:当需要删除列表中某一项时,将删除对应项后的数组通过此方法传递给z-paging。(当出现类似的需要修改列表数组的场景时,请使用此方法,请勿直接修改page中:list.sync绑定的数组) + resetTotalData(data) { + if (data == undefined) { + if (this.showConsoleError) { + zUtils.consoleErr('方法resetTotalData参数缺失!'); + } + return; + } + this.isTotalChangeFromAddData = true; + let dataType = Object.prototype.toString.call(data); + if (dataType !== '[object Array]') { + data = [data]; + } + this.totalData = data; + }, + //设置本地分页数据,请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging作分页处理(若调用了此方法,则上拉加载更多时内部会自动分页,不会触发@query所绑定的事件) + setLocalPaging(data, success = true) { + this.isLocalPaging = true; + this.$nextTick(() => { + this._addData(data, success, true); + }) + }, + //重新加载分页数据,pageNo会恢复为默认值,相当于下拉刷新的效果(animate为true时会展示下拉刷新动画,默认为false) + reload(animate = this.showRefresherWhenReload) { + if (animate) { + this.privateShowRefresherWhenReload = animate; + this.isUserPullDown = true; + } + this._preReload(animate, false); + }, + //清空分页数据 + clean() { + this._reload(true); + this._addData([], true, false); + }, + //手动触发滚动到顶部加载更多,聊天记录模式时有效 + doChatRecordLoadMore() { + if (this.useChatRecordMode) { + this._onLoadingMore('click'); + } + }, + //手动触发上拉加载更多(非必须,可依据具体需求使用) + doLoadMore() { + this._onLoadingMore('toBottom'); + }, + //手动停止下拉刷新加载 + endRefresh() { + this.refresherTriggered = false; + }, + //滚动到顶部,animate为是否展示滚动动画,默认为是 + scrollToTop(animate) { + this.$nextTick(() => { + this._scrollToTop(animate, false); + // #ifdef APP-NVUE + if (this.nvueFastScroll && animate) { + setTimeout(() => { + this._scrollToTop(false, false); + }, 150); + } + // #endif + }) + }, + //滚动到底部,animate为是否展示滚动动画,默认为是 + scrollToBottom(animate) { + this.$nextTick(() => { + this._scrollToBottom(animate); + // #ifdef APP-NVUE + if (this.nvueFastScroll && animate) { + setTimeout(() => { + this._scrollToBottom(false); + }, 150); + } + // #endif + }) + }, + //滚动到指定view(vue中有效)。sel为需要滚动的view的id值,不包含"#";offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否 + scrollIntoViewById(sel, offset, animate) { + this._scrollIntoView(sel, offset, animate); + }, + //滚动到指定view(vue中有效)。nodeTop为需要滚动的view的top值(通过uni.createSelectorQuery()获取);offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否 + scrollIntoViewByNodeTop(nodeTop, offset, animate) { + this.scrollTop = this.oldScrollTop; + this.$nextTick(() => { + this._scrollIntoViewByNodeTop(nodeTop, offset, animate); + }) + }, + //滚动到指定view(nvue中有效)。index为需要滚动的view的index(第几个);offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否 + scrollIntoViewByIndex(index, offset, animate) { + this._scrollIntoView(index, offset, animate); + }, + //滚动到指定view(nvue中有效)。view为需要滚动的view(通过`this.$refs.xxx`获取),不包含"#";offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否 + scrollIntoViewByView(view, offset, animate) { + this._scrollIntoView(view, offset, animate); + }, + //当使用页面滚动并且自定义下拉刷新时,请在页面的onPageScroll中调用此方法,告知z-paging当前的pageScrollTop,否则会导致在任意位置都可以下拉刷新 + updatePageScrollTop(value) { + if (value == undefined) { + //zUtils.consoleErr('updatePageScrollTop方法缺少参数,请将页面onPageScroll事件中的scrollTop传递给此方法'); + return; + } + this.pageScrollTop = value; + }, + //当使用页面滚动并且设置了slot="top"时,默认初次加载会自动获取其高度,并使内部容器下移,当slot="top"的view高度动态改变时,在其高度需要更新时调用此方法 + updatePageScrollTopHeight() { + this._updatePageScrollTopOrBottomHeight('top'); + }, + //当使用页面滚动并且设置了slot="bottom"时,默认初次加载会自动获取其高度,并使内部容器下移,当slot="bottom"的view高度动态改变时,在其高度需要更新时调用此方法 + updatePageScrollBottomHeight() { + this._updatePageScrollTopOrBottomHeight('bottom'); + }, + //更新z-paging内置scroll-view的scrollTop + updateScrollViewScrollTop(scrollTop, animate = true) { + this.privateScrollWithAnimation = animate ? 1 : 0; + this.scrollTop = this.oldScrollTop; + this.$nextTick(() => { + this.scrollTop = scrollTop; + this.oldScrollTop = this.scrollTop; + }); + }, + //设置nvue List的specialEffects + setListSpecialEffects(args) { + this.nFixFreezing = args !== {}; + if (!this.usePageScroll) { + this.$refs['n-list'].setSpecialEffects(args); + } + }, + handleRefresherStatusChanged(func) { + this.refresherStatusChangedFunc = func; + }, + //------------------ 私有方法 ------------------------ + //reload之前的一些处理 + _preReload(animate = this.showRefresherWhenReload, isFromMounted = true) { + this.isUserReload = true; + if (animate) { + this.privateShowRefresherWhenReload = animate; + // #ifndef APP-NVUE + if (this.useCustomRefresher) { + this._doRefresherRefreshAnimate(); + } else { + this.refresherTriggered = true; + } + // #endif + // #ifdef APP-NVUE + this.refresherStatus = 2; + this.refresherRevealStackCount++; + setTimeout(() => { + this._getNodeClientRect('zp-n-refresh-container', false).then((node) => { + if (node) { + let nodeHeight = node[0].height; + this.nShowRefresherReveal = true; + this.nShowRefresherRevealHeight = nodeHeight; + setTimeout(() => { + this._nDoRefresherEndAnimation(0, -nodeHeight, false, false); + setTimeout(() => { + this._nDoRefresherEndAnimation(nodeHeight, 0); + }, 10) + }, 10) + this._reload(false, isFromMounted); + } else { + this._reload(false, isFromMounted); + } + }); + }, 10) + return; + // #endif + } else { + this._refresherEnd(false, false); + } + this._reload(false, isFromMounted); + }, + //重新加载分页数据 + _reload(isClean = false, isFromMounted = false) { + this.isAddedData = false; + this.cacheScrollNodeHeight = -1; + this.insideOfPaging = -1; + this.pageNo = this.defaultPageNo; + if (!isClean) { + this._startLoading(true); + } + this.firstPageLoaded = true; + this.isTotalChangeFromAddData = false; + this.totalData = []; + if (!isClean) { + this.$emit('query', this.pageNo, this.defaultPageSize); + let delay = 0; + // #ifdef MP-TOUTIAO + delay = 5; + // #endif + setTimeout(() => { + this._callMyParentQuery(); + }, delay) + if (!isFromMounted && this.autoScrollToTopWhenReload) { + let checkedNRefresherLoading = true; + // #ifdef APP-NVUE + checkedNRefresherLoading = !this.nRefresherLoading; + // #endif + if (checkedNRefresherLoading) { + this._scrollToTop(false); + } + } + // #ifndef APP-NVUE + if (!this.usePageScroll && this.useChatRecordMode) { + if (this.showConsoleError) { + zUtils.consoleWarn('使用聊天记录模式时,建议使用页面滚动,可���usePageScroll设置为true以启用页面滚动!!'); + } + } + // #endif + } + this.$nextTick(() => { + if (!this.realTotalData.length) { + // #ifdef APP-NVUE + this.nShowBottom = false; + // #endif + } + }) + }, + //处理服务端返回的数组 + _addData(data, success, isLocal) { + this.isAddedData = true; + this.isTotalChangeFromAddData = true; + if (!this.useCustomRefresher) { + uni.stopPullDownRefresh(); + } + // #ifdef APP-NVUE + if (this.usePageScroll) { + uni.stopPullDownRefresh(); + } + // #endif + if (this.isUserPullDown && this.showRefresherUpdateTime && this.pageNo === this.defaultPageNo) { + zUtils.setRefesrherTime((new Date()).getTime(), this.refresherUpdateTimeKey); + this.tempLanguageUpdateKey = (new Date()).getTime(); + if (this.$refs.refresh) { + this.$refs.refresh.updateTime(); + } + } + if (this.isUserPullDown && this.pageNo === this.defaultPageNo) { + this.isUserPullDown = false; + } + let dataTypeRes = this._checkDataType(data, success, true); + data = dataTypeRes.data; + success = dataTypeRes.success; + if (this.refresherTriggered) { + this.refresherTriggered = false; + } + let delayTime = commonDelayTime; + // #ifdef APP-NVUE + if (this.useChatRecordMode) { + delayTime = 0 + } + // #endif + setTimeout(() => { + this._refresherEnd(true, true); + this.pagingLoaded = true; + }, delayTime) + if (this.pageNo === this.defaultPageNo) { + this.isLoadFailed = !success; + } + if (success) { + this.loadingStatus = 0; + if (isLocal) { + this.totalLocalPagingList = data; + this._localPagingQueryList(this.defaultPageNo, this.defaultPageSize, 0, (res) => { + this.complete(res); + }) + } else { + this._currentDataChange(data, this.currentData); + } + } else { + this._currentDataChange(data, this.currentData); + this.loadingStatus = 3; + if (this.loadingType === 1) { + this.pageNo--; + } + } + }, + //当前数据改变时调用 + _currentDataChange(newVal, oldVal) { + newVal = [...newVal]; + // #ifndef APP-NVUE + if (this.useChatRecordMode) { + newVal.reverse(); + } + // #endif + if (this.pageNo === this.defaultPageNo && this.concat) { + this.totalData = []; + } + if (this.customNoMore !== -1) { + if (this.customNoMore === 0 || !newVal.length) { + this.loadingStatus = 2; + } + } else { + if (!newVal.length || + (newVal.length && newVal.length < this.defaultPageSize)) { + this.loadingStatus = 2; + } + } + if (!this.totalData.length) { + if (this.concat) { + this.totalData = newVal; + } + if (this.useChatRecordMode) { + // #ifndef APP-NVUE + this.$nextTick(() => { + this._scrollToBottom(false); + }) + // #endif + } + } else { + if (this.useChatRecordMode) { + // #ifdef APP-NVUE + this.totalData = [...this.totalData, ...newVal]; + // #endif + //#ifndef APP-NVUE + const idIndex = newVal.length; + let idIndexStr = `z-paging-${idIndex}`; + this.totalData = [...newVal, ...this.totalData]; + if (this.pageNo !== this.defaultPageNo) { + this.privateScrollWithAnimation = 0; + let delayTime = 200; + //#ifdef H5 + delayTime = 0; + //#endif + this.$emit('update:chatIndex', idIndex); + if (this.usePageScroll) { + this._scrollIntoView(idIndexStr, 30, false, () => { + this.$emit('update:chatIndex', 0); + }); + } else { + setTimeout(() => { + this._scrollIntoView(idIndexStr, 30, false, () => { + this.$emit('update:chatIndex', 0); + }); + }, delayTime) + } + } else { + this.$nextTick(() => { + this._scrollToBottom(false); + }) + } + //#endif + + } else { + if (this.concat) { + this.totalData = [...this.totalData, ...newVal]; + } + } + } + }, + //通过@scroll事件检测是否滚动到了底部 + _checkScrolledToBottom(scrollDiff, checked = false) { + if (this.checkScrolledToBottomTimeOut) { + clearTimeout(this.checkScrolledToBottomTimeOut); + this.checkScrolledToBottomTimeOut = null; + } + if (this.cacheScrollNodeHeight === -1) { + this._getNodeClientRect('.zp-scroll-view').then((res) => { + if (res) { + let pageScrollNodeHeight = res[0].height; + this.cacheScrollNodeHeight = pageScrollNodeHeight; + if (scrollDiff - pageScrollNodeHeight <= this.finalLowerThreshold) { + this._onLoadingMore('toBottom'); + } + } + }); + } else { + if (scrollDiff - this.cacheScrollNodeHeight <= this.finalLowerThreshold) { + this._onLoadingMore('toBottom'); + } else if (scrollDiff - this.cacheScrollNodeHeight <= 500 && !checked) { + this.checkScrolledToBottomTimeOut = setTimeout(() => { + this._getNodeClientRect('.zp-scroll-view', true, true).then((res) => { + this.oldScrollTop = res[0].scrollTop; + const newScrollDiff = res[0].scrollHeight - this.oldScrollTop; + this._checkScrolledToBottom(newScrollDiff, true); + }) + }, 150) + } + } + }, + //触发加载更多时调用,from:0-滑动到底部触发;1-点击加载更多触发 + _onLoadingMore(from = 'click') { + if (from === 'toBottom') { + if (!this.scrollToBottomBounceEnabled) { + if (this.scrollEnable) { + this.scrollEnable = false; + this.$nextTick(() => { + this.scrollEnable = true; + }) + } + } + //#ifdef APP-VUE || H5 + if (this.isIos) { + this.renderPropUsePageScroll = -1; + this.$nextTick(() => { + this.renderPropUsePageScroll = this.usePageScroll; + }) + } + //#endif + } + this.$emit('scrolltolower', from); + if (from === 'toBottom' && (!this.toBottomLoadingMoreEnabled || this.useChatRecordMode)) { + return; + } + if (this.refresherOnly || !this.loadingMoreEnabled || !(this.loadingStatus === 0 || 3) || this.loading) + return; + this._doLoadingMore(); + }, + //当滚动到顶部时 + _scrollToUpper() { + this.$emit('scrolltoupper'); + this.$emit('scrollTopChange', 0); + this.$nextTick(() => { + this.oldScrollTop = 0; + }) + if (!this.useChatRecordMode) { + return; + } + if (this.loadingStatus === 2) { + return; + } + + this._onLoadingMore('click'); + }, + //点击返回顶部 + _backToTopClick() { + if (!this.backToTopWithAnimate) { + this._checkShouldShowBackToTop(1, 0); + } + this.scrollToTop(this.backToTopWithAnimate); + }, + //滚动到顶部 + _scrollToTop(animate, isPrivate = true) { + // #ifdef APP-NVUE + const el = this.$refs['zp-n-list-top-tag']; + if (this.usePageScroll) { + this._getNodeClientRect('zp-page-scroll-top', false).then((node) => { + if (node) { + let nodeHeight = node[0].height; + weexDom.scrollToElement(el, { + offset: -nodeHeight, + animated: animate + }); + } + }); + } else { + weexDom.scrollToElement(el, { + offset: 0, + animated: animate + }); + } + return; + // #endif + if (this.usePageScroll) { + this.$nextTick(() => { + uni.pageScrollTo({ + scrollTop: 0, + duration: animate ? 100 : 0, + }); + }); + return; + } + this.privateScrollWithAnimation = animate ? 1 : 0; + this.scrollTop = this.oldScrollTop; + this.$nextTick(() => { + this.scrollTop = 0; + this.oldScrollTop = this.scrollTop; + }); + }, + //滚动到底部 + async _scrollToBottom(animate = true) { + // #ifdef APP-NVUE + const el = this.$refs['zp-n-list-bottom-tag']; + weexDom.scrollToElement(el, { + offset: 0, + animated: animate + }); + return; + // #endif + if (this.usePageScroll) { + this.$nextTick(() => { + uni.pageScrollTo({ + scrollTop: Number.MAX_VALUE, + duration: animate ? 100 : 0, + }); + }); + return; + } + try { + this.privateScrollWithAnimation = animate ? 1 : 0; + let pagingContainerH = 0; + let scrollViewH = 0; + const pagingContainerNode = await this._getNodeClientRect('.zp-paging-container'); + const scrollViewNode = await this._getNodeClientRect('.zp-scroll-view'); + if (pagingContainerNode) { + pagingContainerH = pagingContainerNode[0].height; + } + if (scrollViewNode) { + scrollViewH = scrollViewNode[0].height; + } + if (pagingContainerH > scrollViewH) { + this.scrollTop = this.oldScrollTop; + this.$nextTick(() => { + this.scrollTop = pagingContainerH - scrollViewH; + this.oldScrollTop = this.scrollTop; + }); + } + } catch (e) { + + } + }, + //滚动到指定view + _scrollIntoView(sel, offset = 0, animate = false, finishCallback) { + try { + this.scrollTop = this.oldScrollTop; + this.$nextTick(() => { + // #ifdef APP-NVUE + const refs = this.$parent.$refs; + if (!refs) { + return; + } + const dataType = Object.prototype.toString.call(sel); + let el = null; + if (dataType === '[object Number]') { + const els = refs[`z-paging-${sel}`]; + el = els ? els[0] : null; + } else if (dataType === '[object Array]') { + el = sel[0]; + } else { + el = sel; + } + if (el) { + weexDom.scrollToElement(el, { + offset: -offset, + animated: animate + }); + } else { + zUtils.consoleErr('在nvue中滚动到指定位置,cell必须设置 :ref="`z-paging-${index}`"'); + } + return; + // #endif + if (sel.indexOf('#') != -1) { + sel = sel.replace('#', ''); + } + this._getNodeClientRect('#' + sel, false).then((node) => { + if (node) { + let nodeTop = node[0].top; + this._scrollIntoViewByNodeTop(nodeTop, offset, animate); + if (finishCallback) { + finishCallback(); + } + } + }); + }); + } catch (e) { + + } + }, + //通过nodeTop滚动到指定view + _scrollIntoViewByNodeTop(nodeTop, offset = 0, animate = false) { + this.privateScrollWithAnimation = animate ? 1 : 0; + if (this.usePageScroll) { + uni.pageScrollTo({ + scrollTop: nodeTop - offset, + duration: animate ? 100 : 0 + }); + } else { + nodeTop = nodeTop + this.oldScrollTop; + this.scrollTop = nodeTop - offset; + this.oldScrollTop = this.scrollTop; + } + }, + //是否要展示上拉加载更多view + _shouldShowLoading(type) { + if (!(this.loadingStatus === 0 ? this.nShowBottom : true)) { + return false; + } + if (((!this.showLoadingMoreWhenReload || this.isUserPullDown || this.loadingStatus !== 1) && !this + .showLoadingMore) || (!this.loadingMoreEnabled && (!this.showLoadingMoreWhenReload || this + .isUserPullDown || this.loadingStatus !== 1)) || this + .refresherOnly) { + return false; + } + if (this.useChatRecordMode && type !== 'loadingMoreLoading') { + return false; + } + if (!this.$slots) { + return false; + } + if (type === 'loadingMoreDefault') { + const res = this.loadingStatus === 0 && this.$slots.loadingMoreDefault; + if (res) { + // #ifdef APP-NVUE + if (!this.isIos) { + this.nLoadingMoreFixedHeight = false; + } + // #endif + } + return res; + } else if (type === 'loadingMoreLoading') { + const res = this.loadingStatus === 1 && this.$slots.loadingMoreLoading; + if (res) { + // #ifdef APP-NVUE + if (!this.isIos) { + this.nLoadingMoreFixedHeight = false; + } + // #endif + } + return res; + } else if (type === 'loadingMoreNoMore') { + const res = this.loadingStatus === 2 && this.$slots.loadingMoreNoMore && this.showLoadingMoreNoMoreView; + if (res) { + // #ifdef APP-NVUE + if (!this.isIos) { + this.nLoadingMoreFixedHeight = false; + } + // #endif + } + return res; + } else if (type === 'loadingMoreFail') { + const res = this.loadingStatus === 3 && this.$slots.loadingMoreFail; + if (res) { + // #ifdef APP-NVUE + if (!this.isIos) { + this.nLoadingMoreFixedHeight = false; + } + // #endif + } + return res; + } else if (type === 'loadingMoreCustom') { + const res = this.showDefaultLoadingMoreText && !(this.loadingStatus === 2 && !this + .showLoadingMoreNoMoreView); + return res; + } + return false; + }, + //处理开始加载更多状态 + _startLoading(isReload = false) { + if ((this.showLoadingMoreWhenReload && !this.isUserPullDown) || !isReload) { + this.loadingStatus = 1; + } + this.loading = true; + }, + //处理开始加载更多 + _doLoadingMore() { + if (this.pageNo >= this.defaultPageNo && this.loadingStatus !== 2) { + this.pageNo++; + this._startLoading(false); + if (this.isLocalPaging) { + this._localPagingQueryList(this.pageNo, this.defaultPageSize, this.localPagingLoadingTime, ( + res) => { + this.addData(res); + }) + } else { + this.$emit('query', this.pageNo, this.defaultPageSize); + this._callMyParentQuery(); + } + this.loadingType = 1; + } + }, + _scroll(e) { + this.$emit('scroll', e); + this.oldScrollTop = e.detail.scrollTop; + const scrollDiff = e.detail.scrollHeight - this.oldScrollTop; + if (!this.isIos) { + this._checkScrolledToBottom(scrollDiff); + } + }, + //自定义下拉刷新被触发 + _onRefresh() { + if (this.loading || this.nShowRefresherReveal) { + return; + } + this.isUserPullDown = true; + this.isUserReload = false; + this._startLoading(true); + this.refresherTriggered = true; + if (this.useChatRecordMode) { + this._onLoadingMore('click') + } else { + this._reload(); + } + this.$emit('onRefresh'); + this.$emit('Refresh'); + this.loadingType = 0; + }, + //自定义下拉刷新被复位 + _onRestore() { + this.refresherTriggered = 'restore'; + this.$emit('onRestore'); + this.$emit('Restore'); + }, + //拖拽开始 + _refresherTouchstart(e) { + if (this._getRefresherTouchDisabled()) { + return; + } + const touch = zUtils.getCommonTouch(e); + this._handleRefresherTouchstart(touch); + }, + //进一步处理拖拽开始结果 + _handleRefresherTouchstart(touch) { + if (!this.loading && this.isTouchEnded) { + this.isTouchmoving = false; + } + this.isTouchEnded = false; + if (this.isIos13) { + this.refresherTransition = ''; + } else { + this.refresherTransition = 'transform .1s linear'; + } + this.refresherTouchstartY = touch.touchY; + this.$emit('refresherTouchstart', this.refresherTouchstartY); + this.lastRefresherTouchmove = touch; + }, + //拖拽中 + _refresherTouchmove(e) { + const currentTimeStamp = (new Date()).getTime(); + if (this.pullDownTimeStamp && currentTimeStamp - this.pullDownTimeStamp <= this.pullDownDisTimeStamp) { + return; + } + if (this._getRefresherTouchDisabled()) { + return; + } + this.pullDownTimeStamp = Number(currentTimeStamp); + const touch = zUtils.getCommonTouch(e); + let refresherTouchmoveY = touch.touchY; + let moveDistance = refresherTouchmoveY - this.refresherTouchstartY; + if (moveDistance < 0) { + return; + } + if (this.refresherMaxAngle >= 0 && this.refresherMaxAngle <= 90 && this.lastRefresherTouchmove && this + .lastRefresherTouchmove.touchY <= refresherTouchmoveY) { + if (!moveDistance && !this.refresherAngleEnableChangeContinued && this.moveDistance < 1 && !this + .refresherReachMaxAngle) { + return; + } + const x = Math.abs(touch.touchX - this.lastRefresherTouchmove.touchX); + const y = Math.abs(refresherTouchmoveY - this.lastRefresherTouchmove.touchY); + const z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); + if ((x || y) && x > 1) { + const angle = Math.asin(y / z) / Math.PI * 180; + if (angle < this.refresherMaxAngle) { + this.lastRefresherTouchmove = touch; + this.refresherReachMaxAngle = false; + return; + } + } + } + moveDistance = this._getFinalRefresherMoveDistance(moveDistance); + this._handleRefresherTouchmove(moveDistance, touch); + if (!this.disabledBounce) { + this._handleScrollViewDisableBounce({ + bounce: false + }); + this.disabledBounce = true; + } + }, + //进一步处理拖拽中结果 + _handleRefresherTouchmove(moveDistance, touch) { + this.refresherReachMaxAngle = true; + if (!this.isTouchmoving) { + this.isTouchmoving = true; + } + //this.refresherTransition = ''; + this.isTouchEnded = false; + if (moveDistance >= this.finalRefresherThreshold) { + this.refresherStatus = 1; + } else { + this.refresherStatus = 0; + } + // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 + // this.scrollEnable = false; + this.refresherTransform = `translateY(${moveDistance}px)`; + this.lastRefresherTouchmove = touch; + // #endif + this.moveDistance = moveDistance; + this.$emit('refresherTouchmove', moveDistance); + }, + //拖拽结束 + _refresherTouchend(e) { + if (this._getRefresherTouchDisabled() || !this.isTouchmoving) { + return; + } + const touch = zUtils.getCommonTouch(e); + let refresherTouchendY = touch.touchY; + let moveDistance = refresherTouchendY - this.refresherTouchstartY; + moveDistance = this._getFinalRefresherMoveDistance(moveDistance); + this._handleRefresherTouchend(moveDistance); + this._handleScrollViewDisableBounce({ + bounce: true + }); + this.disabledBounce = false; + }, + //进一步处理拖拽结束结果 + _handleRefresherTouchend(moveDistance) { + // #ifndef APP-PLUS || H5 || MP-WEIXIN + if (!this.isTouchmoving) { + return; + } + // #endif + this.refresherReachMaxAngle = true; + if (moveDistance < 0 && this.usePageScroll && this.loadingMoreEnabled && this.useCustomRefresher && this + .pageScrollTop === -1) { + if (this.showConsoleError) { + zUtils.consoleErr( + 'usePageScroll为true并且自定义下拉刷新时必须引入mixin或在page滚动时通过调用z-paging组件的updatePageScrollTop方法设置当前的scrollTop' + ) + } + } + this.isTouchEnded = true; + if (moveDistance >= this.finalRefresherThreshold && this.refresherStatus === 1) { + // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 + this.refresherTransform = `translateY(${this.finalRefresherThreshold}px)`; + // #endif + this.moveDistance = this.finalRefresherThreshold; + this.refresherStatus = 2; + this._doRefresherLoad(); + } else { + this._refresherEnd(true, false); + setTimeout(() => { + this.isTouchmoving = false; + }, commonDelayTime); + } + this.scrollEnable = true; + this.refresherTransition = 'transform .1s linear'; + this.$emit('refresherTouchend', moveDistance); + }, + //处理scroll-view bounce是否生效 + _handleScrollViewDisableBounce(e) { + if (!this.usePageScroll && !this.scrollToTopBounceEnabled) { + if (this.isIos13) { + this.refresherTransition = ''; + } + if (!e.bounce) { + if (this.scrollEnable) { + this.scrollEnable = false; + } + } else { + this.scrollEnable = true; + } + } + }, + //wxs正在下拉处理 + _handleWxsOnPullingDown(onPullingDown) { + this.wxsOnPullingDown = onPullingDown; + if (onPullingDown) { + if (!this.useChatRecordMode) { + this.renderPropScrollTop = 0; + } + } + }, + //下拉刷新结束 + _refresherEnd(shouldEndLoadingDelay = true, fromAddData = false) { + // #ifndef APP-NVUE + if (this.showRefresherWhenReload || this.privateShowRefresherWhenReload) { + const stackCount = this.refresherRevealStackCount; + this.refresherRevealStackCount--; + if (stackCount > 1) { + return; + } + this.refresherStatus = 0; + } else { + setTimeout(() => { + this.refresherStatus = 0; + }, commonDelayTime); + } + // #endif + if (this.refresherEndBounceEnabled && fromAddData) { + this.refresherTransition = 'transform 0.3s cubic-bezier(0.19,1.64,0.42,0.72)'; + } + // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 + this.refresherTransform = 'translateY(0px)'; + // #endif + // #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 + this.wxsPropType = 'end' + (new Date()).getTime(); + // #endif + this.moveDistance = 0; + if (shouldEndLoadingDelay) { + setTimeout(() => { + this.loading = false; + }, commonDelayTime); + } else { + this.loading = false; + } + this.$emit('onRestore'); + this.$emit('Restore'); + // #ifdef APP-NVUE + this._nRefresherEnd(); + // #endif + }, + //模拟用户手动触发下拉刷新 + _doRefresherRefreshAnimate() { + this.refresherRevealStackCount++; + this.refresherTransform = `translateY(${this.finalRefresherThreshold}px)`; + // #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 + this.wxsPropType = 'begin' + (new Date()).getTime(); + // #endif + this.moveDistance = this.finalRefresherThreshold; + this.refresherStatus = 2; + this.isTouchmoving = true; + }, + //触发下拉刷新 + _doRefresherLoad() { + this._onRefresh(); + this.loading = true; + }, + //获取处理后的moveDistance + _getFinalRefresherMoveDistance(moveDistance) { + moveDistance = moveDistance * 0.85; + if (moveDistance >= this.finalRefresherThreshold) { + moveDistance = this.finalRefresherThreshold + (moveDistance - this.finalRefresherThreshold) * (1 - this + .finalRefresherOutRate); + } + return moveDistance; + }, + //(预处理)判断当没有更多数据且分页内容未超出z-paging时是否显示没有更多数据的view + _preCheckShowLoadingMoreWhenNoMoreAndInsideOfPaging(newVal, scrollViewNode, pagingContainerNode) { + if (this.loadingStatus === 2 && this.hideLoadingMoreWhenNoMoreByLimit > 0 && + newVal.length) { + this.showLoadingMore = newVal.length > this.hideLoadingMoreWhenNoMoreByLimit; + } else if ((this.loadingStatus === 2 && this.hideLoadingMoreWhenNoMoreAndInsideOfPaging && + newVal.length) || (this.insideMore && this.insideOfPaging !== false && + newVal.length)) { + this.$nextTick(() => { + this._checkShowLoadingMoreWhenNoMoreAndInsideOfPaging(newVal, scrollViewNode, + pagingContainerNode); + }) + if (this.insideMore && this.insideOfPaging !== false && + newVal.length) { + this.showLoadingMore = newVal.length; + } + } else { + this.showLoadingMore = newVal.length; + } + }, + //判断当没有更多数据且分页内容未超出z-paging时是否显示没有更多数据的view + async _checkShowLoadingMoreWhenNoMoreAndInsideOfPaging(totalData, oldScrollViewNode, oldPagingContainerNode) { + try { + const scrollViewNode = oldScrollViewNode || await this._getNodeClientRect('.zp-scroll-view'); + if (this.usePageScroll) { + if (scrollViewNode) { + const scrollViewTotalH = scrollViewNode[0].top + scrollViewNode[0].height; + this.insideOfPaging = scrollViewTotalH < this.systemInfo.windowHeight; + if (this.hideLoadingMoreWhenNoMoreAndInsideOfPaging) { + this.showLoadingMore = !this.insideOfPaging; + } + this._updateInsideOfPaging(); + } + } else { + let pagingContainerH = 0; + let scrollViewH = 0; + const pagingContainerNode = oldPagingContainerNode || await this._getNodeClientRect( + '.zp-paging-container-content'); + if (pagingContainerNode) { + pagingContainerH = pagingContainerNode[0].height; + } + if (scrollViewNode) { + scrollViewH = scrollViewNode[0].height; + } + this.insideOfPaging = pagingContainerH < scrollViewH; + if (this.hideLoadingMoreWhenNoMoreAndInsideOfPaging) { + this.showLoadingMore = !this.insideOfPaging; + } + this._updateInsideOfPaging(); + } + } catch (e) { + this.insideOfPaging = !totalData.length; + if (this.hideLoadingMoreWhenNoMoreAndInsideOfPaging) { + this.showLoadingMore = !this.insideOfPaging; + } + this._updateInsideOfPaging(); + } + }, + //检测z-paging是否超出了页面高度 + async _checkScrollViewOutOfPage() { + try { + const scrollViewNode = await this._getNodeClientRect('.zp-scroll-view'); + if (scrollViewNode) { + const scrollViewTotalH = scrollViewNode[0].top + scrollViewNode[0].height; + if (scrollViewTotalH > this.systemInfo.windowHeight + 100) { + if (this.showConsoleError) { + zUtils.consoleWarn( + '检测到z-paging的高度超出页面高度,这将导致滚动或展示出现异常,请设置【:fixed="true"】或【确保z-paging有确定的高度(如果通过百分比设置z-paging的高度,请保证z-paging的所有父view已设置高度,同时确保page也设置了height:100%,如:page{height:100%}】,此时z-paging的百分比高度才能生效。详情参考demo或访问:https://ext.dcloud.net.cn/plugin?id=3935)' + ); + } + } + } + } catch (e) { + + } + }, + //检测z-paging是否要全屏覆盖(当使用页面滚动并且不满全屏时,默认z-paging需要铺满全屏,避免数据过少时内部的empty-view无法正确展示) + async _checkScrollViewShouldFullHeight(callback) { + try { + const scrollViewNode = await this._getNodeClientRect('.zp-scroll-view'); + const pagingContainerNode = await this._getNodeClientRect('.zp-paging-container-content'); + if (!scrollViewNode || !pagingContainerNode) { + return; + } + const scrollViewHeight = pagingContainerNode[0].height; + const scrollViewTop = scrollViewNode[0].top; + if (this.isAddedData && scrollViewHeight + scrollViewTop <= this.systemInfo.windowHeight) { + this._setAutoHeight(true, scrollViewNode); + callback(scrollViewNode, pagingContainerNode); + } else { + this._setAutoHeight(false); + callback(null, null); + } + } catch (e) { + callback(null, null); + } + }, + //设置z-paging高度 + async _setAutoHeight(shouldFullHeight = true, scrollViewNode = null) { + try { + if (shouldFullHeight) { + let finalScrollViewNode = scrollViewNode ? scrollViewNode : await this._getNodeClientRect( + '.scroll-view'); + if (finalScrollViewNode) { + const scrollViewTop = finalScrollViewNode[0].top; + const scrollViewHeight = this.systemInfo.windowHeight - scrollViewTop; + let additionHeight = this._convertTextToPx(this.autoHeightAddition); + this.$set(this.scrollViewStyle, 'height', scrollViewHeight + additionHeight - (this + .insideMore ? 1 : 0) + 'px'); + } + } else { + this.$delete(this.scrollViewStyle, 'height'); + } + } catch (e) { + + } + }, + //触发更新是否超出页面状态 + _updateInsideOfPaging() { + if (this.insideMore && this.insideOfPaging === true) { + setTimeout(() => { + this.doLoadMore(); + }, 200) + } + }, + //获取节点尺寸 + _getNodeClientRect(select, inThis = true, scrollOffset = false) { + // #ifdef APP-NVUE + select = select.replace('.', '').replace('#', ''); + const ref = this.$refs[select]; + if (ref) { + return new Promise((resolve, reject) => { + weexDom.getComponentRect(ref, option => { + if (option && option.result && option.result) { + resolve([option.size]); + } else { + resolve(false); + } + }) + }); + } else { + return new Promise((resolve, reject) => { + resolve(false); + }); + } + return; + // #endif + let res = null; + if (inThis) { + res = uni.createSelectorQuery().in(this); + } else { + res = uni.createSelectorQuery(); + } + //#ifdef MP-ALIPAY + res = uni.createSelectorQuery(); + //#endif + if (scrollOffset) { + res.select(select).scrollOffset(); + } else { + res.select(select).boundingClientRect(); + } + return new Promise((resolve, reject) => { + res.exec(data => { + if (data && data != '' && data != undefined && data.length) { + resolve(data); + } else { + resolve(false); + } + }); + }); + }, + //判断touch手势是否要触发 + _getRefresherTouchDisabled() { + let checkOldScrollTop = this.oldScrollTop > 5; + const res = this.loading || this.useChatRecordMode || !this.refresherEnabled || !this.useCustomRefresher || + ( + this.usePageScroll && this + .useCustomRefresher && this + .pageScrollTop > 10) || (!(this.usePageScroll && this.useCustomRefresher) && checkOldScrollTop); + return res; + }, + //本地分页请求 + _localPagingQueryList(pageNo, pageSize, localPagingLoadingTime, callback) { + pageNo = parseInt(pageNo); + pageSize = parseInt(pageSize); + if (pageNo < 0 || pageSize <= 0) { + callQueryResult(callback, []); + return; + } + if (pageNo == 0) { + pageNo = 1; + } + let totalPagingList = [...this.totalLocalPagingList]; + let pageNoIndex = (pageNo - 1) * pageSize; + if (pageNoIndex + pageSize <= totalPagingList.length) { + this._localPagingQueryResult(callback, totalPagingList.splice(pageNoIndex, pageSize), + localPagingLoadingTime); + } else if (pageNoIndex < totalPagingList.length) { + this._localPagingQueryResult(callback, totalPagingList.splice(pageNoIndex, totalPagingList.length - + pageNoIndex), + localPagingLoadingTime); + } else { + this._localPagingQueryResult(callback, [], localPagingLoadingTime); + } + }, + //本地分页请求回调 + _localPagingQueryResult(callback, arg, localPagingLoadingTime) { + setTimeout(() => { + callback(arg); + }, localPagingLoadingTime) + }, + //将文本的px或者rpx转为px的值 + _convertTextToPx(text) { + const dataType = Object.prototype.toString.call(text); + if (dataType === '[object Number]') { + return text; + } + let isRpx = false; + if (text.indexOf('rpx') !== -1 || text.indexOf('upx') !== -1) { + text = text.replace('rpx', '').replace('upx', ''); + isRpx = true; + } else if (text.indexOf('px') !== -1) { + text = text.replace('px', ''); + } + if (!isNaN(text)) { + if (isRpx) { + return Number(uni.upx2px(text)); + } + return Number(text); + } + return 0; + }, + + //判断是否要显示返回顶部按钮 + _checkShouldShowBackToTop(newVal, oldVal) { + if (!this.autoShowBackToTop) { + if (this.showBackToTopClass) { + this.showBackToTopClass = false; + } + return; + } + if (newVal !== oldVal) { + if (newVal > this.finalBackToTopThreshold) { + if (!this.showBackToTopClass) { + this.showBackToTopClass = true; + setTimeout(() => { + this.backToTopClass = 'zp-back-to-top zp-back-to-top-show'; + }, 300) + } + } else { + if (this.showBackToTopClass) { + this.backToTopClass = 'zp-back-to-top zp-back-to-top-hide'; + setTimeout(() => { + this.showBackToTopClass = false; + }, 300) + } + } + } + }, + _updatePageScrollTopOrBottomHeight(type) { + // #ifndef APP-NVUE + if (!this.usePageScroll) { + return; + } + // #endif + const node = `.zp-page-scroll-${type}`; + const marginText = `margin${type.slice(0,1).toUpperCase() + type.slice(1)}`; + this.$nextTick(() => { + let delayTime = 0; + // #ifdef MP-BAIDU + delayTime = 10; + // #endif + setTimeout(() => { + this._getNodeClientRect(node).then((res) => { + if (res) { + let pageScrollNodeHeight = res[0].height; + if (type === 'bottom') { + if (this.safeAreaInsetBottom) { + pageScrollNodeHeight += this.safeAreaBottom; + } + } + this.$set(this.scrollViewStyle, marginText, + `${pageScrollNodeHeight}px`); + } else if (this.safeAreaInsetBottom) { + this.$set(this.scrollViewStyle, marginText, + `${this.safeAreaBottom}px`); + } + }); + }, delayTime) + }) + }, + _updateCustomRefresherHeight() { + this._getNodeClientRect('.zp-custom-refresher-slot-view').then((res) => { + if (res) { + this.customRefresherHeight = res[0].height; + if (this.customRefresherHeight > 0) { + this.showCustomRefresher = true; + } + } else { + this.customRefresherHeight = 0; + } + }); + }, + //点击了空数据view重新加载按钮 + _emptyViewReload() { + let callbacked = false; + this.$emit('emptyViewReload', (reload) => { + if (reload === undefined || reload === true) { + this.reload(); + } + callbacked = true; + }); + this.$nextTick(() => { + if (!callbacked) { + this.reload(); + } + }) + }, + //获取国际化转换后的文本 + _getI18nText(key, value) { + const dataType = Object.prototype.toString.call(value); + if (dataType === '[object Object]') { + const nextValue = value[this.finalLanguage]; + if (nextValue) { + return nextValue; + } + } else if (dataType === '[object String]') { + return value; + } + return zI18n[key][this.finalLanguage]; + }, + //修改父view的list + _callMyParentList(newVal) { + if (this.autowireListName.length) { + const myParent = zUtils.getParent(this.$parent); + if (myParent && myParent[this.autowireListName]) { + myParent[this.autowireListName] = newVal; + } + } + }, + //调用父view的query + _callMyParentQuery() { + if (this.autowireQueryName) { + if (this.myParentQuery === -1) { + const myParent = zUtils.getParent(this.$parent); + if (myParent && myParent[this.autowireQueryName]) { + this.myParentQuery = myParent[this.autowireQueryName]; + } + } + if (this.myParentQuery !== -1) { + this.myParentQuery(this.pageNo, this.defaultPageSize); + } + } + }, + //检查complete data的类型 + _checkDataType(data, success, isLocal) { + const dataType = Object.prototype.toString.call(data); + if (dataType === '[object Boolean]') { + success = data; + data = []; + } else if (dataType !== '[object Array]') { + data = []; + let methodStr = isLocal ? 'setLocalPaging' : 'complete'; + if (dataType !== '[object Undefined]') { + if (this.showConsoleError) { + zUtils.consoleErr(`${methodStr}参数类型不正确,第一个参数类型必须为Array!`); + } + } + } + return { + data, + success + }; + }, + // ------------nvue独有的方法---------------- + //列表滚动时触发 + _nOnScroll(e) { + const contentOffsetY = e.contentOffset.y; + this.$emit('scroll', e); + this.nListIsDragging = e.isDragging; + this._checkShouldShowBackToTop(-e.contentOffset.y, -e.contentOffset.y - 1); + }, + //下拉刷新刷新中 + _nOnRrefresh() { + if (this.nShowRefresherReveal) { + return; + } + this.nRefresherLoading = true; + this.refresherStatus = 2; + this._doRefresherLoad(); + }, + //下拉刷新下拉中 + _nOnPullingdown(e) { + if (this.refresherStatus === 2 || (this.isIos && !this.nListIsDragging)) { + return; + } + const viewHeight = e.viewHeight; + const pullingDistance = e.pullingDistance; + if (pullingDistance >= viewHeight) { + this.refresherStatus = 1; + } else { + this.refresherStatus = 0; + } + }, + //下拉刷新结束 + _nRefresherEnd() { + this._nDoRefresherEndAnimation(0, -this.nShowRefresherRevealHeight); + if (!this.nShowBottom) { + setTimeout(() => { + this.$nextTick(() => { + this.nShowBottom = true; + }) + }, 1000); + } + if (!this.usePageScroll) { + this.$refs["n-list"].resetLoadmore(); + } + this.nRefresherLoading = false; + }, + //执行主动触发下拉刷新动画 + _nDoRefresherEndAnimation(height, translateY, animate = true, checkStack = true) { + if (!this.showRefresherWhenReload && !this.privateShowRefresherWhenReload) { + setTimeout(() => { + this.refresherStatus = 0; + }, commonDelayTime); + return; + } + const stackCount = this.refresherRevealStackCount; + if (height === 0 && checkStack) { + this.refresherRevealStackCount--; + if (stackCount > 1) { + return; + } + this.refresherStatus = 0; + } + if (stackCount > 1) { + this.refresherStatus = 2; + } + const duration = animate ? 120 : 0; + weexAnimation.transition(this.$refs['zp-n-list-refresher-reveal'], { + styles: { + height: `${height}px`, + transform: `translateY(${translateY}px)`, + }, + duration: duration, + timingFunction: 'linear', + needLayout: true, + delay: 0 + }) + setTimeout(() => { + if (animate) { + this.nShowRefresherReveal = height > 0; + } + }, duration > 0 ? duration - 100 : 0); + }, + //滚动到底部加载更多 + _nOnLoadmore() { + if (this.nShowRefresherReveal || !this.totalData.length) { + return; + } + if (this.useChatRecordMode) { + this.doChatRecordLoadMore(); + } else { + this._onLoadingMore('toBottom'); + } + }, + //获取nvue waterfall单项配置 + _getNvueWaterfallSingleConfig(key, defaultValue) { + const value = this.nvueWaterfallConfig[key]; + if (value) { + return value; + } + return defaultValue; + } + }, +}; diff --git a/uni_modules/z-paging/components/z-paging/js/z-paging-mixin.js b/uni_modules/z-paging/components/z-paging/js/z-paging-mixin.js new file mode 100644 index 0000000..866b1c2 --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/js/z-paging-mixin.js @@ -0,0 +1,36 @@ +// z-paging +// github地址:https://github.com/SmileZXLee/uni-z-paging +// dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 +// 反馈QQ群:790460711 +// 使用页面滚动时引入此mixin,用于监听和处理onPullDownRefresh等页面生命周期方法 + +const ZPagingMixin = { + onPullDownRefresh() { + if (this.isPagingRefNotFound()) { + return; + } + this.$refs.paging.reload(); + }, + onPageScroll(e) { + if (this.isPagingRefNotFound()) { + return; + } + this.$refs.paging.updatePageScrollTop(e.scrollTop); + if (e.scrollTop < 10) { + this.$refs.paging.doChatRecordLoadMore(); + } + }, + onReachBottom() { + if (this.isPagingRefNotFound()) { + return; + } + this.$refs.paging.doLoadMore(); + }, + methods: { + isPagingRefNotFound() { + return !this.$refs.paging || this.$refs.paging === undefined; + } + } +} + +export default ZPagingMixin; diff --git a/uni_modules/z-paging/components/z-paging/js/z-paging-static.js b/uni_modules/z-paging/components/z-paging/js/z-paging-static.js new file mode 100644 index 0000000..867e845 --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/js/z-paging-static.js @@ -0,0 +1,25 @@ +// z-paging +// github地址:https://github.com/SmileZXLee/uni-z-paging +// dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 +// 反馈QQ群:790460711 +// 公用的静态图片资源 + +const base64Arrow = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAD1BMVEVHcExRUVFMTExRUVFRUVE9CdWsAAAABHRSTlMAjjrY9ZnUjwAAAQFJREFUWMPt2MsNgzAMgGEEE1B1gKJmAIRYoCH7z9RCXrabh33iYktcIv35EEg5ZBh07pvxJU6MFSPOSRnjnBUjUsaciRUjMsb4xIoRCWNiYsUInzE5sWKEyxiYWDbyefqHx1zIeiYTk7mQYziTYecxHvEJjwmIT3hMQELCYSISEg4TkZj0mYTEpM8kJCU9JiMp6TEZyUmbAUhO2gxAQNJiIAKSFgMRmNQZhMCkziAEJTUGIyipMRjBSZkhCE7KDEFIUmTeGCHJxWz0zXaE0GTCG8ZFtEaS347r/1fe11YyHYVfubxayfjoHmc0YYwmmmiiiSaaaKLJ7ckyz5ve+dw3Xw2emdwm9xSbAAAAAElFTkSuQmCC'; +const base64ArrowWhite = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAElBMVEVHcEz///////////////////+IGTx/AAAABnRSTlMA/dAkXZOhASU/AAABYElEQVRYw+2YwXLCIBCGsdAHWGbyAKZ4zxi9O017rxLf/1UaWFAgA1m8dcpedNSPf/l/Vh0Ya/Wn6hN0JcGvoCqRM4C8VBFiDwBqqNuJKV0rAnCgy3AUqZE57x0iqTL8Br4U3WBf/YWaIlTKfAcELU/h9w72CSVPa3C3OCDvhpHbRp/s2vq4fHhCeiCl2A3m4Qd71DQR257mFBlMcTlbFnFWzNtHxewYEfSiaLS4el8d8nyhmKJd1CF4eOS0keLMAuSxubLBIeIGQW8YHCFFo7EH9+YDcQt9FMZEswTheaNxTHwHT8SZorJjMrEVwo4Zo0U8HSEyZvJMOg4RjnmmRr8nDYeIz3OMkbfE/QhBo+U9RnZJxjGCRh/WKmHEMWLNkfPKsGh/CWJk1JjG0kcuJggTt34VDP8aWAFhp4nybVb5+9qQhjSkIQ1pSEMa8k+Q5U9rV3dF8MpFBK+/7miVq1/HZ2qmo9D+pAAAAABJRU5ErkJggg==' +const base64Flower = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAKlBMVEVHcEzDw8Ovr6+pqamUlJTCwsKenp61tbWxsbGysrLNzc2bm5u5ubmjo6MpovhuAAAACnRSTlMA/P79/sHDhiZS0DxZowAABBBJREFUWMPtl89rE0EUx7ctTXatB3MI1SWnDbUKPUgXqh4ED8Uf7KUVSm3ooVSpSii0Fn/gD4j4o+APiEoVmos9FO2celiqZVgwgaKHPQiCCkv+F99kM7Ozm5kxq1dfD91k9pPve9/3ZjbRNHHok/mKli4eIPNgSuRObuN9SqSEzM20iGnm0yIbqCuV7NSSSIV7uyPM6JMBYdeTOanh/QihJYZsUCSby+VkMj2AvOt0rAeQAwqE3lfKMZVlQCZk1QOCKkkVPadITCfIRNKxfoJI5+0OIFtJx14CMSg1mRSDko7VAfksRQzEbGYqxOJcVTWMCH2I1/IACNW0PWU2M8cmAVHtnH5mM1VRWtwKZjOd5JbF6s1IbaYqaotjNlPHgDAnlAizubTR6ovMYn052g/U5qcmOpi0WL8xTS/3IfSet5m8MEr5ajjF5le6dq/OJpobrdY0t3i9QgefWrxW9/1BLhk0E9m8FeUMhhXal499iD0eQRfDF+ts/tttORRerfp+oV7f4xJj82iUYm1Yzod+ZQEAlS/8mMBwKebVmCVp1f0JLS6zKd17+iwRKTARVg2SHtz3iEbBH+Q+U28zW2Jiza8Tjb1YFoYZMsJyjDqp3M9XBQdSdPLFdxEpvOB37JrHcmR/y9+LgoTlCFGZEa2sc6d4PGlweEa2JSVPoVm+IfGG3ZL037iV9oH+P+Jxc4HGVflNq1M0pivao/EopO4b/ojVCP9GjmiXOeS0DOn1o/iiccT4ORnyvBGF3yUywkQajW4Ti0SGuiy/wVSg/L8w+X/8Q+hvUx8Xd90z4oV5a1i88MbFWHz0WZZ1UrTwBGPX3Rat9AFiXRMRjoMdIdJLEOt2h7jrYOzgOamKZSWSNspOS0X8SAqRYmxRL7sg4eLzYmNehcxh3uoyud/BH2Udux4ywxFTc1xC7Mgf4vMhc5S+kSH3Y7yj+qpwIWSoPTVCOOPVthGx9FbGqrwFw6wSFxJr+17zeKcztt3u+2roAEVgUjDd+AHGuxHy2rZHaa8JMkTHEeyi85ANPO9j9BVuBRD2FY5LDMo/Sz/2hReqGIs/KiFin+CsPsYO/yvM3jL2vE8EbX7/Bf8ejtr2GLN65bioAdgLd8Bis/mD5GmP2qeqyo2ZwQEOtAjRIDH7mBKpUcMoApbZJ5UIxkEwxyMZyMxW/uKFvHCFR3SSmerHyDNQ2dF4JG6zIMpBgLfjSF9x1D6smFcYnGApjmSLICO3ecCDWrQ48geba9DI3STy2i7ax6WIB62fSyIZIiO3GFQqSURp8wCo7GhJBGwuSovJBNjb7kT6FPVnIa9qJ2Ko+l9mefGIdinaMp0yC1URYiwsdfNE45EuA5Cx9EhalfvN5s+UyItm81vaB3p4joniN+SCP7Qc1hblAAAAAElFTkSuQmCC'; +const base64FlowerWhite = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAElBMVEX///9HcEz///////////////84chYNAAAABnRSTlP/AGzCOYZj5g1nAAACfklEQVRYw+2YTVPDIBCGtza9Jw25a0bvcax30o73OOr//yvma2F3YWlpPTijXNpAHrK8LLALVPFium2vNIFSbwGKTGQA2GUiHcD29yDNy3sMIdUBQl7r2H8mOEVqAHgPkYZUS6Qc2zYhQqtjyDZEximCZwWZLIBeIgYShs2NzxKpSUehYpMJhURGb+O+w5BpMCAREKPnCDHbIY20SzhM5yxziAXpOiBXydrekT9i5XDEq4NIIHHgyU5mRGqviII4mREJJA4QJzMiILwlRJzpKxJKvCBm8OsBBbLux0tsPl4RKYm5aPu6jw1U4mGxEUR9g8M1PcqBEp/WJliNgYOXueBzS4jZSIcgY5lCtevgDSgyzE+rAfuOTQMq0yzvoGH18qju27Mayzs4fPyMziCx81NJa5RNfW7vPYK9KOfDiVkBxFHG8hAj9txuoBuSWORsFfkpBf7xKFLSeaOefEojh5jz22DJEqMP8fUyaKdQx+RnG+yXMpe8Aars8ueR1pVH/bW3FyyvPRw90upLDHwpgBDtg4aUBNkxRLXMAi03IhcZtr1m+FeI/O/JNyDmmL1djLOauSlNflBpW18RQ2bPqXI22MXXEk75KRHTnkPkYbESbdKP2ZFk0r5sIwffAjy1lx+vx7NLjB6/E7Jfv5ERKhzpN0w8IDE8IGFDv5dhz10s7GFiXRZcUeLCEG5P5nDq9k4PFDcoMpE3GY4OuxuCXhmuyNB6k0RsLIAvqp9NE5r8ZCSS8gxnUp7ODdYhZTqxuiJ9uyJJtPmpqJ7wVj+XVieS903iViHziqAhchLEJAyb7jWU647EpUofQ0ziUuXXXhDddtlllSwjgSQu7r4BRWhQqfDPMVwAAAAASUVORK5CYII=' +const base64Empty = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIBAMAAABfdrOtAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAbUExURdvc3EdwTMLBwcjIyLSzs/Hx8ff39////19dXXz7IJEAAAAFdFJOU/4A6J9QDyyutAAAB5VJREFUeNrtnM1z4jYYxhUHkR4hdu9eU7Z75Ct7jgPbs9ZZmSuTrUWPmXTA186e+LMrf0uWLMtf2WkHXQgzln88et5XeiVMwPQdGrhCrpAr5Aq5Qv4TkJ07OGQFMLp1B4VYCz+kDblDQhJGeH4eEDLBYdLOHwaDWNBPIeHLYJAJ3meQ83IoCMTHDBKOBoKYGOeM8G0gyD0LObnDQB5ZSCtTNCBfsM9AboaBPLCQcDAIM1zht/dQEkMsd1DjI4hpw2YzMtBJeBbydWpCTJs3YDKGX62YgfGoVwi9KwtZJAzcYHHRm7sYCKD390nQSIoO5JGZIEOYxNoZ4+deISYLyeL5hLHbJ2QK98W0kudMgJe9Qh73odhO+KZHyNYGvgQS9gmJKhUigwSj3iBPUhXxePWmxBqHw0Mej9WQ3qILVjLC177yxNxXQ/7uK+Mn1aNVLsGsBTaWrSAPobYl0aUHt2fIs2Rgz7c9QYL0pSTkSzILLFtAJMH1cidN998T9E0/Sg73/pEEwrgkYRh86wlC949gJsR6EobBcz8hHOVgKYi2m6kZtodIkjEQvF3QjbGpmplB4/lRgJhxgRS2N15iijAvPmByDtCxfQhPJ8J4CR82rgCCBILarScw6X0OcMUyYrFVmbxErl0ZacFIoloOLdJAO42qY+NMDss2kKS8xmiZxcCpFKXWvpRGbQqJp5ixyRfJMmR6x0Fk+z29kmgWDYI5ziFbdug/84HxvduhWhLOJ2StPDQrMJPSjNANklh8QhB7dBO0yTGRwn1fkOk8rbQjiB8Ymww+JuiuN0icmSccK4naLMWYa/euL0+m23GyM8kgAc6sYeL4z04Qa4WjGepcKIliO8EUGSk7d9OGWOsoK31OSdy8TQZ59Y/hWbaV1IVs5/Ed6UzGK4nANAJiyGhRsZPUg2yzLe9hLyiJIyCaDU7udC2uy9pnkKvidlBUEltzFAqxRhBrBZm7HfZnjEQI3boqTsJq15PUDEaKZLgiJYc8OZtCtnM/4G93OFYooXpvdy0guwWWNQkEHl/j7Jw1XRmtlS9HYJkSPjk1IUnyyRqUKQn45NSDlP1mcg9i6En1ZU2IADnEtHF1Q+JwIcS/d5YakPuDUamEShGUHHikAz9oQCaE0CsrpYjDBVkEHQYdyK+EkKPhVErxqh1xbJ/oQf4gEeVsOIEc41WJNAwcd9GBfCZJezXsJhAvH+ImEEIOzlwXgpw5wQ0gH3MIOcsiQAahZuSD69/UQyxcQEggiQARQseVFO/ASAMCgM9gjkHZmhLENzi1AOhA7ullkMWUrfHKfpMiDBHtDIx6yCS6jseEnDUe7zcT6DGCtnrIY3olZw1hrPHkfucIAJa1EDu/lsVEyVmGGA67coKijeogFnMxlEaAV5ghRdDm1kDuuatZTJBGgJdOthIzsvZbDWRRuh6ScgR4EQLgagQvRQIxxQ4sxqcR4GE+c4CkjZQQW9YF89Y4OFAjOCki5KmiDxsBL3PlSJWlAFVogaoIePlYi2ClCJAHRa/cmre5eqTii4uvisqQJxqnip6pNd68DhEvyEs5xIyHBNdh4thCKhU++10kD7Gy1Up1A/o56FKuRJQWSFCuf8dpbisxhqHSKlSSgvG7VTaFKO5TzYD5VMPUxEB2YJNiqq3xYJ0KrroH8mq7xpoXqEZgfgNRUQsDtTVvUOk3sLUKbqrBr7YGvkCkQNC/9SA+vTYtvERrxiKEmcogk4ZqCLUd59MIEiFYHlIoxelCaJWDMmtOPIa80XVLbkb6hzaEwwTcPEmV4AIRlBGNIEmuJBFwLAZoHClJ36J8h+wxihpCqJosAnJrSKwEcQOFAFeWN4RQMYc0Ao4Jhg5gpASzyWcDvjpuDIlTkrGGJEro1rHIjHKR3wJCAj+z5oyi11gJBkXy9QFJIiAu78d+pgSjuWhGN0gUAZAcEncSJf4LRrZ8I94WEmcNCJJqBWYjVbE9bg2JxiyrViBWty6QvO56D8jPVWLA4ZX8dfkxvJJPl8t8aCX+pU/Iz1SCf7lc4OBK0OWfQaKLP0TKjj96VvIp+/BDZjwNKF2ItV2vN7sWStAl87oWkm3dZ+k3lEMoYXe8cT1eq2TOePJDD8KfQdxu6iEPxanUZa4HmZRq3dunGsj3BzFq6yD3wnZNX4n2emI2hXyXQpi6RRZdfSgxHNuxVZBFdyVeBPDmCsiksxKUiDAUEKuzkvRUEs0V08pjVyU2/yqFmF2VZGYop3peitdUiQd1pnrL7qTE01tPzE6eaEKm23dQwh2jNlbiay+/245zl94abw45CzNPyqYQ2++kxHGV1crWzg4A2yvR+BY7wziwnRLN7+O36aA54+ZKGjxZYK3txJpxQyUNn5GwtquII4+ACiWtnvawduu1A3SVtH5uhTvAVSpBG7fDYz6RQ+M6JWjmKm6g+RvTla9UMtspu+s+37VbVCupNqPx43CsNawSb1PbtcmDfQWmUILW7rRXSPHtSq5k5ur0a/hb7DQCUiW3G71ejX/wvV1kSoyNbp8Wvyqn1lCIKvl6gNDkNBYzt0GHdr+Pt9xGl1//ncAVcoVcIVfIFXKFXCFXyP8I8i8SyTW4yTz2lwAAAABJRU5ErkJggg==' +const base64Error = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIBAMAAABfdrOtAAAAJFBMVEVHcEzo6Oibm5ukpKSbm5uampqbm5ubm5u5ubnn5+fm5ub6+vpGpDPdAAAAC3RSTlMA/v4hb+u20dq8aQhnHL4AAATwSURBVHja7ZvNb+JGGMbdjjdVe3NPodzeMhj1ZMUGujkh28B9wKR7iwwBqafWSbPqsbm0uTWtVlrTS9v0Et9yqLQS/1zHNiTZMMB4bO92d+dRUITt8c/PvPPx2h4URUpKSkpKSkpK6m3K6lFN73Q+S/+es3W3fzabTh2Dl0FAXEM+BgrgeXxRsdILTDU9n7J0vz/+EsCYC9KEiSFc06pf5zouqAkjkGWo0OG5Fq6j2IwZ6I4/4DhyTxc20oUjAj5PRTTrwvGAZ9p+ADzlD4RDctCoLhb7JUP87xeLxS3BZUIQ+YNCFi8wRwc4GIqGRK/GkM+5ILV8kFflOmkkkH/LddJ4c05eSSfSyTvrZPEmnCw+UCeuk84QvTSnUF0uCL68fBle/swF+RL1QZ/EpU6gHtOsAM64pnjPwxgTLsjoBM58ODNaAXYBT5QeGdr0KwcEA8He0TkPBLCjUDNHpG4qlg8eTCzXht1FVd1MxTPHj5LTtUiSrKK+7iDf8wBGxk4If3arLv/HF4Tox0A2nlFIGp+CIA+LzSamgbp4TNvZjECtDAjyMcB5HybLO6NxsRA1vmFCNjguNXDGWygbRPXh/B+zn9zPWK5RCkT18QxA57YgAqE+HGS6/tAoD4JO0ts+M2tbyQJpc95a5oI0xXNhCZGQ/x8E0VSCkUZY6Z6CIE/qdO5eL+yPlW6tMMgefPs3o7Bdt8iguJj4DThlZSY/rJ0yB+RraLDK2jAQCHyr4zIhT9mQ7vowygMZjpgQG+CYUV2E1EWqixyzICr8eFFnBB5ba1Y4IIfeKQvysW7ssZrwQLEFmvCBM2U6oRkdI5Wgm1QnO8RUTDlASoiESIiESMh7BDHKhlhu/LbSNUuEqL3lu1p945vO3BArADiaum7vBGDUKQfSIjBykooyrRPQnTIglHFfSagHeqd4iErwa9duEebpckGQjx/VT4v5fC0XhJHAd1mPRvJAVMZiAeQzTpgHYrPKqkGnUEiX+dCoNS4UgniHMTnUS4iESIiE7IS0x+mnVAidglDwVcmQJpy2WQ8VC4UgogfbA1RE4Nuw3UghEBV2rKl7V5ygAJPSY9KGQbP01mVjA5Fa2f1kQN2U3k+M9POWB8gnJUNMZJioWTMzKwOklyxgDrCXVcMMEF90tXM9C2TiCqmfCdIRi/jeewNpyerKok9WkGuzfCdYC+fXRsmBxxpVGG2zY0ZBbieJKvPrDQce3lxppBhIjGFWGkVoxUEoZt0Mukn2XBQH0bTHZpaMIp2sU/6qasU70W6/eHjM09VmYSc6C6Jpvz+orKvVxot8kL3HkMr9IZ9qeZ2o6RrO9mOI9ufdIR9peZ2gNIW31yC/MpyI9ngUDNIsezPks3vIsWDGdYA7cZa9pbqUVeCr/neiaR3U3R4BfXPg75vwb8I/b7HjxChobDZCO+Ny4wuxxaVxPPowcoNnrzPmzGFlX3RJHz2FafbhJ41n8PLx2DCM7KkwQgpqka1DVzKdJNHfJwBe9l/n0eSZFsIPjVSY8xZKZpSXnogwled98wAx3xRcdBNq1f1fhFVdIcL5tvaDolC7XaqaWStEtLOJHkbhlSauMLrma4yHEa03AVUoIUs/M2NQFkchBZiGUPeKonAnqhLOo4hrKf0WTyZ1FcU0Ki0hVrSr+Mucnvya7jYUKSkpKSkpKSmpD0f/AXq+Umj5XnXDAAAAAElFTkSuQmCC'; +const base64BackToTop = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIBAMAAABfdrOtAAAAElBMVEVRUVH+/v5HcEyZmZlRUVFRUVGm1ByOAAAABnRSTlPMzADMTZAJBBGsAAAEnElEQVR42t2cS27jMAyGf7/2U+QCQeDsbeQCgZDujaC5/1UmkzaJn+JDFGcw3LdfflKibJkkDnxrL7dbg7sNt6+L4O8OYBM+B0ys+QrGkHZG+OEEQ8g6go8Bx1GIGMdpNOQyIG6XdMgnSPtKhLQDGEZFBgYMkhKFtGBb0EIEjDgFRowoBVaMGAWpMedEfxMiZtwpUsgZCqtlkCNUdpVAWigtCCCDFtLwIWeoreZCWiRYYEKGFEjDg+yRZCUH0iLRAgNyToXUNCRZyMqWhGnUN2IPm3wSlwJ7IUspyCBkIQUZhCykIIeQuRTkEDKXAuM9srrtYbrZN7Y98giZSoFd+t1OxmMITG0dcrSFXFchZ1tIvQZpYWxhBbK3hpQrkMEa0iwh5t4a+QvZvDXyF7J5a+Qv5PPW21/I5623v5DPW29/IaO3Xv5Clrw1y1/Ikrdm+Qs5svw83yNnSJ5BQb4F/F7EIEJSnThGBAXxkFQfLOviQUE8JAUPsosHBfGQfDAtHhREQ1JxIV00KIgmrnRI84S0yAd5BAXxxJUck0f6Qnwr9qmr6xF5xLMjcwn/iudIEAdWnyjkEXlQKZiRVzoqRyLbgeUKKR8Q4alY7cSnoxzSf2ggsqehKr6YVpcXpOd7H93f60cKhOd7Re2LteUF4eLqiVS1mr0ge4io6C2+soaFkJ7MuuuQs1yITEp9hwwKISIpzR2iESKSIoT0rLNwuVHQqoSIpAQJpGce60vIUSdEIuUqgPTsJ5QFZK8UIpBS8iG94GFrDjlrhfCl8CG96Llxmle4kEr6vKWBPIVo9kqDQSRk9/3cWoikcCFPAd33v4dIChPyEvLzBA6RlEYWke4JEUnhKXkLeUEKxRHJFfKCQHGucIW8IdZSRkLeEGMpYyEjiK2UsZARxFTKRMgYYillImQMMZQyFTKB2EmZCplAuFLIHT8TMoWwpQwiIVMIUwqpZP5bp5CCvCTiQKr5f5lCQN+tPCBn2ZvVDFJwIDUP0m1BYAfZYRNSsCB7BqTbhoARePIxtZ9tgwWkoJcwCalmv3MBAemtO4R6dah2HaKQqj8Zvp9sQDjvJ21+SPCBHPJDDk6QITekEV7gqCC19CpKAym9IMfckKv4olMBCeIrWwVEfvkshzQekO9r9P1/ALk+IG1eSPCDiCJfyG+FyU+A6ZCa/piZDinpz7LpkCv5gdkAEshP5emQhv7onw6pGeULyZCSUYiRDAmMkpJkCKs4JhFSq8p8hJBSVbAkhARV6ZUQoisik0FqXTmcDHLVFfbJIEFXoiiCNMpiSxGkVJaNiiBBWQArgTTaUl4JpNQWJUsgQVteXQg+AKkLxQWFGKW+5J2+eVp4S168X3CF1CltCKdTJ8lb84YK2bUBO+wZW0Pqv9nk4tKu49N45NJC5dMM5tLW5tOg59Jq6NM06dL+abFXwr/RkuvTXJwae1abtE/Dt0/ruksTvs84AZ/BCC4jHnyGVfiM3VBQFANEXEah+Ax18RlP4zNox2dkkM/wI58xTn8yDCXGYCDV3W5RGSajtXyGhG1jbpbjzpwGt/0MJft8jqC7iUbQ/QZaxdnKqcIftwAAAABJRU5ErkJggg=='; + +module.exports = { + base64Arrow, + base64ArrowWhite, + base64Flower, + base64FlowerWhite, + base64Empty, + base64Error, + base64BackToTop +} diff --git a/uni_modules/z-paging/components/z-paging/js/z-paging-utils.js b/uni_modules/z-paging/components/z-paging/js/z-paging-utils.js new file mode 100644 index 0000000..f5b603e --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/js/z-paging-utils.js @@ -0,0 +1,179 @@ +// z-paging +// github地址:https://github.com/SmileZXLee/uni-z-paging +// dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 +// 反馈QQ群:790460711 +// z-paging工具类 + +import zI18n from './z-paging-i18n' + +const storageKey = 'Z-PAGING-REFRESHER-TIME-STORAGE-KEY' + +//判断两个数组是否相等 +function arrayIsEqual(arr1, arr2) { + if (arr1 === arr2) { + return true; + } + if (arr1.length !== arr2.length) { + return false; + } + for (let i = 0; i < arr1.length; i++) { + if (arr1[i] !== arr2[i]) { + return false; + } + } + return true; +} + +//获取最终的touch位置 +function getCommonTouch(e) { + let touch = null; + if (e.touches && e.touches.length) { + touch = e.touches[0]; + } else if (e.changedTouches && e.changedTouches.length) { + touch = e.changedTouches[0]; + } else if (e.datail && e.datail !== {}) { + touch = e.datail; + } else { + return { + touchX: 0, + touchY: 0 + } + } + return { + touchX: touch.clientX, + touchY: touch.clientY + }; +} + +//判断当前手势是否在z-paging内触发 +function getTouchFromZPaging(target) { + if (target && target.tagName && target.tagName !== 'BODY' && target.tagName !== 'UNI-PAGE-BODY') { + var classList = target.classList; + if (classList && classList.contains('zp-paging-touch-view')) { + return true; + } else { + return getTouchFromZPaging(target.parentNode); + } + } else { + return false; + } +} + +//获取z-paging所在的parent +function getParent(parent) { + if (!parent) { + return null; + } + if (parent.$refs.paging) { + return parent; + } + return getParent(parent.$parent); +} + +//打印错误信息 +function consoleErr(err) { + console.error(`[z-paging]${err}`); +} + +//打印警告信息 +function consoleWarn(warn) { + console.warn(`[z-paging]${warn}`); +} + +//设置下拉刷新时间 +function setRefesrherTime(time, key) { + try { + let datas = getRefesrherTime(); + if (!datas) { + datas = {}; + } + datas[key] = time; + uni.setStorageSync(storageKey, datas); + } catch {} +} + +//获取下拉刷新时间 +function getRefesrherTime() { + try { + const datas = uni.getStorageSync(storageKey); + return datas; + } catch { + return null; + } +} + +//通过下拉刷新标识key获取下拉刷新时间 +function getRefesrherTimeByKey(key) { + const datas = getRefesrherTime(); + if (datas) { + const data = datas[key]; + if (data) { + return data; + } + } + return null; +} + +//通过下拉刷新标识key获取下拉刷新时间(格式化之后) +function getRefesrherFormatTimeByKey(key) { + const time = getRefesrherTimeByKey(key); + let timeText = zI18n['refresherUpdateTimeNoneText'][zI18n.getLanguage()]; + if (time) { + timeText = _timeFormat(time); + } + return `${zI18n['refresherUpdateTimeText'][zI18n.getLanguage()]}${timeText}`; +} + +function _timeFormat(time) { + const date = new Date(time); + const currentDate = new Date(); + const dateDay = new Date(time).setHours(0, 0, 0, 0); + const currentDateDay = new Date().setHours(0, 0, 0, 0); + const disTime = dateDay - currentDateDay; + let dayStr = ''; + const timeStr = _dateTimeFormat(date); + if (disTime === 0) { + dayStr = zI18n['refresherUpdateTimeTodayText'][zI18n.getLanguage()]; + } else if (disTime === -86400000) { + dayStr = zI18n['refresherUpdateTimeYesterdayText'][zI18n.getLanguage()]; + } else { + dayStr = _dateDayFormat(date, date.getFullYear() !== currentDate.getFullYear()); + } + return `${dayStr} ${timeStr}`; +} + +function _dateDayFormat(date, showYear = true) { + const year = date.getFullYear(); + const month = date.getMonth() + 1; + const day = date.getDate(); + if (showYear) { + return `${year}-${_fullZeroToTwo(month)}-${_fullZeroToTwo(day)}`; + } else { + return `${_fullZeroToTwo(month)}-${_fullZeroToTwo(day)}`; + } +} + +function _dateTimeFormat(date) { + const hour = date.getHours(); + const minute = date.getMinutes(); + return `${_fullZeroToTwo(hour)}:${_fullZeroToTwo(minute)}`; +} + +function _fullZeroToTwo(str) { + str = str.toString(); + if (str.length === 1) { + return '0' + str; + } + return str; +} + +module.exports = { + setRefesrherTime, + getRefesrherFormatTimeByKey, + arrayIsEqual, + getCommonTouch, + getTouchFromZPaging, + getParent, + consoleErr, + consoleWarn +}; diff --git a/uni_modules/z-paging/components/z-paging/wxs/z-paging-refresh.wxs b/uni_modules/z-paging/components/z-paging/wxs/z-paging-refresh.wxs new file mode 100644 index 0000000..97602af --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/wxs/z-paging-refresh.wxs @@ -0,0 +1,205 @@ +// z-paging +// github地址:https://github.com/SmileZXLee/uni-z-paging +// dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 +// 反馈QQ群:790460711 + +//微信小程序、QQ小程序、app-vue、h5上使用wxs实现自定义下拉刷新,降低逻辑层与视图层的通信折损,提升性能 + +function propObserver(newValue, oldValue, ownerInstance, instance) { + var state = ownerInstance.getState(); + state.currentInstance = instance; + var dataset = instance.getDataset(); + var loading = dataset.loading == true; + if (newValue.indexOf('end') != -1) { + _setTransform('translateY(0px)', instance) + state.moveDistance = 0; + } else if (newValue.indexOf('begin') != -1) { + var refresherThreshold = instance.getDataset().refresherthreshold + _setTransformValue(refresherThreshold, instance, state); + } +} + +function touchstart(e, ownerInstance) { + var instance = ownerInstance.getState().currentInstance; + var state = instance.getState(); + if (_getRefresherTouchDisabled(e, instance)) { + return; + } + var touch = _getCommonTouch(e); + state.startY = touch.touchY; + state.lastRefresherTouchmove = touch; + ownerInstance.callMethod('_handleRefresherTouchstart', touch); +} + +function touchmove(e, ownerInstance) { + var touch = _getCommonTouch(e); + var instance = ownerInstance.getState().currentInstance; + var dataset = instance.getDataset(); + var refresherThreshold = dataset.refresherthreshold; + var isTouchmoving = _getIsTrue(instance.getDataset().istouchmoving); + var state = instance.getState(); + if (_getRefresherTouchDisabled(e, instance)) { + return; + } + if (!_getAngleIsInRange(e, touch, state, dataset)) { + return; + } + var moveDistance = _getMoveDistance(e, instance); + if (moveDistance < 0) { + return; + } + if (e.preventDefault) { + e.preventDefault(); + } + _setTransformValue(moveDistance, instance, state); + var oldRefresherStatus = state.refresherStatus; + if (moveDistance >= refresherThreshold) { + state.refresherStatus = 1; + } else { + state.refresherStatus = 0; + } + if (oldRefresherStatus == undefined || oldRefresherStatus != state.refresherStatus || !isTouchmoving) { + ownerInstance.callMethod('_handleRefresherTouchmove', moveDistance, touch); + } + return false; +} + +function touchend(e, ownerInstance) { + var touch = _getCommonTouch(e); + var instance = ownerInstance.getState().currentInstance; + var dataset = instance.getDataset(); + var state = instance.getState(); + if (_getRefresherTouchDisabled(e, instance)) { + return; + } + state.refresherReachMaxAngle = true; + + var isTouchmoving = _getIsTrue(instance.getDataset().istouchmoving); + if (!isTouchmoving) { + return; + } + var oldMoveDistance = state.moveDistance; + var refresherThreshold = instance.getDataset().refresherthreshold + var moveDistance = _getMoveDistance(e, instance); + ownerInstance.callMethod('_handleRefresherTouchend', moveDistance); + if (oldMoveDistance < refresherThreshold) { + return; + } + if (moveDistance >= refresherThreshold) { + moveDistance = refresherThreshold; + } + _setTransformValue(moveDistance, instance, state) +} + + +function _setTransformValue(value, instance, state) { + value = value || 0; + state.moveDistance = value; + _setTransform('translateY(' + value + 'px)', instance); +} + +function _setTransform(transform, instance) { + instance.requestAnimationFrame(function() { + instance.setStyle({ + transform: transform, + '-webkit-transform': transform + }) + }) + +} + +function _getMoveDistance(e, instance) { + var state = instance.getState() + var refresherThreshold = instance.getDataset().refresherthreshold + var touch = _getCommonTouch(e); + var moveDistance = touch.touchY - state.startY; + moveDistance = _getFinalRefresherMoveDistance(moveDistance, refresherThreshold); + return moveDistance; +} + +function _getCommonTouch(e) { + var touch = null; + if (e.touches && e.touches.length) { + touch = e.touches[0]; + } else if (e.changedTouches && e.changedTouches.length) { + touch = e.changedTouches[0]; + } else if (e.datail && e.datail !== {}) { + touch = e.datail; + } else { + return { + touchX: 0, + touchY: 0 + } + } + return { + touchX: touch.clientX, + touchY: touch.clientY + }; +} + +function _getFinalRefresherMoveDistance(moveDistance, refresherThreshold) { + refresherThreshold = parseFloat(refresherThreshold); + moveDistance = moveDistance * 0.7; + if (moveDistance >= refresherThreshold) { + moveDistance = refresherThreshold + (moveDistance - refresherThreshold) * 0.3; + } + return moveDistance; +} + + +function _getRefresherTouchDisabled(e, instance) { + var dataset = instance.getDataset(); + var loading = _getIsTrue(dataset.loading); + var useChatRecordMode = _getIsTrue(dataset.usechatrecordmode); + var refresherEnabled = _getIsTrue(dataset.refresherenabled); + var useCustomRefresher = _getIsTrue(dataset.usecustomrefresher); + var usePageScroll = _getIsTrue(dataset.usepagescroll); + var pageScrollTop = parseFloat(dataset.pagescrolltop); + var wxsIsScrollTopInTopRange = _getIsTrue(dataset.wxsisscrolltopintoprange); + var scrollTop = parseFloat(dataset.scrolltop); + var res = loading || useChatRecordMode || !refresherEnabled || !useCustomRefresher || ( + usePageScroll && useCustomRefresher && pageScrollTop > 10) || (!( + usePageScroll && useCustomRefresher) && !wxsIsScrollTopInTopRange); + return res; +} + +function _getAngleIsInRange(e, touch, state, dataset) { + var refresherMaxAngle = dataset.refreshermaxangle; + var refresherAecc = _getIsTrue(dataset.refresheraecc); + var lastRefresherTouchmove = state.lastRefresherTouchmove; + var moveDistance = state.moveDistance; + var refresherReachMaxAngle = state.refresherReachMaxAngle; + if (!lastRefresherTouchmove) { + return true; + } + if (refresherMaxAngle >= 0 && refresherMaxAngle <= 90 && lastRefresherTouchmove) { + if (!refresherAecc && refresherReachMaxAngle != null && !refresherReachMaxAngle) { + return false; + } + var x = Math.abs(touch.touchX - lastRefresherTouchmove.touchX); + var y = Math.abs(touch.touchY - lastRefresherTouchmove.touchY); + var z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); + if (x && y) { + var angle = Math.asin(y / z) / Math.PI * 180; + if (angle < refresherMaxAngle) { + state.lastRefresherTouchmove = touch; + state.refresherReachMaxAngle = false; + return false; + } + } + } + state.lastRefresherTouchmove = touch; + return true; +} + +function _getIsTrue(value) { + value = (typeof(value) === 'string' ? JSON.parse(value) : value) || false; + return value == true || value == 'true'; +} + +module.exports = { + touchstart: touchstart, + touchmove: touchmove, + touchend: touchend, + propObserver: propObserver +} diff --git a/uni_modules/z-paging/components/z-paging/wxs/z-paging-renderjs.js b/uni_modules/z-paging/components/z-paging/wxs/z-paging-renderjs.js new file mode 100644 index 0000000..9a65752 --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/wxs/z-paging-renderjs.js @@ -0,0 +1,58 @@ +// z-paging +// github地址:https://github.com/SmileZXLee/uni-z-paging +// dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 +// 反馈QQ群:790460711 +// 使用renderjs在app-vue和h5中对touchmove事件冒泡进行处理 + +import zUtils from '../js/z-paging-utils' +var data = { + renderScrollTop: 0, + renderUsePageScroll: false, + renderIsIos: uni.getSystemInfoSync().platform === 'ios', + startY: 0, + isTouchFromZPaging: false +} + +export default { + mounted() { + this._handleTouch(); + }, + methods: { + //接收逻辑层发送的数据 + renderPropScrollTopChange(newVal, oldVal, ownerVm, vm) { + data.renderScrollTop = newVal; + }, + renderPropUsePageScrollChange(newVal, oldVal, ownerVm, vm) { + if(newVal !== -1){ + data.renderUsePageScroll = newVal; + } + }, + //拦截处理touch事件 + _handleTouch() { + if (window && !window.$zPagingRenderJsInited) { + window.$zPagingRenderJsInited = true; + window.addEventListener('touchstart', this._handleTouchstart, { + passive: true + }) + window.addEventListener('touchmove', this._handleTouchmove, { + passive: false + }) + } + }, + _handleTouchstart(e) { + const touch = zUtils.getCommonTouch(e); + data.startY = touch.touchY; + data.isTouchFromZPaging = zUtils.getTouchFromZPaging(e.target); + }, + _handleTouchmove(e) { + const touch = zUtils.getCommonTouch(e); + var moveY = touch.touchY - data.startY; + if ((data.isTouchFromZPaging && data.renderScrollTop < 1 && moveY > 0) || (data.isTouchFromZPaging && data.renderIsIos && !data.renderUsePageScroll && moveY < 0)) { + if (e.cancelable && !e.defaultPrevented) { + e.preventDefault(); + } + } + }, + + } +}; diff --git a/uni_modules/z-paging/components/z-paging/wxs/z-paging-wxs.wxs b/uni_modules/z-paging/components/z-paging/wxs/z-paging-wxs.wxs new file mode 100644 index 0000000..362946a --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/wxs/z-paging-wxs.wxs @@ -0,0 +1,346 @@ +// z-paging +// github地址:https://github.com/SmileZXLee/uni-z-paging +// dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 +// 反馈QQ群:790460711 +// 微信小程序、QQ小程序、app-vue、h5上使用wxs实现自定义下拉刷新,降低逻辑层与视图层的通信折损,提升性能 + +var currentMoveDistance = 0; + +function propObserver(newValue, oldValue, ownerInstance, instance) { + var state = ownerInstance.getState(); + state.currentInstance = instance; + var dataset = instance.getDataset(); + var loading = dataset.loading == true; + if (newValue.indexOf('end') != -1) { + _setTransform('translateY(0px)', instance) + state.moveDistance = 0; + state.oldMoveDistance = 0; + currentMoveDistance = 0; + } else if (newValue.indexOf('begin') != -1) { + var refresherThreshold = instance.getDataset().refresherthreshold + _setTransformValue(refresherThreshold, instance, state); + } +} + +function touchstart(e, ownerInstance) { + var instance = ownerInstance.getState().currentInstance; + var state = instance.getState(); + var dataset = instance.getDataset(); + var isTouchEnded = state.isTouchEnded; + if (_getRefresherTouchDisabled(e, instance, 0)) { + return; + } + state.oldMoveDistance = 0; + var touch = _getCommonTouch(e); + var loading = _getIsTrue(dataset.loading); + state.startY = touch.touchY; + state.lastRefresherTouchmove = touch; + if (!loading && isTouchEnded) { + state.isTouchmoving = false; + } + state.isTouchEnded = false; + ownerInstance.callMethod('_handleRefresherTouchstart', touch); +} + +function touchmove(e, ownerInstance) { + var touch = _getCommonTouch(e); + var instance = ownerInstance.getState().currentInstance; + var dataset = instance.getDataset(); + var refresherThreshold = dataset.refresherthreshold; + var state = instance.getState(); + if (_getRefresherTouchDisabled(e, instance, 1)) { + _handleTouchMovePullingDown(state, ownerInstance, false); + return true; + } + if (!_getAngleIsInRange(e, touch, state, dataset)) { + _handleTouchMovePullingDown(state, ownerInstance, false); + return true; + } + var moveDistanceObj = _getMoveDistance(e, instance); + var moveDistance = moveDistanceObj.currentMoveDistance; + var prevent = moveDistanceObj.isDown; + if (moveDistance < 0) { + _setTransformValue(0, instance, state); + _handleTouchMovePullingDown(state, ownerInstance, false); + return true; + } + if (prevent && !state.disabledBounce) { + ownerInstance.callMethod('_handleScrollViewDisableBounce', { + bounce: false + }); + state.disabledBounce = true; + _handleTouchMovePullingDown(state, ownerInstance, prevent); + return !prevent; + } + _setTransformValue(moveDistance, instance, state); + var oldRefresherStatus = state.refresherStatus; + var dataset = instance.getDataset(); + var oldIsTouchmoving = _getIsTrue(dataset.oldistouchmoving); + var isTouchmoving = state.isTouchmoving; + if (moveDistance >= refresherThreshold) { + state.refresherStatus = 1; + } else { + state.refresherStatus = 0; + } + if (!isTouchmoving) { + state.isTouchmoving = true; + isTouchmoving = true; + } + if (state.isTouchEnded) { + state.isTouchEnded = false; + } + if (oldRefresherStatus == undefined || oldRefresherStatus != state.refresherStatus || oldIsTouchmoving != + isTouchmoving) { + ownerInstance.callMethod('_handleRefresherTouchmove', moveDistance, touch); + } + _handleTouchMovePullingDown(state, ownerInstance, prevent); + return !prevent; +} + +function touchend(e, ownerInstance) { + var touch = _getCommonTouch(e); + var instance = ownerInstance.getState().currentInstance; + var dataset = instance.getDataset(); + var state = instance.getState(); + if (_getRefresherTouchDisabled(e, instance, 2)) { + return; + } + state.refresherReachMaxAngle = true; + state.hitReachMaxAngleCount = 0; + state.disabledBounce = false; + state.fixedIsTopHitCount = 0; + //ownerInstance.callMethod('_handleScrollViewDisableBounce', {bounce:true}); + var isTouchmoving = state.isTouchmoving; + if (!isTouchmoving) { + return; + } + var oldRefresherStatus = state.refresherStatus; + var oldMoveDistance = state.moveDistance; + var refresherThreshold = instance.getDataset().refresherthreshold + var moveDistance = _getMoveDistance(e, instance).currentMoveDistance; + if (!(moveDistance >= refresherThreshold && oldRefresherStatus === 1)) { + state.isTouchmoving = false; + } + ownerInstance.callMethod('_handleRefresherTouchend', moveDistance); + state.isTouchEnded = true; + if (oldMoveDistance < refresherThreshold) { + return; + } + var animate = false; + if (moveDistance >= refresherThreshold) { + moveDistance = refresherThreshold; + var isIos13 = _getIsTrue(dataset.isios13); + if (isIos13) { + animate = true; + } + } + _setTransformValue(moveDistance, instance, state, animate); +} + +// #ifdef H5 +function isPC() { + var userAgentInfo = navigator.userAgent; + var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; + var flag = true; + for (var v = 0; v < Agents.length - 1; v++) { + if (userAgentInfo.indexOf(Agents[v]) > 0) { + flag = false; + break; + } + } + return flag; +} + +var movable = false; + +function mousedown(e, ins) { + if (!isPC()) return; + touchstart(e, ins); + movable = true; +} + +function mousemove(e, ins) { + if (!isPC()) return; + if (!movable) return; + touchmove(e, ins); +} + +function mouseup(e, ins) { + if (!isPC()) return; + touchend(e, ins); + movable = false; +} + +function mouseleave(e, ins) { + if (!isPC()) return; + movable = false; +} +// #endif + + +function _setTransformValue(value, instance, state, animate = false) { + value = value || 0; + if (state.moveDistance == value) { + return; + } + state.moveDistance = value; + _setTransform('translateY(' + value + 'px)', instance, animate); +} + +function _setTransform(transform, instance, animate = false) { + if (transform == 'translateY(0px)') { + transform = 'none'; + } + instance.requestAnimationFrame(function() { + if (animate) { + instance.setStyle({ + 'transform': transform, + 'transition': 'transform .1s linear', + }) + } else { + instance.setStyle({ + 'transform': transform + }) + } + }) +} + +function _getMoveDistance(e, instance) { + var state = instance.getState(); + var refresherThreshold = instance.getDataset().refresherthreshold; + var refresherOutRate = instance.getDataset().refresheroutrate; + refresherThreshold = parseFloat(refresherThreshold); + refresherOutRate = parseFloat(refresherOutRate); + var touch = _getCommonTouch(e); + var moveDistance = touch.touchY - state.startY; + var oldMoveDistance = state.oldMoveDistance || 0; + state.oldMoveDistance = moveDistance; + var diffDis = moveDistance - oldMoveDistance; + if (diffDis > 0) { + diffDis = diffDis * 0.85; + if (currentMoveDistance > refresherThreshold) { + diffDis = diffDis * (1 - refresherOutRate); + } + } + currentMoveDistance += diffDis; + if (currentMoveDistance < 0) { + currentMoveDistance = 0; + } + return { + currentMoveDistance: currentMoveDistance, + isDown: diffDis > 0 + }; +} + +function _getCommonTouch(e) { + var touch = null; + if (e.touches && e.touches.length) { + touch = e.touches[0]; + } else if (e.changedTouches && e.changedTouches.length) { + touch = e.changedTouches[0]; + } else if (e.datail && e.datail !== {}) { + touch = e.datail; + } else { + touch = e; + } + return { + touchX: touch.clientX, + touchY: touch.clientY + }; +} + +function _getRefresherTouchDisabled(e, instance, processTag) { + var dataset = instance.getDataset(); + var state = instance.getState(); + var loading = _getIsTrue(dataset.loading); + var useChatRecordMode = _getIsTrue(dataset.usechatrecordmode); + var refresherEnabled = _getIsTrue(dataset.refresherenabled); + var useCustomRefresher = _getIsTrue(dataset.usecustomrefresher); + var usePageScroll = _getIsTrue(dataset.usepagescroll); + var pageScrollTop = parseFloat(dataset.pagescrolltop); + var scrollTop = parseFloat(dataset.scrolltop); + var finalScrollTop = usePageScroll ? pageScrollTop : scrollTop; + var fixedIsTop = false; + var isIos = _getIsTrue(dataset.isios); + if (!isIos && finalScrollTop == (state.startScrollTop || 0) && finalScrollTop <= 105) { + fixedIsTop = true; + } + var fixedIsTopHitCount = state.fixedIsTopHitCount || 0; + if (fixedIsTop) { + fixedIsTopHitCount++; + if (fixedIsTopHitCount <= 3) { + fixedIsTop = false; + } + state.fixedIsTopHitCount = fixedIsTopHitCount; + } else { + state.fixedIsTopHitCount = 0; + } + if (!isIos && processTag === 0) { + state.startScrollTop = finalScrollTop || 0; + } + if (!isIos && processTag === 2) { + fixedIsTop = true; + } + var res = loading || useChatRecordMode || !refresherEnabled || !useCustomRefresher || (( + usePageScroll && useCustomRefresher && pageScrollTop > 5) && !fixedIsTop) || (( + !usePageScroll && useCustomRefresher && scrollTop > 5) && !fixedIsTop); + return res; +} + +function _getAngleIsInRange(e, touch, state, dataset) { + var refresherMaxAngle = dataset.refreshermaxangle; + var refresherAecc = _getIsTrue(dataset.refresheraecc); + var lastRefresherTouchmove = state.lastRefresherTouchmove; + var refresherReachMaxAngle = state.refresherReachMaxAngle; + var moveDistance = state.oldMoveDistance; + if (!lastRefresherTouchmove) { + return true; + } + if (refresherMaxAngle >= 0 && refresherMaxAngle <= 90 && lastRefresherTouchmove) { + if ((!moveDistance || moveDistance < 1) && !refresherAecc && refresherReachMaxAngle != null && ! + refresherReachMaxAngle) { + return false; + } + var x = Math.abs(touch.touchX - lastRefresherTouchmove.touchX); + var y = Math.abs(touch.touchY - lastRefresherTouchmove.touchY); + var z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); + if ((x || y) && x > 1) { + var angle = Math.asin(y / z) / Math.PI * 180; + if (angle < refresherMaxAngle) { + var hitReachMaxAngleCount = state.hitReachMaxAngleCount || 0; + state.hitReachMaxAngleCount = ++hitReachMaxAngleCount; + if (state.hitReachMaxAngleCount > 2) { + state.lastRefresherTouchmove = touch; + state.refresherReachMaxAngle = false; + } + return false; + } + } + } + state.lastRefresherTouchmove = touch; + return true; +} + +function _handleTouchMovePullingDown(state, instance, onPullingDown) { + var oldOnPullingDown = state.onPullingDown || false; + if (oldOnPullingDown != onPullingDown) { + instance.callMethod('_handleWxsOnPullingDown', onPullingDown); + } + state.onPullingDown = onPullingDown; +} + +function _getIsTrue(value) { + value = (typeof(value) === 'string' ? JSON.parse(value) : value) || false; + return value == true || value == 'true'; +} + +module.exports = { + touchstart: touchstart, + touchmove: touchmove, + touchend: touchend, + mousedown: mousedown, + mousemove: mousemove, + mouseup: mouseup, + mouseleave: mouseleave, + propObserver: propObserver +} diff --git a/uni_modules/z-paging/components/z-paging/z-paging-load-more.vue b/uni_modules/z-paging/components/z-paging/z-paging-load-more.vue new file mode 100644 index 0000000..d7fbc82 --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/z-paging-load-more.vue @@ -0,0 +1,156 @@ + + + + + + + + + + diff --git a/uni_modules/z-paging/components/z-paging/z-paging-mixin.js b/uni_modules/z-paging/components/z-paging/z-paging-mixin.js new file mode 100644 index 0000000..6511283 --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/z-paging-mixin.js @@ -0,0 +1,35 @@ + +// z-paging +// github地址:https://github.com/SmileZXLee/uni-z-paging +// dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 +// 反馈QQ群:790460711 + +// 使用页面滚动时引入此mixin,用于监听和处理onPullDownRefresh等页面生命周期方法 + +const ZPagingMixin = { + onPullDownRefresh(){ + if(this.isPagingRefNotFound()){ + return; + } + this.$refs.paging.reload(); + }, + onPageScroll(e) { + if(this.isPagingRefNotFound()){ + return; + } + this.$refs.paging.updatePageScrollTop(e.scrollTop); + }, + onReachBottom() { + if(this.isPagingRefNotFound()){ + return; + } + this.$refs.paging.doLoadMore(); + }, + methods: { + isPagingRefNotFound(){ + return !this.$refs.paging || this.$refs.paging === undefined; + } + } +} + +export default ZPagingMixin; diff --git a/uni_modules/z-paging/components/z-paging/z-paging-refresh.vue b/uni_modules/z-paging/components/z-paging/z-paging-refresh.vue new file mode 100644 index 0000000..1a11716 --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/z-paging-refresh.vue @@ -0,0 +1,173 @@ + + + + + + + + + + diff --git a/uni_modules/z-paging/components/z-paging/z-paging-refresh.wxs b/uni_modules/z-paging/components/z-paging/z-paging-refresh.wxs new file mode 100644 index 0000000..97602af --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/z-paging-refresh.wxs @@ -0,0 +1,205 @@ +// z-paging +// github地址:https://github.com/SmileZXLee/uni-z-paging +// dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 +// 反馈QQ群:790460711 + +//微信小程序、QQ小程序、app-vue、h5上使用wxs实现自定义下拉刷新,降低逻辑层与视图层的通信折损,提升性能 + +function propObserver(newValue, oldValue, ownerInstance, instance) { + var state = ownerInstance.getState(); + state.currentInstance = instance; + var dataset = instance.getDataset(); + var loading = dataset.loading == true; + if (newValue.indexOf('end') != -1) { + _setTransform('translateY(0px)', instance) + state.moveDistance = 0; + } else if (newValue.indexOf('begin') != -1) { + var refresherThreshold = instance.getDataset().refresherthreshold + _setTransformValue(refresherThreshold, instance, state); + } +} + +function touchstart(e, ownerInstance) { + var instance = ownerInstance.getState().currentInstance; + var state = instance.getState(); + if (_getRefresherTouchDisabled(e, instance)) { + return; + } + var touch = _getCommonTouch(e); + state.startY = touch.touchY; + state.lastRefresherTouchmove = touch; + ownerInstance.callMethod('_handleRefresherTouchstart', touch); +} + +function touchmove(e, ownerInstance) { + var touch = _getCommonTouch(e); + var instance = ownerInstance.getState().currentInstance; + var dataset = instance.getDataset(); + var refresherThreshold = dataset.refresherthreshold; + var isTouchmoving = _getIsTrue(instance.getDataset().istouchmoving); + var state = instance.getState(); + if (_getRefresherTouchDisabled(e, instance)) { + return; + } + if (!_getAngleIsInRange(e, touch, state, dataset)) { + return; + } + var moveDistance = _getMoveDistance(e, instance); + if (moveDistance < 0) { + return; + } + if (e.preventDefault) { + e.preventDefault(); + } + _setTransformValue(moveDistance, instance, state); + var oldRefresherStatus = state.refresherStatus; + if (moveDistance >= refresherThreshold) { + state.refresherStatus = 1; + } else { + state.refresherStatus = 0; + } + if (oldRefresherStatus == undefined || oldRefresherStatus != state.refresherStatus || !isTouchmoving) { + ownerInstance.callMethod('_handleRefresherTouchmove', moveDistance, touch); + } + return false; +} + +function touchend(e, ownerInstance) { + var touch = _getCommonTouch(e); + var instance = ownerInstance.getState().currentInstance; + var dataset = instance.getDataset(); + var state = instance.getState(); + if (_getRefresherTouchDisabled(e, instance)) { + return; + } + state.refresherReachMaxAngle = true; + + var isTouchmoving = _getIsTrue(instance.getDataset().istouchmoving); + if (!isTouchmoving) { + return; + } + var oldMoveDistance = state.moveDistance; + var refresherThreshold = instance.getDataset().refresherthreshold + var moveDistance = _getMoveDistance(e, instance); + ownerInstance.callMethod('_handleRefresherTouchend', moveDistance); + if (oldMoveDistance < refresherThreshold) { + return; + } + if (moveDistance >= refresherThreshold) { + moveDistance = refresherThreshold; + } + _setTransformValue(moveDistance, instance, state) +} + + +function _setTransformValue(value, instance, state) { + value = value || 0; + state.moveDistance = value; + _setTransform('translateY(' + value + 'px)', instance); +} + +function _setTransform(transform, instance) { + instance.requestAnimationFrame(function() { + instance.setStyle({ + transform: transform, + '-webkit-transform': transform + }) + }) + +} + +function _getMoveDistance(e, instance) { + var state = instance.getState() + var refresherThreshold = instance.getDataset().refresherthreshold + var touch = _getCommonTouch(e); + var moveDistance = touch.touchY - state.startY; + moveDistance = _getFinalRefresherMoveDistance(moveDistance, refresherThreshold); + return moveDistance; +} + +function _getCommonTouch(e) { + var touch = null; + if (e.touches && e.touches.length) { + touch = e.touches[0]; + } else if (e.changedTouches && e.changedTouches.length) { + touch = e.changedTouches[0]; + } else if (e.datail && e.datail !== {}) { + touch = e.datail; + } else { + return { + touchX: 0, + touchY: 0 + } + } + return { + touchX: touch.clientX, + touchY: touch.clientY + }; +} + +function _getFinalRefresherMoveDistance(moveDistance, refresherThreshold) { + refresherThreshold = parseFloat(refresherThreshold); + moveDistance = moveDistance * 0.7; + if (moveDistance >= refresherThreshold) { + moveDistance = refresherThreshold + (moveDistance - refresherThreshold) * 0.3; + } + return moveDistance; +} + + +function _getRefresherTouchDisabled(e, instance) { + var dataset = instance.getDataset(); + var loading = _getIsTrue(dataset.loading); + var useChatRecordMode = _getIsTrue(dataset.usechatrecordmode); + var refresherEnabled = _getIsTrue(dataset.refresherenabled); + var useCustomRefresher = _getIsTrue(dataset.usecustomrefresher); + var usePageScroll = _getIsTrue(dataset.usepagescroll); + var pageScrollTop = parseFloat(dataset.pagescrolltop); + var wxsIsScrollTopInTopRange = _getIsTrue(dataset.wxsisscrolltopintoprange); + var scrollTop = parseFloat(dataset.scrolltop); + var res = loading || useChatRecordMode || !refresherEnabled || !useCustomRefresher || ( + usePageScroll && useCustomRefresher && pageScrollTop > 10) || (!( + usePageScroll && useCustomRefresher) && !wxsIsScrollTopInTopRange); + return res; +} + +function _getAngleIsInRange(e, touch, state, dataset) { + var refresherMaxAngle = dataset.refreshermaxangle; + var refresherAecc = _getIsTrue(dataset.refresheraecc); + var lastRefresherTouchmove = state.lastRefresherTouchmove; + var moveDistance = state.moveDistance; + var refresherReachMaxAngle = state.refresherReachMaxAngle; + if (!lastRefresherTouchmove) { + return true; + } + if (refresherMaxAngle >= 0 && refresherMaxAngle <= 90 && lastRefresherTouchmove) { + if (!refresherAecc && refresherReachMaxAngle != null && !refresherReachMaxAngle) { + return false; + } + var x = Math.abs(touch.touchX - lastRefresherTouchmove.touchX); + var y = Math.abs(touch.touchY - lastRefresherTouchmove.touchY); + var z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); + if (x && y) { + var angle = Math.asin(y / z) / Math.PI * 180; + if (angle < refresherMaxAngle) { + state.lastRefresherTouchmove = touch; + state.refresherReachMaxAngle = false; + return false; + } + } + } + state.lastRefresherTouchmove = touch; + return true; +} + +function _getIsTrue(value) { + value = (typeof(value) === 'string' ? JSON.parse(value) : value) || false; + return value == true || value == 'true'; +} + +module.exports = { + touchstart: touchstart, + touchmove: touchmove, + touchend: touchend, + propObserver: propObserver +} diff --git a/uni_modules/z-paging/components/z-paging/z-paging-static.css b/uni_modules/z-paging/components/z-paging/z-paging-static.css new file mode 100644 index 0000000..e62e6ee --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/z-paging-static.css @@ -0,0 +1,28 @@ +/* z-paging +github地址:https://github.com/SmileZXLee/uni-z-paging +dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 +反馈QQ群:790460711 + +公用的静态css资源 */ + +.zp-loading-more-line-loading-image { + margin-right: 8rpx; + width: 28rpx; + height: 28rpx; + /* #ifndef APP-NVUE */ + animation: loading-flower 1s steps(12) infinite; + /* #endif */ + color: #666666; +} + +@keyframes loading-flower { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} diff --git a/uni_modules/z-paging/components/z-paging/z-paging-static.js b/uni_modules/z-paging/components/z-paging/z-paging-static.js new file mode 100644 index 0000000..c8365cf --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/z-paging-static.js @@ -0,0 +1,18 @@ +// z-paging +// github地址:https://github.com/SmileZXLee/uni-z-paging +// dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 +// 反馈QQ群:790460711 + +// 公用的静态图片资源 +const base64Arrow = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAD1BMVEVHcExRUVFMTExRUVFRUVE9CdWsAAAABHRSTlMAjjrY9ZnUjwAAAQFJREFUWMPt2MsNgzAMgGEEE1B1gKJmAIRYoCH7z9RCXrabh33iYktcIv35EEg5ZBh07pvxJU6MFSPOSRnjnBUjUsaciRUjMsb4xIoRCWNiYsUInzE5sWKEyxiYWDbyefqHx1zIeiYTk7mQYziTYecxHvEJjwmIT3hMQELCYSISEg4TkZj0mYTEpM8kJCU9JiMp6TEZyUmbAUhO2gxAQNJiIAKSFgMRmNQZhMCkziAEJTUGIyipMRjBSZkhCE7KDEFIUmTeGCHJxWz0zXaE0GTCG8ZFtEaS347r/1fe11YyHYVfubxayfjoHmc0YYwmmmiiiSaaaKLJ7ckyz5ve+dw3Xw2emdwm9xSbAAAAAElFTkSuQmCC'; +const base64Flower = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAKlBMVEVHcEzDw8Ovr6+pqamUlJTCwsKenp61tbWxsbGysrLNzc2bm5u5ubmjo6MpovhuAAAACnRSTlMA/P79/sHDhiZS0DxZowAABBBJREFUWMPtl89rE0EUx7ctTXatB3MI1SWnDbUKPUgXqh4ED8Uf7KUVSm3ooVSpSii0Fn/gD4j4o+APiEoVmos9FO2celiqZVgwgaKHPQiCCkv+F99kM7Ozm5kxq1dfD91k9pPve9/3ZjbRNHHok/mKli4eIPNgSuRObuN9SqSEzM20iGnm0yIbqCuV7NSSSIV7uyPM6JMBYdeTOanh/QihJYZsUCSby+VkMj2AvOt0rAeQAwqE3lfKMZVlQCZk1QOCKkkVPadITCfIRNKxfoJI5+0OIFtJx14CMSg1mRSDko7VAfksRQzEbGYqxOJcVTWMCH2I1/IACNW0PWU2M8cmAVHtnH5mM1VRWtwKZjOd5JbF6s1IbaYqaotjNlPHgDAnlAizubTR6ovMYn052g/U5qcmOpi0WL8xTS/3IfSet5m8MEr5ajjF5le6dq/OJpobrdY0t3i9QgefWrxW9/1BLhk0E9m8FeUMhhXal499iD0eQRfDF+ts/tttORRerfp+oV7f4xJj82iUYm1Yzod+ZQEAlS/8mMBwKebVmCVp1f0JLS6zKd17+iwRKTARVg2SHtz3iEbBH+Q+U28zW2Jiza8Tjb1YFoYZMsJyjDqp3M9XBQdSdPLFdxEpvOB37JrHcmR/y9+LgoTlCFGZEa2sc6d4PGlweEa2JSVPoVm+IfGG3ZL037iV9oH+P+Jxc4HGVflNq1M0pivao/EopO4b/ojVCP9GjmiXOeS0DOn1o/iiccT4ORnyvBGF3yUywkQajW4Ti0SGuiy/wVSg/L8w+X/8Q+hvUx8Xd90z4oV5a1i88MbFWHz0WZZ1UrTwBGPX3Rat9AFiXRMRjoMdIdJLEOt2h7jrYOzgOamKZSWSNspOS0X8SAqRYmxRL7sg4eLzYmNehcxh3uoyud/BH2Udux4ywxFTc1xC7Mgf4vMhc5S+kSH3Y7yj+qpwIWSoPTVCOOPVthGx9FbGqrwFw6wSFxJr+17zeKcztt3u+2roAEVgUjDd+AHGuxHy2rZHaa8JMkTHEeyi85ANPO9j9BVuBRD2FY5LDMo/Sz/2hReqGIs/KiFin+CsPsYO/yvM3jL2vE8EbX7/Bf8ejtr2GLN65bioAdgLd8Bis/mD5GmP2qeqyo2ZwQEOtAjRIDH7mBKpUcMoApbZJ5UIxkEwxyMZyMxW/uKFvHCFR3SSmerHyDNQ2dF4JG6zIMpBgLfjSF9x1D6smFcYnGApjmSLICO3ecCDWrQ48geba9DI3STy2i7ax6WIB62fSyIZIiO3GFQqSURp8wCo7GhJBGwuSovJBNjb7kT6FPVnIa9qJ2Ko+l9mefGIdinaMp0yC1URYiwsdfNE45EuA5Cx9EhalfvN5s+UyItm81vaB3p4joniN+SCP7Qc1hblAAAAAElFTkSuQmCC'; +const base64Empty = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIBAMAAABfdrOtAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAbUExURdvc3EdwTMLBwcjIyLSzs/Hx8ff39////19dXXz7IJEAAAAFdFJOU/4A6J9QDyyutAAAB5VJREFUeNrtnM1z4jYYxhUHkR4hdu9eU7Z75Ct7jgPbs9ZZmSuTrUWPmXTA186e+LMrf0uWLMtf2WkHXQgzln88et5XeiVMwPQdGrhCrpAr5Aq5Qv4TkJ07OGQFMLp1B4VYCz+kDblDQhJGeH4eEDLBYdLOHwaDWNBPIeHLYJAJ3meQ83IoCMTHDBKOBoKYGOeM8G0gyD0LObnDQB5ZSCtTNCBfsM9AboaBPLCQcDAIM1zht/dQEkMsd1DjI4hpw2YzMtBJeBbydWpCTJs3YDKGX62YgfGoVwi9KwtZJAzcYHHRm7sYCKD390nQSIoO5JGZIEOYxNoZ4+deISYLyeL5hLHbJ2QK98W0kudMgJe9Qh73odhO+KZHyNYGvgQS9gmJKhUigwSj3iBPUhXxePWmxBqHw0Mej9WQ3qILVjLC177yxNxXQ/7uK+Mn1aNVLsGsBTaWrSAPobYl0aUHt2fIs2Rgz7c9QYL0pSTkSzILLFtAJMH1cidN998T9E0/Sg73/pEEwrgkYRh86wlC949gJsR6EobBcz8hHOVgKYi2m6kZtodIkjEQvF3QjbGpmplB4/lRgJhxgRS2N15iijAvPmByDtCxfQhPJ8J4CR82rgCCBILarScw6X0OcMUyYrFVmbxErl0ZacFIoloOLdJAO42qY+NMDss2kKS8xmiZxcCpFKXWvpRGbQqJp5ixyRfJMmR6x0Fk+z29kmgWDYI5ziFbdug/84HxvduhWhLOJ2StPDQrMJPSjNANklh8QhB7dBO0yTGRwn1fkOk8rbQjiB8Ymww+JuiuN0icmSccK4naLMWYa/euL0+m23GyM8kgAc6sYeL4z04Qa4WjGepcKIliO8EUGSk7d9OGWOsoK31OSdy8TQZ59Y/hWbaV1IVs5/Ed6UzGK4nANAJiyGhRsZPUg2yzLe9hLyiJIyCaDU7udC2uy9pnkKvidlBUEltzFAqxRhBrBZm7HfZnjEQI3boqTsJq15PUDEaKZLgiJYc8OZtCtnM/4G93OFYooXpvdy0guwWWNQkEHl/j7Jw1XRmtlS9HYJkSPjk1IUnyyRqUKQn45NSDlP1mcg9i6En1ZU2IADnEtHF1Q+JwIcS/d5YakPuDUamEShGUHHikAz9oQCaE0CsrpYjDBVkEHQYdyK+EkKPhVErxqh1xbJ/oQf4gEeVsOIEc41WJNAwcd9GBfCZJezXsJhAvH+ImEEIOzlwXgpw5wQ0gH3MIOcsiQAahZuSD69/UQyxcQEggiQARQseVFO/ASAMCgM9gjkHZmhLENzi1AOhA7ullkMWUrfHKfpMiDBHtDIx6yCS6jseEnDUe7zcT6DGCtnrIY3olZw1hrPHkfucIAJa1EDu/lsVEyVmGGA67coKijeogFnMxlEaAV5ghRdDm1kDuuatZTJBGgJdOthIzsvZbDWRRuh6ScgR4EQLgagQvRQIxxQ4sxqcR4GE+c4CkjZQQW9YF89Y4OFAjOCki5KmiDxsBL3PlSJWlAFVogaoIePlYi2ClCJAHRa/cmre5eqTii4uvisqQJxqnip6pNd68DhEvyEs5xIyHBNdh4thCKhU++10kD7Gy1Up1A/o56FKuRJQWSFCuf8dpbisxhqHSKlSSgvG7VTaFKO5TzYD5VMPUxEB2YJNiqq3xYJ0KrroH8mq7xpoXqEZgfgNRUQsDtTVvUOk3sLUKbqrBr7YGvkCkQNC/9SA+vTYtvERrxiKEmcogk4ZqCLUd59MIEiFYHlIoxelCaJWDMmtOPIa80XVLbkb6hzaEwwTcPEmV4AIRlBGNIEmuJBFwLAZoHClJ36J8h+wxihpCqJosAnJrSKwEcQOFAFeWN4RQMYc0Ao4Jhg5gpASzyWcDvjpuDIlTkrGGJEro1rHIjHKR3wJCAj+z5oyi11gJBkXy9QFJIiAu78d+pgSjuWhGN0gUAZAcEncSJf4LRrZ8I94WEmcNCJJqBWYjVbE9bg2JxiyrViBWty6QvO56D8jPVWLA4ZX8dfkxvJJPl8t8aCX+pU/Iz1SCf7lc4OBK0OWfQaKLP0TKjj96VvIp+/BDZjwNKF2ItV2vN7sWStAl87oWkm3dZ+k3lEMoYXe8cT1eq2TOePJDD8KfQdxu6iEPxanUZa4HmZRq3dunGsj3BzFq6yD3wnZNX4n2emI2hXyXQpi6RRZdfSgxHNuxVZBFdyVeBPDmCsiksxKUiDAUEKuzkvRUEs0V08pjVyU2/yqFmF2VZGYop3peitdUiQd1pnrL7qTE01tPzE6eaEKm23dQwh2jNlbiay+/245zl94abw45CzNPyqYQ2++kxHGV1crWzg4A2yvR+BY7wziwnRLN7+O36aA54+ZKGjxZYK3txJpxQyUNn5GwtquII4+ACiWtnvawduu1A3SVtH5uhTvAVSpBG7fDYz6RQ+M6JWjmKm6g+RvTla9UMtspu+s+37VbVCupNqPx43CsNawSb1PbtcmDfQWmUILW7rRXSPHtSq5k5ur0a/hb7DQCUiW3G71ejX/wvV1kSoyNbp8Wvyqn1lCIKvl6gNDkNBYzt0GHdr+Pt9xGl1//ncAVcoVcIVfIFXKFXCFXyP8I8i8SyTW4yTz2lwAAAABJRU5ErkJggg==' +const base64BackToTop = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIBAMAAABfdrOtAAAAElBMVEVRUVH+/v5HcEyZmZlRUVFRUVGm1ByOAAAABnRSTlPMzADMTZAJBBGsAAAEnElEQVR42t2cS27jMAyGf7/2U+QCQeDsbeQCgZDujaC5/1UmkzaJn+JDFGcw3LdfflKibJkkDnxrL7dbg7sNt6+L4O8OYBM+B0ys+QrGkHZG+OEEQ8g6go8Bx1GIGMdpNOQyIG6XdMgnSPtKhLQDGEZFBgYMkhKFtGBb0EIEjDgFRowoBVaMGAWpMedEfxMiZtwpUsgZCqtlkCNUdpVAWigtCCCDFtLwIWeoreZCWiRYYEKGFEjDg+yRZCUH0iLRAgNyToXUNCRZyMqWhGnUN2IPm3wSlwJ7IUspyCBkIQUZhCykIIeQuRTkEDKXAuM9srrtYbrZN7Y98giZSoFd+t1OxmMITG0dcrSFXFchZ1tIvQZpYWxhBbK3hpQrkMEa0iwh5t4a+QvZvDXyF7J5a+Qv5PPW21/I5623v5DPW29/IaO3Xv5Clrw1y1/Ikrdm+Qs5svw83yNnSJ5BQb4F/F7EIEJSnThGBAXxkFQfLOviQUE8JAUPsosHBfGQfDAtHhREQ1JxIV00KIgmrnRI84S0yAd5BAXxxJUck0f6Qnwr9qmr6xF5xLMjcwn/iudIEAdWnyjkEXlQKZiRVzoqRyLbgeUKKR8Q4alY7cSnoxzSf2ggsqehKr6YVpcXpOd7H93f60cKhOd7Re2LteUF4eLqiVS1mr0ge4io6C2+soaFkJ7MuuuQs1yITEp9hwwKISIpzR2iESKSIoT0rLNwuVHQqoSIpAQJpGce60vIUSdEIuUqgPTsJ5QFZK8UIpBS8iG94GFrDjlrhfCl8CG96Llxmle4kEr6vKWBPIVo9kqDQSRk9/3cWoikcCFPAd33v4dIChPyEvLzBA6RlEYWke4JEUnhKXkLeUEKxRHJFfKCQHGucIW8IdZSRkLeEGMpYyEjiK2UsZARxFTKRMgYYillImQMMZQyFTKB2EmZCplAuFLIHT8TMoWwpQwiIVMIUwqpZP5bp5CCvCTiQKr5f5lCQN+tPCBn2ZvVDFJwIDUP0m1BYAfZYRNSsCB7BqTbhoARePIxtZ9tgwWkoJcwCalmv3MBAemtO4R6dah2HaKQqj8Zvp9sQDjvJ21+SPCBHPJDDk6QITekEV7gqCC19CpKAym9IMfckKv4olMBCeIrWwVEfvkshzQekO9r9P1/ALk+IG1eSPCDiCJfyG+FyU+A6ZCa/piZDinpz7LpkCv5gdkAEshP5emQhv7onw6pGeULyZCSUYiRDAmMkpJkCKs4JhFSq8p8hJBSVbAkhARV6ZUQoisik0FqXTmcDHLVFfbJIEFXoiiCNMpiSxGkVJaNiiBBWQArgTTaUl4JpNQWJUsgQVteXQg+AKkLxQWFGKW+5J2+eVp4S168X3CF1CltCKdTJ8lb84YK2bUBO+wZW0Pqv9nk4tKu49N45NJC5dMM5tLW5tOg59Jq6NM06dL+abFXwr/RkuvTXJwae1abtE/Dt0/ruksTvs84AZ/BCC4jHnyGVfiM3VBQFANEXEah+Ax18RlP4zNox2dkkM/wI58xTn8yDCXGYCDV3W5RGSajtXyGhG1jbpbjzpwGt/0MJft8jqC7iUbQ/QZaxdnKqcIftwAAAABJRU5ErkJggg=='; +module.exports = { + base64Arrow: base64Arrow, + base64Flower: base64Flower, + base64Empty: base64Empty, + base64BackToTop: base64BackToTop +} diff --git a/uni_modules/z-paging/components/z-paging/z-paging.vue b/uni_modules/z-paging/components/z-paging/z-paging.vue new file mode 100644 index 0000000..a6da545 --- /dev/null +++ b/uni_modules/z-paging/components/z-paging/z-paging.vue @@ -0,0 +1,462 @@ + + + + + + + + + + + + + diff --git a/uni_modules/z-paging/package.json b/uni_modules/z-paging/package.json new file mode 100644 index 0000000..daa9267 --- /dev/null +++ b/uni_modules/z-paging/package.json @@ -0,0 +1,80 @@ +{ + "id": "z-paging", + "displayName": "【z-paging下拉刷新、上拉加载更多】超简单、低耦合!仅需两步轻松完成完整分页逻辑", + "version": "2.0.1", + "description": "【支持nvue,使用wxs+renderjs实现】全平台兼容,支持自定义下拉刷新、上拉加载更多,支持自动管理空数据图、点击返回顶部,支持聊天分页、本地分页,支持展示最后更新时间,支持国际化等等", + "keywords": [ + "下拉刷新", + "上拉加载", + "分页器", + "nvue", + "wxs" +], + "repository": "https://github.com/SmileZXLee/uni-z-paging", + "engines": { + "HBuilderX": "^3.0.7" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "393727164" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/z-paging/readme.md b/uni_modules/z-paging/readme.md new file mode 100644 index 0000000..eb3305f --- /dev/null +++ b/uni_modules/z-paging/readme.md @@ -0,0 +1,237 @@ +# z-paging + + +*** + +## 【注意】由V1.9.0起,fixed属性默认值为true,z-paging默认会铺满屏幕。老项目更新请注意,使用侧滑滚动切换选项卡或需要局部使用z-paging请设置:fixed="false"。如果您希望fixed属性默认为false,请参考文档:z-paging.com,将fixed默认值设置为false。 +*** + +> 【uni-app自动分页器】超简单,低耦合!仅需两步轻松完成完整分页逻辑(下拉刷新、上拉加载更多),分页全自动处理。支持自定义加载更多的文字或整个view,自定义下拉刷新样式,自动管理空数据view,支持吸顶效果,支持国际化等。 + +### API文档地址:[http://z-paging.com](http://z-paging.com) +### 备用API文档地址:[https://www.kancloud.cn/zxlee/z-paging/content](https://www.kancloud.cn/zxlee/z-paging/content) + +### 功能&特点 + +* 【配置简单】仅需两步(绑定网络请求方法、绑定分页结果数组)轻松完成完整下拉刷新,上拉加载更多功能。 +* 【低耦合,低侵入】分页自动管理。在page中无需处理任何分页相关逻辑,无需在data中定义任何分页相关变量,全由z-paging内部处理。 +* 【超灵活,支持各种类型自定义】支持自定义下拉刷新,自定义上拉加载更多,自带自定义下拉刷新效果,及其他数十种自定义属性。 +* 【功能丰富】支持国际化,支持自定义且自动管理空数据图,支持主题模式切换,支持本地分页,支持聊天分页模式,支持展示最后更新时间,支持吸顶效果,支持内部scroll-view滚动与页面滚动,支持一键滚动到顶部等诸多功能。 +* 【多平台兼容,细致,流畅】支持nvue,支持h5、app及各家小程序;在app-vue、h5、微信小程序、QQ小程序上使用wxs实现下拉刷新,大幅提升性能。多处细节优化,给您精致流畅的体验。 + +### 反馈qq群(点击加群):[790460711](https://jq.qq.com/?_wv=1027&k=vU2fKZZH) + + +#### 关于自动引入组件 + +> `z-paging` 支持[easycom组件规范](https://uniapp.dcloud.io/component/README?id=easycom组件规范),无需引用和注册组件即可直接使用,在正在运行的项目中导入`z-paging`可能会提示:`Unknown custom element: - did you register the component corrently?... `,此时需要重新运行项目即可。 + +### 预览 + +*** + +| 自定义下拉刷新效果+分页演示 | 吸顶效果+分页演示 | +| :----------------------------------------------------------: | :----------------------------------------------------------: | +| ![](http://www.zxlee.cn/github/uni-z-paging/uni-z-paging.gif) | ![](http://www.zxlee.cn/github/uni-z-paging/uni-z-paging2.gif) | + +| 滑动切换选项卡+分页演示 | 聊天记录模式+分页演示 | +| :----------------------------------------------------------: | :----------------------------------------------------------: | +| ![](http://www.zxlee.cn/github/uni-z-paging/z-paging-demo3.gif) | ![](http://www.zxlee.cn/github/uni-z-paging/z-paging-demo4.gif) | + +### 在线demo体验地址: + +* [http://www.zxlee.cn/github/uni-z-paging/demo/index.html](http://www.zxlee.cn/github/uni-z-paging/demo/index.html) + +| 扫码体验 | +| ------------------------------------------------------------ | +| ![](http://www.zxlee.cn/github/uni-z-paging/z-paging-demo.png) | + +### 此组件已支持`uni_modules`,下载完整示例时组件在`uni_modules`目录下。 + +## 基本使用 + +* ①在`