|
@@ -0,0 +1,2617 @@
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+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.3';
|
|
|
+const systemInfo = uni.getSystemInfoSync();
|
|
|
+const commonDelayTime = 100;
|
|
|
+const i18nUpdateKey = 'z-paging-i18n-update';
|
|
|
+const errorUpdateKey = 'z-paging-error-emit';
|
|
|
+let config = null;
|
|
|
+
|
|
|
+const weexDom = weex.requireModule('dom');
|
|
|
+const weexAnimation = weex.requireModule('animation');
|
|
|
+
|
|
|
+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();
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ * z-paging 分页组件
|
|
|
+ * @description 【uni-app自动分页器】超简单,低耦合!仅需两步轻松完成完整分页逻辑(下拉刷新、上拉加载更多),分页全自动处理。支持自定义加载更多的文字或整个view,自定义下拉刷新样式,自动管理空数据view等。
|
|
|
+ * @tutorial https:
|
|
|
+ * @property {Number|String} default-page-no 自定义pageNo,默认为1
|
|
|
+ * @property {Number|String} default-page-size 自定义pageSize,默认为10
|
|
|
+ * @property {Number|Object} data-key 为保证数据一致,设置当前tab切换时的标识key,并在complete中传递相同key,若二者不一致,则complete将不会生效
|
|
|
+ * @property {String} language i18n国际化设置语言,支持简体中文(zh-cn)、繁体中文(zh-hant-cn)和英文(en)
|
|
|
+ * @property {Boolean} follow-system-language i18n国际化默认是否跟随系统语言,默认为是
|
|
|
+ * @property {Object} paging-style 设置z-paging的style,部分平台可能无法直接修改组件的style,可使用此属性代替
|
|
|
+ * @property {Object} paging-content-style 设置z-paging的容器(插槽的父view)的style
|
|
|
+ * @property {Boolean} auto-height z-paging是否自动高度,若自动高度则会自动铺满屏幕,默认为否
|
|
|
+ * @property {Number|String} auto-height-addition z-paging是否自动高度时,附加的高度,注意添加单位px或rpx,默认为px,若需要减少高度,请传负数
|
|
|
+ * @property {String} default-theme-style loading(下拉刷新、上拉加载更多)的主题样式,支持black,white,默认black
|
|
|
+ * @property {String} refresher-theme-style 下拉刷新的主题样式,支持black,white,默认black
|
|
|
+ * @property {String} loading-more-theme-style 底部加载更多的主题样式,支持black,white,默认black
|
|
|
+ * @property {Boolean} refresher-only 是否只使用下拉刷新,设置为true后将关闭mounted自动请求数据、关闭滚动到底部加载更多,强制隐藏空数据图。默认为否
|
|
|
+ * @property {Boolean} use-page-scroll 使用页面滚动,默认为否,当设置为是时则使用页面的滚动而非此组件内部的scroll-view的滚动,使用页面滚动时z-paging无需设置确定的高度且对于长列表展示性能更高,但配置会略微繁琐
|
|
|
+ * @property {Boolean} fixed z-paging是否使用fixed布局,若使用fixed布局,则z-paging的父view无需固定高度,z-paging高度默认为100%,默认为否(当使用内置scroll-view滚动时有效)
|
|
|
+ * @property {Boolean} mounted-auto-call-reload z-paging mounted后自动调用reload方法(mounted后自动调用接口),默认为是
|
|
|
+ * @property {Boolean} auto-scroll-to-top-when-reload reload时自动滚动到顶部,默认为是
|
|
|
+ * @property {Boolean} auto-clean-list-when-reload reload时立即自动清空原list,默认为是,若立即自动清空,则在reload之后、请求回调之前页面是空白的
|
|
|
+ * @property {Boolean} show-refresher-when-reload 调用reload方法时是否自动显示下拉刷新view,默认为否
|
|
|
+ * @property {Boolean} refresher-update-time-key 如果需要区别不同页面的最后更新时间,请为不同页面的z-paging的`refresher-update-time-key`设置不同的字符串
|
|
|
+ * @property {Boolean} use-custom-refresher 是否使用自定义的下拉刷新,默认为是,即使用z-paging的下拉刷新。设置为false即代表使用uni scroll-view自带的下拉刷新,h5、App、微信小程序以外的平台不支持uni scroll-view自带的下拉刷新
|
|
|
+ * @property {Number|String} refresher-fps 自定义下拉刷新下拉帧率,默认为40,过高可能会出现抖动问题(use-custom-refresher为true时生效)
|
|
|
+ * @property {Number|String} refresher-max-angle 自定义下拉刷新允许触发的最大下拉角度,默认为40度,当下拉角度小于设定值时,自定义下拉刷新动画不会被触发
|
|
|
+ * @property {Boolean} refresher-angle-enable-change-continued 自定义下拉刷新的角度由未达到最大角度变到达到最大角度时,是否继续下拉刷新手势,默认为否
|
|
|
+ * @property {String|Object} refresher-default-text 自定义下拉刷新默认状态下的文字(use-custom-refresher为true时生效)
|
|
|
+ * @property {String|Object} refresher-pulling-text 自定义下拉刷新松手立即刷新状态下的文字(use-custom-refresher为true时生效)
|
|
|
+ * @property {String|Object} refresher-refreshing-text 自定义下拉刷新刷新中状态下的文字(use-custom-refresher为true时生效)
|
|
|
+ * @property {Boolean} refresher-end-bounce-enabled 是否开启自定义下拉刷新刷新结束回弹效果,默认为是(use-custom-refresher为true时生效)
|
|
|
+ * @property {Object} loading-more-custom-style 自定义底部加载更多样式
|
|
|
+ * @property {Object} loading-more-loading-icon-custom-style 自定义底部加载更多加载中动画样式
|
|
|
+ * @property {String} loading-more-loading-icon-type 自定义底部加载更多加载中动画图标类型,可选circle或flower,默认为circle
|
|
|
+ * @property {String} loading-more-loading-icon-custom-image 自定义底部加载更多加载中动画图标图片
|
|
|
+ * @property {Boolean} loading-more-enabled 是否启用加载更多数据(含滑动到底部加载更多数据和点击加载更多数据),默认为是
|
|
|
+ * @property {Boolean} to-bottom-loading-more-enabled 是否启用滑动到底部加载更多数据
|
|
|
+ * @property {String|Object} loading-more-default-text 滑动到底部"默认"文字,默认为【点击加载更多】
|
|
|
+ * @property {String|Object} loading-more-loading-text 滑动到底部"加载中"文字,默认为【正在加载...】
|
|
|
+ * @property {String|Object} loading-more-no-more-text 滑动到底部"没有更多"文字,默认为【没有更多了】
|
|
|
+ * @property {String|Object} loading-more-fail-text 滑动到底部"加载失败"文字,默认为【加载失败,点击重新加载】
|
|
|
+ * @property {Boolean} hide-loading-more-when-no-more-and-inside-of-paging 当没有更多数据且分页内容未超出z-paging时是否隐藏没有更多数据的view,默认为是
|
|
|
+ * @property {Boolean} show-loading-more-no-more-view 是否显示没有更多数据的view,默认为是
|
|
|
+ * @property {Boolean} show-default-loading-more-text 是否显示默认的加载更多text,默认为是
|
|
|
+ * @property {Boolean} show-loading-more-no-more-line 是否显示没有更多数据的分割线,默认为是
|
|
|
+ * @property {Object} loading-more-no-more-line-custom-style 自定义底部没有更多数据的分割线样式
|
|
|
+ * @property {Boolean} hide-empty-view 是否强制隐藏空数据图,默认为否
|
|
|
+ * @property {String|Object} empty-view-text 空数据图描述文字,默认为“没有数据哦~”
|
|
|
+ * @property {String} empty-view-img 空数据图图片,默认使用z-paging内置的图片
|
|
|
+ * @property {Boolean} auto-hide-empty-view-when-loading 加载中时是否自动隐藏空数据图,默认为是
|
|
|
+ * @property {Boolean} auto-hide-loading-after-first-loaded 第一次加载后自动隐藏loading slot,默认为是
|
|
|
+ * @property {Boolean} auto-show-back-to-top 自动显示点击返回顶部按钮,默认为否
|
|
|
+ * @property {Number|String} back-to-top-threshold 点击返回顶部按钮显示/隐藏的阈值(滚动距离),单位为px,默认为400rpx
|
|
|
+ * @property {String} back-to-top-img 点击返回顶部按钮的自定义图片地址,默认使用z-paging内置的图片
|
|
|
+ * @property {Boolean} back-to-top-with-animate 点击返回顶部按钮返回到顶部时是否展示过渡动画,默认为是
|
|
|
+ * @property {Number|String} back-to-top-bottom 点击返回顶部按钮与底部的距离,注意添加单位px或rpx,默认为160rpx
|
|
|
+ * @property {Object} back-to-top-style 点击返回顶部按钮的自定义样式
|
|
|
+ * @property {Boolean} show-scrollbar 在设置滚动条位置时使用动画过渡,默认为否
|
|
|
+ * @property {Boolean} scroll-to-top-bounce-enabled iOS设备上滚动到顶部时是否允许回弹效果,默认为否。关闭回弹效果后可使滚动到顶部与下拉刷新更连贯,但是有吸顶view时滚动到顶部时可能出现抖动。
|
|
|
+ * @property {Boolean} scroll-with-animation 控制是否出现滚动条,默认为否
|
|
|
+ * @property {String} scroll-into-view 值应为某子元素id(id不能以数字开头)。设置哪个方向可滚动,则在哪个方向滚动到该元素
|
|
|
+ * @property {Number|String} lower-threshold 距底部/右边多远时(单位px),触发 scrolltolower 事件,默认为100rpx
|
|
|
+ * @property {Boolean} enable-back-to-top iOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只支持竖向,默认为是
|
|
|
+ * @property {Boolean} refresher-enabled 是否开启自定义下拉刷新,默认为是
|
|
|
+ * @property {Number|String} refresher-threshold 设置自定义下拉刷新阈值,默认为80rpx
|
|
|
+ * @property {String} refresher-default-style 设置自定义下拉刷新默认样式,支持设置 black,white,none,none 表示不使用默认样式,默认为black
|
|
|
+ * @property {String} refresher-background 设置自定义下拉刷新区域背景颜色
|
|
|
+ * @property {Boolean} show-refresher-update-time 是否显示上次下拉刷新更新时间,默认为否
|
|
|
+ * @property {String} refresher-update-time-key 上次下拉刷新更新时间的key,用于区别不同的上次更新时间
|
|
|
+ * @property {Number|String} local-paging-loading-time 本地分页时上拉加载更多延迟时间,单位为毫秒,默认200毫秒
|
|
|
+ * @property {Boolean} use-chat-record-mode 使用聊天记录模式,默认为否
|
|
|
+ * @property {String} nvue-list-is nvue中修改列表类型,可选值有list、waterfall和scroller,默认为list
|
|
|
+ * @property {Object} nvue-waterfall-config nvue waterfall配置,仅在nvue中且nvueListIs=waterfall时有效,配置参数详情参见:https:
|
|
|
+ * @event {Function} addData 请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为是否成功(默认为是)
|
|
|
+ * @event {Function} setLocalPaging 设置本地分页,请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging作分页处理(若调用了此方法,则上拉加载更多时内部会自动分页,不会触发@query所绑定的事件)
|
|
|
+ * @event {Function} reload 重新加载分页数据,pageNo恢复为默认值,相当于下拉刷新的效果(animate为true时会展示下拉刷新动画,默认为false)
|
|
|
+ * @event {Function} endRefresh 手动停止下拉刷新加载
|
|
|
+ * @event {Function} loadingStatusChange 分页加载状态改变(0-默认状态 1.加载中 2.没有更多数据 3.加载失败)
|
|
|
+ * @event {Function} refresherStatusChange 自定义下拉刷新状态改变(use-custom-refresher为true时生效)(0-默认状态 1.松手立即刷新 2.刷新中)
|
|
|
+ * @event {Function} refresherTouchstart 自定义下拉刷新下拉开始(use-custom-refresher为true时生效)【注:当需要更细致定制自定义下拉刷新时使用,如果只需监听下拉刷新各个状态改变,使用`refresherStatusChange`即可】
|
|
|
+ * @event {Function} refresherTouchmove 自定义下拉刷新下拉中(use-custom-refresher为true时生效)【注:当需要更细致定制自定义下拉刷新时使用,如果只需监听下拉刷新各个状态改变,使用`refresherStatusChange`即可】
|
|
|
+ * @event {Function} refresherTouchend 自定义下拉刷新下拉结束(use-custom-refresher为true时生效)【注:当需要更细致定制自定义下拉刷新时使用,如果只需监听下拉刷新各个状态改变,使用`refresherStatusChange`即可】
|
|
|
+ * @event {Function} onRefresh 自定义下拉刷新被触发
|
|
|
+ * @event {Function} onRestore 自定义下拉刷新被复位
|
|
|
+ * @event {Function} scroll 滚动时触发,event.detail = {scrollLeft, scrollTop, scrollHeight, scrollWidth, deltaX, deltaY}
|
|
|
+ * @example <z-paging ref="paging" v-model="dataList" @query="queryList"></z-paging>
|
|
|
+ */
|
|
|
+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,
|
|
|
+ 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: '0s',
|
|
|
+ finalRefresherDefaultStyle: 'black',
|
|
|
+
|
|
|
+ loadingType: 0,
|
|
|
+
|
|
|
+ loadingStatus: 0,
|
|
|
+
|
|
|
+ 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: 0,
|
|
|
+ renderUsePageScroll: false,
|
|
|
+ wxsIsScrollTopInTopRange: true,
|
|
|
+ wxsScrollTop: 0,
|
|
|
+ wxsPageScrollTop: 0,
|
|
|
+ wxsOnPullingDown: false,
|
|
|
+ disabledBounce: false,
|
|
|
+ cacheScrollNodeHeight: -1,
|
|
|
+ customNoMore: -1
|
|
|
+ };
|
|
|
+ },
|
|
|
+ props: {
|
|
|
+
|
|
|
+ defaultPageNo: {
|
|
|
+ type: [Number, String],
|
|
|
+ default: _getConfig('defaultPageNo', 1),
|
|
|
+ observer: function(newVal, oldVal) {
|
|
|
+ this.pageNo = newVal;
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ defaultPageSize: {
|
|
|
+ type: [Number, String],
|
|
|
+ default: _getConfig('defaultPageSize', 10),
|
|
|
+ },
|
|
|
+
|
|
|
+ dataKey: {
|
|
|
+ type: [Number, Object],
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('dataKey', null);
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ autowireListName: {
|
|
|
+ type: String,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('autowireListName', '');
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ autowireQueryName: {
|
|
|
+ type: String,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('autowireQueryName', '');
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ language: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('language', '')
|
|
|
+ },
|
|
|
+
|
|
|
+ followSystemLanguage: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('followSystemLanguage', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ pagingStyle: {
|
|
|
+ type: Object,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('pagingStyle', {});
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ pagingContentStyle: {
|
|
|
+ type: Object,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('pagingContentStyle', {});
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ autoHeight: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('autoHeight', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ autoHeightAddition: {
|
|
|
+ type: [Number, String],
|
|
|
+ default: _getConfig('autoHeightAddition', '0px')
|
|
|
+ },
|
|
|
+
|
|
|
+ defaultThemeStyle: {
|
|
|
+ type: String,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('defaultThemeStyle', 'black');
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherThemeStyle: {
|
|
|
+ type: String,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('refresherThemeStyle', '');
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ loadingMoreThemeStyle: {
|
|
|
+ type: String,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('loadingMoreThemeStyle', '');
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherOnly: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('refresherOnly', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ usePageScroll: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('usePageScroll', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ fixed: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('fixed', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ safeAreaInsetBottom: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('safeAreaInsetBottom', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ scrollable: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('scrollable', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ mountedAutoCallReload: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('mountedAutoCallReload', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ auto: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('auto', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ autoScrollToTopWhenReload: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('autoScrollToTopWhenReload', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ autoCleanListWhenReload: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('autoCleanListWhenReload', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ showRefresherWhenReload: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('showRefresherWhenReload', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ showLoadingMoreWhenReload: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('showLoadingMoreWhenReload', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ useCustomRefresher: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('useCustomRefresher', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherFps: {
|
|
|
+ type: [Number, String],
|
|
|
+ default: _getConfig('refresherFps', 40)
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherMaxAngle: {
|
|
|
+ type: [Number, String],
|
|
|
+ default: _getConfig('refresherMaxAngle', 40)
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherAngleEnableChangeContinued: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('refresherAngleEnableChangeContinued', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherDefaultText: {
|
|
|
+ type: [String, Object],
|
|
|
+ default: _getConfig('refresherDefaultText', null)
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherPullingText: {
|
|
|
+ type: [String, Object],
|
|
|
+ default: _getConfig('refresherPullingText', null)
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherRefreshingText: {
|
|
|
+ type: [String, Object],
|
|
|
+ default: _getConfig('refresherRefreshingText', null)
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherEndBounceEnabled: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('refresherEndBounceEnabled', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ loadingMoreCustomStyle: {
|
|
|
+ type: Object,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('loadingMoreCustomStyle', {});
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ loadingMoreLoadingIconCustomStyle: {
|
|
|
+ type: Object,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('loadingMoreLoadingIconCustomStyle', {});
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ loadingMoreLoadingIconType: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('loadingMoreLoadingIconType', 'flower')
|
|
|
+ },
|
|
|
+
|
|
|
+ loadingMoreLoadingIconCustomImage: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('loadingMoreLoadingIconCustomImage', '')
|
|
|
+ },
|
|
|
+
|
|
|
+ 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)
|
|
|
+ },
|
|
|
+
|
|
|
+ hideLoadingMoreWhenNoMoreAndInsideOfPaging: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('hideLoadingMoreWhenNoMoreAndInsideOfPaging', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ hideLoadingMoreWhenNoMoreByLimit: {
|
|
|
+ type: Number,
|
|
|
+ default: _getConfig('hideLoadingMoreWhenNoMoreByLimit', 0)
|
|
|
+ },
|
|
|
+
|
|
|
+ showDefaultLoadingMoreText: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('showDefaultLoadingMoreText', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ 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)
|
|
|
+ },
|
|
|
+
|
|
|
+ emptyViewImg: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('emptyViewImg', '')
|
|
|
+ },
|
|
|
+
|
|
|
+ emptyViewErrorText: {
|
|
|
+ type: [String, Object],
|
|
|
+ default: _getConfig('emptyViewErrorText', null)
|
|
|
+ },
|
|
|
+
|
|
|
+ emptyViewErrorImg: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('emptyViewErrorImg', '')
|
|
|
+ },
|
|
|
+
|
|
|
+ emptyViewStyle: {
|
|
|
+ type: Object,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('emptyViewStyle', {});
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ 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)
|
|
|
+ },
|
|
|
+
|
|
|
+ autoHideLoadingAfterFirstLoaded: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('autoHideLoadingAfterFirstLoaded', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ autoShowBackToTop: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('autoShowBackToTop', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ backToTopThreshold: {
|
|
|
+ type: [Number, String],
|
|
|
+ default: _getConfig('backToTopThreshold', '400rpx')
|
|
|
+ },
|
|
|
+
|
|
|
+ backToTopImg: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('backToTopImg', '')
|
|
|
+ },
|
|
|
+
|
|
|
+ backToTopWithAnimate: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('backToTopWithAnimate', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ backToTopBottom: {
|
|
|
+ type: [Number, String],
|
|
|
+ default: _getConfig('backToTopBottom', '160rpx')
|
|
|
+ },
|
|
|
+
|
|
|
+ backToTopStyle: {
|
|
|
+ type: Object,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('backToTopStyle', {});
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ showScrollbar: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('showScrollbar', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ scrollToTopBounceEnabled: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('scrollToTopBounceEnabled', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ scrollToBottomBounceEnabled: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('scrollToBottomBounceEnabled', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ scrollWithAnimation: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('scrollWithAnimation', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ scrollIntoView: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('scrollIntoView', '')
|
|
|
+ },
|
|
|
+
|
|
|
+ lowerThreshold: {
|
|
|
+ type: [Number, String],
|
|
|
+ default: _getConfig('lowerThreshold', '100rpx')
|
|
|
+ },
|
|
|
+
|
|
|
+ enableBackToTop: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('enableBackToTop', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherEnabled: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('refresherEnabled', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherThreshold: {
|
|
|
+ type: [Number, String],
|
|
|
+ default: _getConfig('refresherThreshold', '80rpx')
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherDefaultStyle: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('refresherDefaultStyle', 'black')
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherBackground: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('refresherBackground', '#ffffff00')
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherFixedBackground: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('refresherFixedBackground', '#ffffff00')
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherFixedBacHeight: {
|
|
|
+ type: [Number, String],
|
|
|
+ default: _getConfig('refresherFixedBacHeight', 0)
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherOutRate: {
|
|
|
+ type: Number,
|
|
|
+ default: _getConfig('refresherOutRate', 0.7)
|
|
|
+ },
|
|
|
+
|
|
|
+ showRefresherUpdateTime: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('showRefresherUpdateTime', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherUpdateTimeKey: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('refresherUpdateTimeKey', 'default')
|
|
|
+ },
|
|
|
+
|
|
|
+ localPagingLoadingTime: {
|
|
|
+ type: [Number, String],
|
|
|
+ default: _getConfig('localPagingLoadingTime', 200)
|
|
|
+ },
|
|
|
+
|
|
|
+ useChatRecordMode: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('useChatRecordMode', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ topZIndex: {
|
|
|
+ type: Number,
|
|
|
+ default: _getConfig('topZIndex', 99)
|
|
|
+ },
|
|
|
+
|
|
|
+ superContentZIndex: {
|
|
|
+ type: Number,
|
|
|
+ default: _getConfig('superContentZIndex', 1)
|
|
|
+ },
|
|
|
+
|
|
|
+ contentZIndex: {
|
|
|
+ type: Number,
|
|
|
+ default: _getConfig('contentZIndex', 10)
|
|
|
+ },
|
|
|
+
|
|
|
+ emptyViewZIndex: {
|
|
|
+ type: Number,
|
|
|
+ default: _getConfig('emptyViewZIndex', 9)
|
|
|
+ },
|
|
|
+
|
|
|
+ concat: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('concat', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ nvueListIs: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('nvueListIs', 'list')
|
|
|
+ },
|
|
|
+
|
|
|
+ nvueWaterfallConfig: {
|
|
|
+ type: Object,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('nvueWaterfallConfig', {});
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ nvueBounce: {
|
|
|
+ type: Boolean,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('nvueBounce', true);
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ showConsoleError: {
|
|
|
+ type: Boolean,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('showConsoleError', true);
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ 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();
|
|
|
+ uni.$on(i18nUpdateKey, () => {
|
|
|
+ this.tempLanguageUpdateKey = (new Date()).getTime();
|
|
|
+ })
|
|
|
+ uni.$on(errorUpdateKey, () => {
|
|
|
+ if (this.loading) {
|
|
|
+ this.complete(false);
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ if (!this.isIos && !this.useChatRecordMode) {
|
|
|
+ this.nLoadingMoreFixedHeight = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ },
|
|
|
+ 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.loadingStatus === 2 && this.hideLoadingMoreWhenNoMoreByLimit > 0 &&
|
|
|
+ newVal.length) {
|
|
|
+ this.showLoadingMore = newVal.length > this.hideLoadingMoreWhenNoMoreByLimit;
|
|
|
+ } else if (this.loadingStatus === 2 && this.hideLoadingMoreWhenNoMoreAndInsideOfPaging &&
|
|
|
+ newVal.length) {
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this._checkShowLoadingMoreWhenNoMoreAndInsideOfPaging(newVal);
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ this.showLoadingMore = newVal.length;
|
|
|
+ }
|
|
|
+ if (this.usePageScroll && this.isTotalChangeFromAddData) {
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this._checkScrollViewShouldFullHeight();
|
|
|
+ })
|
|
|
+ }
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ if (this.useChatRecordMode && this.nIsFirstPageAndNoMore && this.pageNo === this
|
|
|
+ .defaultPageNo && !this.nFirstPageAndNoMoreChecked) {
|
|
|
+ this.nFirstPageAndNoMoreChecked = true;
|
|
|
+ this._scrollToBottom(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ })
|
|
|
+ },
|
|
|
+ currentData(newVal, oldVal) {
|
|
|
+ this._currentDataChange(newVal, oldVal);
|
|
|
+ },
|
|
|
+ loadingStatus(newVal, oldVal) {
|
|
|
+ this.$emit('loadingStatusChange', newVal);
|
|
|
+
|
|
|
+ if (this.useChatRecordMode) {
|
|
|
+ if (this.pageNo === this.defaultPageNo && newVal === 2) {
|
|
|
+ this.nIsFirstPageAndNoMore = true;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.nIsFirstPageAndNoMore = false;
|
|
|
+
|
|
|
+ },
|
|
|
+ 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.renderUsePageScroll = 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: {
|
|
|
+ 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,
|
|
|
+ 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;
|
|
|
+ if (this.showRefresherUpdateTime) {
|
|
|
+ if (refresherThreshold === '80rpx') {
|
|
|
+ refresherThreshold = '120rpx';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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;
|
|
|
+
|
|
|
+ safeAreaBottom = this.systemInfo.safeAreaInsets.bottom || 0;
|
|
|
+
|
|
|
+ return 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;
|
|
|
+ },
|
|
|
+ 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: {
|
|
|
+
|
|
|
+ complete(data, success = true) {
|
|
|
+ this.customNoMore = -1;
|
|
|
+ this.addData(data, success);
|
|
|
+ },
|
|
|
+
|
|
|
+ completeByKey(data, dataKey = null, success = true) {
|
|
|
+ if (dataKey !== null && this.dataKey !== null && dataKey !== this.dataKey) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.customNoMore = -1;
|
|
|
+ this.addData(data, success);
|
|
|
+ },
|
|
|
+
|
|
|
+ completeByNoMore(data, nomore, success = true) {
|
|
|
+ if (nomore != 'undefined') {
|
|
|
+ this.customNoMore = nomore == true ? 1 : 0;
|
|
|
+ }
|
|
|
+ this.addData(data, success);
|
|
|
+ },
|
|
|
+
|
|
|
+ addData(data, success = true) {
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this._addData(data, success, false);
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+ setI18n(language) {
|
|
|
+ zI18n.setLanguage(language);
|
|
|
+ },
|
|
|
+
|
|
|
+ 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;
|
|
|
+
|
|
|
+ this.totalData = [...this.totalData, ...data];
|
|
|
+
|
|
|
+
|
|
|
+ if (this.nIsFirstPageAndNoMore) {
|
|
|
+ this.totalData = [...this.totalData, ...data];
|
|
|
+ } else {
|
|
|
+ this.totalData = [...data, ...this.totalData];
|
|
|
+ }
|
|
|
+
|
|
|
+ if (toBottom) {
|
|
|
+ setTimeout(() => {
|
|
|
+
|
|
|
+ this._scrollToBottom(toBottomWithAnimate);
|
|
|
+
|
|
|
+
|
|
|
+ if (this.nIsFirstPageAndNoMore) {
|
|
|
+ this._scrollToBottom(toBottomWithAnimate);
|
|
|
+ } else {
|
|
|
+ this._scrollToTop(toBottomWithAnimate);
|
|
|
+ }
|
|
|
+
|
|
|
+ }, commonDelayTime)
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ 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;
|
|
|
+ },
|
|
|
+
|
|
|
+ setLocalPaging(data, success = true) {
|
|
|
+ this.isLocalPaging = true;
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this._addData(data, success, true);
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+ 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;
|
|
|
+ },
|
|
|
+
|
|
|
+ scrollToTop(animate) {
|
|
|
+ this._scrollToTop(animate, false);
|
|
|
+ },
|
|
|
+
|
|
|
+ scrollToBottom(animate) {
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this._scrollToBottom(animate);
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+ scrollIntoViewById(sel, offset, animate) {
|
|
|
+ this._scrollIntoView(sel, offset, animate);
|
|
|
+ },
|
|
|
+
|
|
|
+ scrollIntoViewByNodeTop(nodeTop, offset, animate) {
|
|
|
+ this.scrollTop = this.oldScrollTop;
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this._scrollIntoViewByNodeTop(nodeTop, offset, animate);
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+ scrollIntoViewByIndex(index, offset, animate) {
|
|
|
+ this._scrollIntoView(index, offset, animate);
|
|
|
+ },
|
|
|
+
|
|
|
+ scrollIntoViewByView(view, offset, animate) {
|
|
|
+ this._scrollIntoView(view, offset, animate);
|
|
|
+ },
|
|
|
+
|
|
|
+ updatePageScrollTop(value) {
|
|
|
+ if (value == undefined) {
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.pageScrollTop = value;
|
|
|
+ },
|
|
|
+
|
|
|
+ updatePageScrollTopHeight() {
|
|
|
+ this._updatePageScrollTopOrBottomHeight('top');
|
|
|
+ },
|
|
|
+
|
|
|
+ updatePageScrollBottomHeight() {
|
|
|
+ this._updatePageScrollTopOrBottomHeight('bottom');
|
|
|
+ },
|
|
|
+
|
|
|
+ updateScrollViewScrollTop(scrollTop, animate = true) {
|
|
|
+ this.privateScrollWithAnimation = animate ? 1 : 0;
|
|
|
+ this.scrollTop = this.oldScrollTop;
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.scrollTop = scrollTop;
|
|
|
+ this.oldScrollTop = this.scrollTop;
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ setListSpecialEffects(args) {
|
|
|
+ this.nFixFreezing = args !== {};
|
|
|
+ if (!this.usePageScroll) {
|
|
|
+ this.$refs['n-list'].setSpecialEffects(args);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ handleRefresherStatusChanged(func) {
|
|
|
+ this.refresherStatusChangedFunc = func;
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ _preReload(animate = this.showRefresherWhenReload, isFromMounted = true) {
|
|
|
+ this.isUserReload = true;
|
|
|
+ if (animate) {
|
|
|
+ this.privateShowRefresherWhenReload = animate;
|
|
|
+
|
|
|
+ if (this.useCustomRefresher) {
|
|
|
+ this._doRefresherRefreshAnimate();
|
|
|
+ } else {
|
|
|
+ this.refresherTriggered = true;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ 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;
|
|
|
+
|
|
|
+ } else {
|
|
|
+ this._refresherEnd(false, false);
|
|
|
+ }
|
|
|
+ this._reload(false, isFromMounted);
|
|
|
+ },
|
|
|
+
|
|
|
+ _reload(isClean = false, isFromMounted = false) {
|
|
|
+ this.isAddedData = false;
|
|
|
+ this.cacheScrollNodeHeight = -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;
|
|
|
+
|
|
|
+ delay = 5;
|
|
|
+
|
|
|
+ setTimeout(() => {
|
|
|
+ this._callMyParentQuery();
|
|
|
+ }, delay)
|
|
|
+ if (!isFromMounted && this.autoScrollToTopWhenReload) {
|
|
|
+ let checkedNRefresherLoading = true;
|
|
|
+
|
|
|
+ checkedNRefresherLoading = !this.nRefresherLoading;
|
|
|
+
|
|
|
+ if (checkedNRefresherLoading) {
|
|
|
+ this._scrollToTop(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!this.usePageScroll && this.useChatRecordMode) {
|
|
|
+ if (this.showConsoleError) {
|
|
|
+ zUtils.consoleWarn('[z-paging]使用聊天记录模式时,建议使用页面滚动,可将usePageScroll设置为true以启用页面滚动!!');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ this.$nextTick(() => {
|
|
|
+ if (!this.realTotalData.length) {
|
|
|
+
|
|
|
+ this.nShowBottom = false;
|
|
|
+
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+ _addData(data, success, isLocal) {
|
|
|
+ this.isAddedData = true;
|
|
|
+ this.isTotalChangeFromAddData = true;
|
|
|
+ if (!this.useCustomRefresher) {
|
|
|
+ uni.stopPullDownRefresh();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.usePageScroll) {
|
|
|
+ uni.stopPullDownRefresh();
|
|
|
+ }
|
|
|
+
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ 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!`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (this.refresherTriggered) {
|
|
|
+ this.refresherTriggered = false;
|
|
|
+ }
|
|
|
+ let delayTime = commonDelayTime;
|
|
|
+
|
|
|
+ if (this.useChatRecordMode) {
|
|
|
+ delayTime = 0
|
|
|
+ }
|
|
|
+
|
|
|
+ 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];
|
|
|
+
|
|
|
+ if (this.useChatRecordMode) {
|
|
|
+ newVal.reverse();
|
|
|
+ }
|
|
|
+
|
|
|
+ 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) {
|
|
|
+
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this._scrollToBottom(false);
|
|
|
+ })
|
|
|
+
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (this.useChatRecordMode) {
|
|
|
+
|
|
|
+ this.totalData = [...this.totalData, ...newVal];
|
|
|
+
|
|
|
+
|
|
|
+ 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;
|
|
|
+
|
|
|
+ delayTime = 0;
|
|
|
+
|
|
|
+ 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);
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ } else {
|
|
|
+ if (this.concat) {
|
|
|
+ this.totalData = [...this.totalData, ...newVal];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _checkScrolledToBottom(scrollDiff) {
|
|
|
+ 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');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _onLoadingMore(from = 'click') {
|
|
|
+ if (from === 'toBottom') {
|
|
|
+ if (!this.scrollToBottomBounceEnabled) {
|
|
|
+ if (this.scrollEnable) {
|
|
|
+ this.scrollEnable = false;
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.scrollEnable = true;
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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) {
|
|
|
+
|
|
|
+ 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;
|
|
|
+
|
|
|
+ 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) {
|
|
|
+
|
|
|
+ const el = this.$refs['zp-n-list-bottom-tag'];
|
|
|
+ weexDom.scrollToElement(el, {
|
|
|
+ offset: 0,
|
|
|
+ animated: animate
|
|
|
+ });
|
|
|
+ return;
|
|
|
+
|
|
|
+ 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) {
|
|
|
+
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _scrollIntoView(sel, offset = 0, animate = false, finishCallback) {
|
|
|
+ try {
|
|
|
+ this.scrollTop = this.oldScrollTop;
|
|
|
+ this.$nextTick(() => {
|
|
|
+
|
|
|
+ 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 {
|
|
|
+ el = sel;
|
|
|
+ }
|
|
|
+ if (el) {
|
|
|
+ weexDom.scrollToElement(el, {
|
|
|
+ offset: -offset,
|
|
|
+ animated: animate
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ zUtils.consoleErr('在nvue中滚动到指定位置,cell必须设置 :ref="`z-paging-${index}`"');
|
|
|
+ }
|
|
|
+ return;
|
|
|
+
|
|
|
+ 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) {
|
|
|
+
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _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;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _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) {
|
|
|
+
|
|
|
+ if (!this.isIos) {
|
|
|
+ this.nLoadingMoreFixedHeight = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return res;
|
|
|
+ } else if (type === 'loadingMoreLoading') {
|
|
|
+ const res = this.loadingStatus === 1 && this.$slots.loadingMoreLoading;
|
|
|
+ if (res) {
|
|
|
+
|
|
|
+ if (!this.isIos) {
|
|
|
+ this.nLoadingMoreFixedHeight = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return res;
|
|
|
+ } else if (type === 'loadingMoreNoMore') {
|
|
|
+ const res = this.loadingStatus === 2 && this.$slots.loadingMoreNoMore && this.showLoadingMoreNoMoreView;
|
|
|
+ if (res) {
|
|
|
+
|
|
|
+ if (!this.isIos) {
|
|
|
+ this.nLoadingMoreFixedHeight = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return res;
|
|
|
+ } else if (type === 'loadingMoreFail') {
|
|
|
+ const res = this.loadingStatus === 3 && this.$slots.loadingMoreFail;
|
|
|
+ if (res) {
|
|
|
+
|
|
|
+ if (!this.isIos) {
|
|
|
+ this.nLoadingMoreFixedHeight = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ 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.loadingType = 0;
|
|
|
+ },
|
|
|
+
|
|
|
+ _onRestore() {
|
|
|
+ this.refresherTriggered = 'restore';
|
|
|
+ this.$emit('onRestore');
|
|
|
+ },
|
|
|
+
|
|
|
+ _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;
|
|
|
+ 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.isTouchEnded = false;
|
|
|
+ if (moveDistance >= this.finalRefresherThreshold) {
|
|
|
+ this.refresherStatus = 1;
|
|
|
+ } else {
|
|
|
+ this.refresherStatus = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ this.refresherTransform = `translateY(${moveDistance}px)`;
|
|
|
+ this.lastRefresherTouchmove = touch;
|
|
|
+
|
|
|
+ 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) {
|
|
|
+
|
|
|
+ if (!this.isTouchmoving) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ 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) {
|
|
|
+
|
|
|
+ this.refresherTransform = `translateY(${this.finalRefresherThreshold}px)`;
|
|
|
+
|
|
|
+ this.moveDistance = this.finalRefresherThreshold;
|
|
|
+ this.refresherStatus = 2;
|
|
|
+ this._doRefresherLoad();
|
|
|
+ } else {
|
|
|
+ this._refresherEnd(true, false);
|
|
|
+ setTimeout(() => {
|
|
|
+ this.isTouchmoving = false;
|
|
|
+ }, commonDelayTime);
|
|
|
+ }
|
|
|
+ this.scrollEnable = true;
|
|
|
+ this.$emit('refresherTouchend', moveDistance);
|
|
|
+ },
|
|
|
+
|
|
|
+ _handleScrollViewDisableBounce(e) {
|
|
|
+ if (!this.usePageScroll && this.isIos && !this.scrollToTopBounceEnabled) {
|
|
|
+ if (!e.bounce) {
|
|
|
+ if (this.scrollEnable) {
|
|
|
+ this.scrollEnable = false;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ this.scrollEnable = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _handleWxsOnPullingDown(onPullingDown) {
|
|
|
+ this.wxsOnPullingDown = onPullingDown;
|
|
|
+ if (onPullingDown) {
|
|
|
+ if (!this.useChatRecordMode) {
|
|
|
+ this.renderPropScrollTop = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _refresherEnd(shouldEndLoadingDelay = true, fromAddData = false) {
|
|
|
+
|
|
|
+ if (this.showRefresherWhenReload || this.privateShowRefresherWhenReload) {
|
|
|
+ const stackCount = this.refresherRevealStackCount;
|
|
|
+ this.refresherRevealStackCount--;
|
|
|
+ if (stackCount > 1) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.refresherStatus = 0;
|
|
|
+ } else {
|
|
|
+ setTimeout(() => {
|
|
|
+ this.refresherStatus = 0;
|
|
|
+ }, commonDelayTime);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ this.refresherTransform = 'translateY(0px)';
|
|
|
+
|
|
|
+
|
|
|
+ this.wxsPropType = 'end' + (new Date()).getTime();
|
|
|
+
|
|
|
+ this.moveDistance = 0;
|
|
|
+ if (this.refresherEndBounceEnabled && fromAddData) {
|
|
|
+ this.refresherTransition = 'transform 0.3s cubic-bezier(0.19,1.64,0.42,0.72)';
|
|
|
+ }
|
|
|
+ if (shouldEndLoadingDelay) {
|
|
|
+ setTimeout(() => {
|
|
|
+ this.loading = false;
|
|
|
+ }, commonDelayTime);
|
|
|
+ } else {
|
|
|
+ this.loading = false;
|
|
|
+ }
|
|
|
+ this.$emit('onRestore');
|
|
|
+
|
|
|
+ this._nRefresherEnd();
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ _doRefresherRefreshAnimate() {
|
|
|
+ this.refresherRevealStackCount++;
|
|
|
+ this.refresherTransform = `translateY(${this.finalRefresherThreshold}px)`;
|
|
|
+
|
|
|
+ this.wxsPropType = 'begin' + (new Date()).getTime();
|
|
|
+
|
|
|
+ this.moveDistance = this.finalRefresherThreshold;
|
|
|
+ this.refresherStatus = 2;
|
|
|
+ this.isTouchmoving = true;
|
|
|
+ },
|
|
|
+
|
|
|
+ _doRefresherLoad() {
|
|
|
+ this._onRefresh();
|
|
|
+ this.loading = true;
|
|
|
+ },
|
|
|
+
|
|
|
+ _getFinalRefresherMoveDistance(moveDistance) {
|
|
|
+ moveDistance = moveDistance * 0.85;
|
|
|
+ if (moveDistance >= this.finalRefresherThreshold) {
|
|
|
+ moveDistance = this.finalRefresherThreshold + (moveDistance - this.finalRefresherThreshold) * (1 - this
|
|
|
+ .finalRefresherOutRate);
|
|
|
+ }
|
|
|
+ return moveDistance;
|
|
|
+ },
|
|
|
+
|
|
|
+ async _checkShowLoadingMoreWhenNoMoreAndInsideOfPaging(totalData) {
|
|
|
+ try {
|
|
|
+ const scrollViewNode = await this._getNodeClientRect('.zp-scroll-view');
|
|
|
+ if (this.usePageScroll) {
|
|
|
+ if (scrollViewNode) {
|
|
|
+ const scrollViewTotalH = scrollViewNode[0].top + scrollViewNode[0].height;
|
|
|
+ this.showLoadingMore = scrollViewTotalH >= this.systemInfo.windowHeight;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ let pagingContainerH = 0;
|
|
|
+ let scrollViewH = 0;
|
|
|
+ const pagingContainerNode = await this._getNodeClientRect('.zp-paging-container-content');
|
|
|
+ if (pagingContainerNode) {
|
|
|
+ pagingContainerH = pagingContainerNode[0].height;
|
|
|
+ }
|
|
|
+ if (scrollViewNode) {
|
|
|
+ scrollViewH = scrollViewNode[0].height;
|
|
|
+ }
|
|
|
+ this.showLoadingMore = pagingContainerH >= scrollViewH;
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ this.showLoadingMore = totalData.length;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ 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) {
|
|
|
+
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ async _checkScrollViewShouldFullHeight() {
|
|
|
+ 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 + 10) {
|
|
|
+ this._setAutoHeight(true, scrollViewNode);
|
|
|
+ } else {
|
|
|
+ this._setAutoHeight(false);
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ 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 + 'px');
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ this.$delete(this.scrollViewStyle, 'height');
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _getNodeClientRect(select, inThis = true) {
|
|
|
+
|
|
|
+ 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;
|
|
|
+
|
|
|
+ let res = null;
|
|
|
+ if (inThis) {
|
|
|
+ res = uni.createSelectorQuery().in(this);
|
|
|
+ } else {
|
|
|
+ res = uni.createSelectorQuery();
|
|
|
+ }
|
|
|
+
|
|
|
+ res = uni.createSelectorQuery();
|
|
|
+
|
|
|
+ res.select(select).boundingClientRect();
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ res.exec(data => {
|
|
|
+ if (data && data != '' && data != undefined && data.length) {
|
|
|
+ resolve(data);
|
|
|
+ } else {
|
|
|
+ resolve(false);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ _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)
|
|
|
+ },
|
|
|
+
|
|
|
+ _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) {
|
|
|
+
|
|
|
+ if (!this.usePageScroll) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const node = `.zp-page-scroll-${type}`;
|
|
|
+ const marginText = `margin${type.slice(0,1).toUpperCase() + type.slice(1)}`;
|
|
|
+ this.$nextTick(() => {
|
|
|
+ let delayTime = 0;
|
|
|
+
|
|
|
+ delayTime = 10;
|
|
|
+
|
|
|
+ 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)
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+ _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];
|
|
|
+ },
|
|
|
+
|
|
|
+ _callMyParentList(newVal) {
|
|
|
+ if (this.autowireListName.length) {
|
|
|
+ const myParent = zUtils.getParent(this.$parent);
|
|
|
+ if (myParent && myParent[this.autowireListName]) {
|
|
|
+ myParent[this.autowireListName] = newVal;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ _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');
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _getNvueWaterfallSingleConfig(key, defaultValue) {
|
|
|
+ const value = this.nvueWaterfallConfig[key];
|
|
|
+ if (value) {
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+ return defaultValue;
|
|
|
+ }
|
|
|
+ },
|
|
|
+};
|