|
@@ -0,0 +1,3062 @@
|
|
|
+
|
|
|
+
|
|
|
+import zStatic from './z-paging-static'
|
|
|
+import zConfig from './z-paging-config'
|
|
|
+import zLocalConfig from '../config/index'
|
|
|
+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'
|
|
|
+
|
|
|
+import Enum from './z-paging-enum'
|
|
|
+
|
|
|
+const currentVersion = 'V2.0.8';
|
|
|
+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');
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+当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) {
|
|
|
+ if (zLocalConfig) {
|
|
|
+ config = zLocalConfig;
|
|
|
+ } else {
|
|
|
+ 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,
|
|
|
+
|
|
|
+
|
|
|
+ currentData: [],
|
|
|
+ totalData: [],
|
|
|
+ realTotalData: [],
|
|
|
+ totalLocalPagingList: [],
|
|
|
+ pageNo: 1,
|
|
|
+ scrollTop: 0,
|
|
|
+ oldScrollTop: 0,
|
|
|
+ refresherTouchstartY: 0,
|
|
|
+ lastRefresherTouchmove: null,
|
|
|
+ refresherReachMaxAngle: true,
|
|
|
+ refresherTransform: 'translateY(0px)',
|
|
|
+ refresherTransition: '',
|
|
|
+ finalRefresherDefaultStyle: 'black',
|
|
|
+
|
|
|
+ loadingType: Enum.LoadingType.Refresher,
|
|
|
+
|
|
|
+ loadingStatus: Enum.LoadingMoreStatus.Default,
|
|
|
+
|
|
|
+ refresherStatus: Enum.RefresherStatus.Default,
|
|
|
+ scrollViewStyle: {},
|
|
|
+ scrollViewInStyle: {},
|
|
|
+ pullDownTimeStamp: 0,
|
|
|
+ pageScrollTop: -1,
|
|
|
+ chatRecordLoadingMoreText: '',
|
|
|
+ moveDistance: 0,
|
|
|
+ loadingMoreDefaultSlot: null,
|
|
|
+ backToTopClass: 'zp-back-to-top zp-back-to-top-hide',
|
|
|
+ tempLanguageUpdateKey: 0,
|
|
|
+ wxsPropType: '',
|
|
|
+ refresherRevealStackCount: 0,
|
|
|
+ renderPropScrollTop: -1,
|
|
|
+ renderPropUsePageScroll: -1,
|
|
|
+ checkScrolledToBottomTimeOut: null,
|
|
|
+ refresherCompleteTimeout: null,
|
|
|
+ refresherCompleteSubTimeout: null,
|
|
|
+ lastBackToTopShowTime: 0,
|
|
|
+ systemInfo: null,
|
|
|
+
|
|
|
+
|
|
|
+ showLoadingMore: false,
|
|
|
+ insideOfPaging: -1,
|
|
|
+ refresherTriggered: false,
|
|
|
+ loading: false,
|
|
|
+ firstPageLoaded: false,
|
|
|
+ pagingLoaded: false,
|
|
|
+ loaded: false,
|
|
|
+ isUserReload: true,
|
|
|
+ scrollEnable: true,
|
|
|
+ isTouchmoving: false,
|
|
|
+ isLocalPaging: false,
|
|
|
+ isAddedData: false,
|
|
|
+ isTotalChangeFromAddData: false,
|
|
|
+ isTouchEnded: false,
|
|
|
+ isUserPullDown: false,
|
|
|
+ privateRefresherEnabled: -1,
|
|
|
+ privateScrollWithAnimation: -1,
|
|
|
+ privateConcat: true,
|
|
|
+ myParentQuery: -1,
|
|
|
+ showBackToTopClass: false,
|
|
|
+ isLoadFailed: false,
|
|
|
+ isIos: systemInfo.platform === 'ios',
|
|
|
+ privateShowRefresherWhenReload: false,
|
|
|
+ disabledBounce: false,
|
|
|
+ cacheScrollNodeHeight: -1,
|
|
|
+ customNoMore: -1,
|
|
|
+ customRefresherHeight: -1,
|
|
|
+ showCustomRefresher: false,
|
|
|
+ fromEmptyViewReload: false,
|
|
|
+ doRefreshAnimateAfter: false,
|
|
|
+ isRefresherInComplete: false,
|
|
|
+ isIos13: systemInfo.system && systemInfo.system.length && systemInfo.system.indexOf('iOS 13') != -1,
|
|
|
+
|
|
|
+
|
|
|
+ nRefresherLoading: false,
|
|
|
+ nListIsDragging: false,
|
|
|
+ nShowBottom: true,
|
|
|
+ nFixFreezing: false,
|
|
|
+ nShowRefresherReveal: false,
|
|
|
+ nIsFirstPageAndNoMore: false,
|
|
|
+ nFirstPageAndNoMoreChecked: false,
|
|
|
+ nLoadingMoreFixedHeight: false,
|
|
|
+ nShowRefresherRevealHeight: 0,
|
|
|
+
|
|
|
+
|
|
|
+ wxsIsScrollTopInTopRange: true,
|
|
|
+ wxsScrollTop: 0,
|
|
|
+ wxsPageScrollTop: 0,
|
|
|
+ wxsOnPullingDown: false,
|
|
|
+ };
|
|
|
+ },
|
|
|
+ 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', '');
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ delay: {
|
|
|
+ type: [Number, String],
|
|
|
+ default: _getConfig('delay', 0),
|
|
|
+ },
|
|
|
+
|
|
|
+ language: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('language', '')
|
|
|
+ },
|
|
|
+
|
|
|
+ followSystemLanguage: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('followSystemLanguage', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ pagingStyle: {
|
|
|
+ type: Object,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('pagingStyle', {});
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ height: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('height', '')
|
|
|
+ },
|
|
|
+
|
|
|
+ width: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('width', '')
|
|
|
+ },
|
|
|
+
|
|
|
+ bgColor: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('bgColor', '')
|
|
|
+ },
|
|
|
+
|
|
|
+ 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', '');
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherImgStyle: {
|
|
|
+ type: Object,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('refresherImgStyle', {});
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherTitleStyle: {
|
|
|
+ type: Object,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('refresherTitleStyle', {});
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherUpdateTimeStyle: {
|
|
|
+ type: Object,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('refresherUpdateTimeStyle', {});
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ loadingMoreThemeStyle: {
|
|
|
+ type: String,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('loadingMoreThemeStyle', '');
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherOnly: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('refresherOnly', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherCompleteDelay: {
|
|
|
+ type: [Number, String],
|
|
|
+ default: _getConfig('refresherCompleteDelay', 0)
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherCompleteDuration: {
|
|
|
+ type: [Number, String],
|
|
|
+ default: _getConfig('refresherCompleteDuration', 300)
|
|
|
+ },
|
|
|
+
|
|
|
+ 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)
|
|
|
+ },
|
|
|
+
|
|
|
+ refresherCompleteText: {
|
|
|
+ type: [String, Object],
|
|
|
+ default: _getConfig('refresherCompleteText', 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', '')
|
|
|
+ },
|
|
|
+
|
|
|
+ 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)
|
|
|
+ },
|
|
|
+
|
|
|
+ hideLoadingMoreWhenNoMoreAndInsideOfPaging: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('hideLoadingMoreWhenNoMoreAndInsideOfPaging', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ hideLoadingMoreWhenNoMoreByLimit: {
|
|
|
+ type: Number,
|
|
|
+ default: _getConfig('hideLoadingMoreWhenNoMoreByLimit', 0)
|
|
|
+ },
|
|
|
+
|
|
|
+ insideMore: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('insideMore', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ 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', {});
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ emptyViewFixed: {
|
|
|
+ type: Boolean,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('emptyViewFixed', true)
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ emptyViewCenter: {
|
|
|
+ type: Boolean,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('emptyViewCenter', true)
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ 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', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ scrollX: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('scrollX', 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)
|
|
|
+ },
|
|
|
+
|
|
|
+ autoFullHeight: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('autoFullHeight', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ 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: _getConfig('nvueBounce', true)
|
|
|
+ },
|
|
|
+
|
|
|
+ nvueFastScroll: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('nvueFastScroll', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ nvueListId: {
|
|
|
+ type: String,
|
|
|
+ default: _getConfig('nvueListId', '')
|
|
|
+ },
|
|
|
+
|
|
|
+ nvueRefresherStyle: {
|
|
|
+ type: Object,
|
|
|
+ default: function() {
|
|
|
+ return _getConfig('nvueRefresherStyle', {});
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ hideNvueBottomTag: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _getConfig('hideNvueBottomTag', false)
|
|
|
+ },
|
|
|
+
|
|
|
+ showConsoleError: {
|
|
|
+ type: Boolean,
|
|
|
+ default: _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();
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ 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.isTotalChangeFromAddData = true;
|
|
|
+ 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)
|
|
|
+ });
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+ this._preCheckShowLoadingMoreWhenNoMoreAndInsideOfPaging(newVal)
|
|
|
+
|
|
|
+ } 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);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ 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 === Enum.LoadingMoreStatus.NoMore) {
|
|
|
+ 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.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 {
|
|
|
+ status: this.loadingStatus,
|
|
|
+ defaultThemeStyle: this.finalLoadingMoreThemeStyle,
|
|
|
+ customStyle: this.loadingMoreCustomStyle,
|
|
|
+ iconCustomStyle: this.loadingMoreLoadingIconCustomStyle,
|
|
|
+ loadingIconType: this.loadingMoreLoadingIconType,
|
|
|
+ loadingIconCustomImage: this.loadingMoreLoadingIconCustomImage,
|
|
|
+ loadingAnimated: this.loadingMoreLoadingAnimated,
|
|
|
+ showNoMoreLine: this.showLoadingMoreNoMoreLine,
|
|
|
+ noMoreLineCustomStyle: this.loadingMoreNoMoreLineCustomStyle,
|
|
|
+ defaultText: this.finalLoadingMoreDefaultText,
|
|
|
+ loadingText: this.finalLoadingMoreLoadingText,
|
|
|
+ noMoreText: this.finalLoadingMoreNoMoreText,
|
|
|
+ failText: 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';
|
|
|
+ },
|
|
|
+ finalNvueRefresherEnabled() {
|
|
|
+ return this.finalNvueListIs !== 'view' && this.finalRefresherEnabled && !this.nShowRefresherReveal && !this.useChatRecordMode;
|
|
|
+ },
|
|
|
+ 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) {
|
|
|
+ pagingStyle.top = windowTop + 'px';
|
|
|
+ }
|
|
|
+ if (!pagingStyle.bottom) {
|
|
|
+ let bottom = 0;
|
|
|
+ if (windowBottom && windowBottom !== undefined) {
|
|
|
+ bottom = windowBottom;
|
|
|
+ }
|
|
|
+ if (this.safeAreaInsetBottom) {
|
|
|
+ bottom += this.safeAreaBottom;
|
|
|
+ }
|
|
|
+ pagingStyle.bottom = bottom + 'px';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (this.bgColor.length && !pagingStyle['background']) {
|
|
|
+ pagingStyle['background-color'] = this.bgColor;
|
|
|
+ }
|
|
|
+ if (this.height.length && !pagingStyle['height']) {
|
|
|
+ pagingStyle['height'] = this.height;
|
|
|
+ }
|
|
|
+ if (this.width.length && !pagingStyle['width']) {
|
|
|
+ pagingStyle['width'] = this.width;
|
|
|
+ }
|
|
|
+ return pagingStyle;
|
|
|
+ },
|
|
|
+ finalEnableBackToTop() {
|
|
|
+ if (this.usePageScroll) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return this.enableBackToTop;
|
|
|
+ },
|
|
|
+ finalBackToTopThreshold() {
|
|
|
+ return zUtils.convertTextToPx(this.backToTopThreshold);
|
|
|
+ },
|
|
|
+ finalLowerThreshold() {
|
|
|
+ return zUtils.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 zUtils.convertTextToPx(refresherThreshold);
|
|
|
+ },
|
|
|
+ finalRefresherFixedBacHeight() {
|
|
|
+ return zUtils.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 + zUtils.convertTextToPx(this.backToTopBottom) + 'px';
|
|
|
+ }
|
|
|
+ if(!tempBackToTopStyle.position){
|
|
|
+ tempBackToTopStyle.position = this.usePageScroll ? 'fixed': 'absolute';
|
|
|
+ }
|
|
|
+ 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);
|
|
|
+ },
|
|
|
+ finalRefresherCompleteText() {
|
|
|
+ return this._getI18nText('refresherCompleteText', this.refresherCompleteText);
|
|
|
+ },
|
|
|
+ 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;
|
|
|
+ },
|
|
|
+ finalConcat() {
|
|
|
+ return this.concat && this.privateConcat;
|
|
|
+ },
|
|
|
+ finalShowRefresherWhenReload() {
|
|
|
+ return this.showRefresherWhenReload || this.privateShowRefresherWhenReload;
|
|
|
+ },
|
|
|
+ finalRefresherTriggered() {
|
|
|
+ if(!(this.finalRefresherEnabled && !this.useCustomRefresher)){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return this.refresherTriggered;
|
|
|
+ },
|
|
|
+ showEmpty() {
|
|
|
+ const showEmpty = !this.refresherOnly && !this.totalData.length && (this.autoHideEmptyViewWhenLoading ? this
|
|
|
+ .isAddedData : true) && !this.hideEmptyView && (this.autoHideEmptyViewWhenLoading ? (!this
|
|
|
+ .firstPageLoaded && !this.loading) : true);
|
|
|
+ return showEmpty;
|
|
|
+ },
|
|
|
+ showLoading() {
|
|
|
+ const showLoading = !this.firstPageLoaded && (this.autoHideLoadingAfterFirstLoaded ? (this
|
|
|
+ .fromEmptyViewReload ? true : !this.pagingLoaded) : true) && this.loading;
|
|
|
+ return showLoading;
|
|
|
+ },
|
|
|
+ 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.screenHeight - this.systemInfo.safeArea.bottom;
|
|
|
+
|
|
|
+
|
|
|
+ safeAreaBottom = this.systemInfo.safeAreaInsets.bottom || 0;
|
|
|
+
|
|
|
+ return Math.abs(safeAreaBottom);
|
|
|
+ },
|
|
|
+ renderJsIgnore() {
|
|
|
+ if ((this.usePageScroll && this.useChatRecordMode) || !this.refresherEnabled || !this.useCustomRefresher) {
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.renderPropScrollTop = 10;
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ },
|
|
|
+ windowHeight() {
|
|
|
+ if (!this.systemInfo) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ return this.systemInfo.windowHeight;
|
|
|
+ },
|
|
|
+ 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;
|
|
|
+
|
|
|
+ if (this.customRefresherHeight === -1 && showRefresher) {
|
|
|
+ setTimeout(() => {
|
|
|
+ this.$nextTick(()=>{
|
|
|
+ this._updateCustomRefresherHeight();
|
|
|
+ })
|
|
|
+ }, 100)
|
|
|
+ }
|
|
|
+
|
|
|
+ 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: {
|
|
|
+
|
|
|
+ complete(data, success = true) {
|
|
|
+ this.customNoMore = -1;
|
|
|
+ this.addData(data, success);
|
|
|
+ },
|
|
|
+
|
|
|
+ end(data, success = true) {
|
|
|
+ this.complete(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);
|
|
|
+ },
|
|
|
+
|
|
|
+ endByKey(data, dataKey = null, success = true) {
|
|
|
+ this.completeByKey(data, dataKey, success);
|
|
|
+ },
|
|
|
+
|
|
|
+ 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);
|
|
|
+ },
|
|
|
+
|
|
|
+ completeByTotal(data, totalCount, success = true) {
|
|
|
+ this.completeByTotalCount(data, totalCount, success);
|
|
|
+ },
|
|
|
+
|
|
|
+ endByTotalCount(data, totalCount, success = true) {
|
|
|
+ this.completeByTotalCount(data, totalCount, success);
|
|
|
+ },
|
|
|
+
|
|
|
+ endByTotal(data, totalCount, success = true) {
|
|
|
+ this.completeByTotalCount(data, totalCount, success);
|
|
|
+ },
|
|
|
+
|
|
|
+ completeByNoMore(data, nomore, success = true) {
|
|
|
+ if (nomore != 'undefined') {
|
|
|
+ this.customNoMore = nomore == true ? 1 : 0;
|
|
|
+ }
|
|
|
+ this.addData(data, success);
|
|
|
+ },
|
|
|
+
|
|
|
+ endByNoMore(data, nomore, success = true) {
|
|
|
+ this.completeByNoMore(data, nomore, success);
|
|
|
+ },
|
|
|
+
|
|
|
+ addData(data, success = true) {
|
|
|
+ this.$nextTick(() => {
|
|
|
+ if (this.delay > 0) {
|
|
|
+ setTimeout(() => {
|
|
|
+ this._addData(data, success, false);
|
|
|
+ }, this.delay)
|
|
|
+ } else {
|
|
|
+ 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);
|
|
|
+ },
|
|
|
+
|
|
|
+ refresh() {
|
|
|
+ const disPageNo = this.pageNo - this.defaultPageNo + 1;
|
|
|
+ if (disPageNo >= 1) {
|
|
|
+ this.loading = true;
|
|
|
+ this.privateConcat = false;
|
|
|
+ const totalPageSize = disPageNo * this.pageSize;
|
|
|
+ this.$emit('query', this.defaultPageNo, totalPageSize);
|
|
|
+ this._callMyParentQuery(this.defaultPageNo, totalPageSize);
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ 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,checkReverse = true) {
|
|
|
+
|
|
|
+ if (checkReverse && this.useChatRecordMode) {
|
|
|
+ if(!this.nIsFirstPageAndNoMore){
|
|
|
+ this.scrollToBottom(animate, false);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this._scrollToTop(animate, false);
|
|
|
+
|
|
|
+ if (this.nvueFastScroll && animate) {
|
|
|
+ setTimeout(() => {
|
|
|
+ this._scrollToTop(false, false);
|
|
|
+ }, 150);
|
|
|
+ }
|
|
|
+
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+ scrollToBottom(animate,checkReverse = true) {
|
|
|
+
|
|
|
+ if (checkReverse && this.useChatRecordMode) {
|
|
|
+ if(!this.nIsFirstPageAndNoMore){
|
|
|
+ this.scrollToTop(animate, false);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this._scrollToBottom(animate);
|
|
|
+
|
|
|
+ if (this.nvueFastScroll && animate) {
|
|
|
+ setTimeout(() => {
|
|
|
+ this._scrollToBottom(false);
|
|
|
+ }, 150);
|
|
|
+ }
|
|
|
+
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+ 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;
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ setSpecialEffects(args) {
|
|
|
+ this.setListSpecialEffects(args);
|
|
|
+ },
|
|
|
+
|
|
|
+ setListSpecialEffects(args) {
|
|
|
+ this.nFixFreezing = args !== {};
|
|
|
+ if (this.isIos) {
|
|
|
+ this.privateRefresherEnabled = 0;
|
|
|
+ }
|
|
|
+ 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 = Enum.RefresherStatus.Loading;
|
|
|
+ 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.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;
|
|
|
+
|
|
|
+ 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('使用聊天记录模式时,建议使用页面滚动,可将usePageScroll设置为true以启用页面滚动!!');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ this.$nextTick(() => {
|
|
|
+ if (!this.realTotalData.length) {
|
|
|
+
|
|
|
+ this.nShowBottom = false;
|
|
|
+
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+ _addData(data, success, isLocal) {
|
|
|
+ this.isAddedData = true;
|
|
|
+ this.fromEmptyViewReload = false;
|
|
|
+ this.isTotalChangeFromAddData = true;
|
|
|
+ if (!this.useCustomRefresher) {
|
|
|
+ uni.stopPullDownRefresh();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.usePageScroll) {
|
|
|
+ uni.stopPullDownRefresh();
|
|
|
+ }
|
|
|
+
|
|
|
+ const tempIsUserPullDown = this.isUserPullDown;
|
|
|
+ if (tempIsUserPullDown && 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 (tempIsUserPullDown && 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;
|
|
|
+
|
|
|
+ if (this.useChatRecordMode) {
|
|
|
+ delayTime = 0
|
|
|
+ }
|
|
|
+
|
|
|
+ setTimeout(() => {
|
|
|
+ this._refresherEnd(true, true, tempIsUserPullDown);
|
|
|
+ this.pagingLoaded = true;
|
|
|
+ }, delayTime)
|
|
|
+ if (this.pageNo === this.defaultPageNo) {
|
|
|
+ this.isLoadFailed = !success;
|
|
|
+ }
|
|
|
+ if (success) {
|
|
|
+ if (!(this.privateConcat === false && this.loadingStatus === Enum.LoadingMoreStatus.NoMore)) {
|
|
|
+ this.loadingStatus = Enum.LoadingMoreStatus.Default;
|
|
|
+ }
|
|
|
+ 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 = Enum.LoadingMoreStatus.Fail;
|
|
|
+ if (this.loadingType === Enum.LoadingType.LoadingMore) {
|
|
|
+ this.pageNo--;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _currentDataChange(newVal, oldVal) {
|
|
|
+ newVal = [...newVal];
|
|
|
+
|
|
|
+ if (this.useChatRecordMode) {
|
|
|
+ newVal.reverse();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.pageNo === this.defaultPageNo && this.finalConcat) {
|
|
|
+ this.totalData = [];
|
|
|
+ }
|
|
|
+ if (this.customNoMore !== -1) {
|
|
|
+ if (this.customNoMore === 0 || !newVal.length) {
|
|
|
+ this.loadingStatus = Enum.LoadingMoreStatus.NoMore;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (!newVal.length ||
|
|
|
+ (newVal.length && newVal.length < this.defaultPageSize)) {
|
|
|
+ this.loadingStatus = Enum.LoadingMoreStatus.NoMore;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!this.totalData.length) {
|
|
|
+ if (this.finalConcat) {
|
|
|
+
|
|
|
+ if(this.useChatRecordMode && this.pageNo === this.defaultPageNo && this.loadingStatus === Enum.LoadingMoreStatus.NoMore){
|
|
|
+ newVal.reverse();
|
|
|
+ }
|
|
|
+
|
|
|
+ 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.finalConcat) {
|
|
|
+ this.totalData = [...this.totalData, ...newVal];
|
|
|
+ } else {
|
|
|
+ this.totalData = [...newVal];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.privateConcat = true;
|
|
|
+ },
|
|
|
+
|
|
|
+ _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)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _onLoadingMore(from = 'click') {
|
|
|
+ if (from === 'toBottom') {
|
|
|
+ if (!this.scrollToBottomBounceEnabled) {
|
|
|
+ if (this.scrollEnable) {
|
|
|
+ this.scrollEnable = false;
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.scrollEnable = true;
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.isIos) {
|
|
|
+ this.renderPropUsePageScroll = -1;
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.renderPropUsePageScroll = this.usePageScroll;
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ this.$emit('scrolltolower', from);
|
|
|
+ if (from === 'toBottom' && (!this.toBottomLoadingMoreEnabled || this.useChatRecordMode)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (this.refresherOnly || !this.loadingMoreEnabled || !(this.loadingStatus === Enum.LoadingMoreStatus
|
|
|
+ .Default || this.loadingStatus === Enum.LoadingMoreStatus.Fail) || 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 === Enum.LoadingMoreStatus.NoMore) {
|
|
|
+ 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) => {
|
|
|
+ let nodeHeight = 0;
|
|
|
+ if (node) {
|
|
|
+ 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'];
|
|
|
+ if (el) {
|
|
|
+ weexDom.scrollToElement(el, {
|
|
|
+ offset: 0,
|
|
|
+ animated: animate
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ zUtils.consoleErr('滚动到底部失败,因为您设置了hideNvueBottomTag为true');
|
|
|
+ }
|
|
|
+ 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 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;
|
|
|
+
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _shouldShowLoadingMore(type) {
|
|
|
+ if (!(this.loadingStatus === Enum.LoadingMoreStatus.Default ? this.nShowBottom : true)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (((!this.showLoadingMoreWhenReload || this.isUserPullDown || this.loadingStatus !== Enum
|
|
|
+ .LoadingMoreStatus.Loading) && !this
|
|
|
+ .showLoadingMore) || (!this.loadingMoreEnabled && (!this.showLoadingMoreWhenReload || this
|
|
|
+ .isUserPullDown || this.loadingStatus !== Enum.LoadingMoreStatus.Loading)) || this
|
|
|
+ .refresherOnly) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (this.useChatRecordMode && type !== 'loadingMoreLoading') {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (!this.$slots) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (type === 'loadingMoreDefault') {
|
|
|
+ const res = this.loadingStatus === Enum.LoadingMoreStatus.Default && this.$slots.loadingMoreDefault;
|
|
|
+ if (res) {
|
|
|
+
|
|
|
+ if (!this.isIos) {
|
|
|
+ this.nLoadingMoreFixedHeight = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return res;
|
|
|
+ } else if (type === 'loadingMoreLoading') {
|
|
|
+ const res = this.loadingStatus === Enum.LoadingMoreStatus.Loading && this.$slots.loadingMoreLoading;
|
|
|
+ if (res) {
|
|
|
+
|
|
|
+ if (!this.isIos) {
|
|
|
+ this.nLoadingMoreFixedHeight = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return res;
|
|
|
+ } else if (type === 'loadingMoreNoMore') {
|
|
|
+ const res = this.loadingStatus === Enum.LoadingMoreStatus.NoMore && this.$slots.loadingMoreNoMore &&
|
|
|
+ this.showLoadingMoreNoMoreView;
|
|
|
+ if (res) {
|
|
|
+
|
|
|
+ if (!this.isIos) {
|
|
|
+ this.nLoadingMoreFixedHeight = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return res;
|
|
|
+ } else if (type === 'loadingMoreFail') {
|
|
|
+ const res = this.loadingStatus === Enum.LoadingMoreStatus.Fail && this.$slots.loadingMoreFail;
|
|
|
+ if (res) {
|
|
|
+
|
|
|
+ if (!this.isIos) {
|
|
|
+ this.nLoadingMoreFixedHeight = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return res;
|
|
|
+ } else if (type === 'loadingMoreCustom') {
|
|
|
+ const res = this.showDefaultLoadingMoreText && !(this.loadingStatus === Enum.LoadingMoreStatus.NoMore &&
|
|
|
+ !this
|
|
|
+ .showLoadingMoreNoMoreView);
|
|
|
+ return res;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ },
|
|
|
+
|
|
|
+ _startLoading(isReload = false) {
|
|
|
+ if ((this.showLoadingMoreWhenReload && !this.isUserPullDown) || !isReload) {
|
|
|
+ this.loadingStatus = Enum.LoadingMoreStatus.Loading;
|
|
|
+ }
|
|
|
+ this.loading = true;
|
|
|
+ },
|
|
|
+
|
|
|
+ _doLoadingMore() {
|
|
|
+ if (this.pageNo >= this.defaultPageNo && this.loadingStatus !== Enum.LoadingMoreStatus.NoMore) {
|
|
|
+ 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 = Enum.LoadingType.LoadingMore;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ _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(fromScrollView=false) {
|
|
|
+ if (fromScrollView){
|
|
|
+ if (!(this.finalRefresherEnabled && !this.useCustomRefresher)){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.$emit('onRefresh');
|
|
|
+ this.$emit('Refresh');
|
|
|
+ if (this.loading || this.isRefresherInComplete || 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.loadingType = Enum.LoadingType.Refresher;
|
|
|
+ },
|
|
|
+
|
|
|
+ _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;
|
|
|
+ this._cleanRefresherCompleteTimeout();
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ _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;
|
|
|
+ this.isTouchmoving = true;
|
|
|
+
|
|
|
+ this.isTouchEnded = false;
|
|
|
+ if (moveDistance >= this.finalRefresherThreshold) {
|
|
|
+ this.refresherStatus = Enum.RefresherStatus.PullToRefresh;
|
|
|
+ } else {
|
|
|
+ this.refresherStatus = Enum.RefresherStatus.Default;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ 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 === Enum.RefresherStatus
|
|
|
+ .PullToRefresh) {
|
|
|
+
|
|
|
+ this.refresherTransform = `translateY(${this.finalRefresherThreshold}px)`;
|
|
|
+
|
|
|
+ this.moveDistance = this.finalRefresherThreshold;
|
|
|
+ this.refresherStatus = Enum.RefresherStatus.Loading;
|
|
|
+ this._doRefresherLoad();
|
|
|
+ } else {
|
|
|
+ this._refresherEnd(true, false);
|
|
|
+ setTimeout(() => {
|
|
|
+ this.isTouchmoving = false;
|
|
|
+ }, commonDelayTime);
|
|
|
+ }
|
|
|
+ this.scrollEnable = true;
|
|
|
+ this.refresherTransition = 'transform .1s linear';
|
|
|
+ this.$emit('refresherTouchend', moveDistance);
|
|
|
+ },
|
|
|
+
|
|
|
+ _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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _handleWxsOnPullingDown(onPullingDown) {
|
|
|
+ this.wxsOnPullingDown = onPullingDown;
|
|
|
+ if (onPullingDown) {
|
|
|
+ if (!this.useChatRecordMode) {
|
|
|
+ this.renderPropScrollTop = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _refresherEnd(shouldEndLoadingDelay = true, fromAddData = false, isUserPullDown = false) {
|
|
|
+ let refresherCompleteDelay = 0;
|
|
|
+ if(fromAddData && isUserPullDown){
|
|
|
+ refresherCompleteDelay = this.refresherCompleteDelay;
|
|
|
+ if(this.refresherCompleteDuration > 700){
|
|
|
+ refresherCompleteDelay = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const refresherStatus = refresherCompleteDelay > 0 ? Enum.RefresherStatus.Complete : Enum.RefresherStatus.Default;
|
|
|
+
|
|
|
+ if (this.finalShowRefresherWhenReload) {
|
|
|
+ const stackCount = this.refresherRevealStackCount;
|
|
|
+ this.refresherRevealStackCount--;
|
|
|
+ if (stackCount > 1) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.refresherStatus = refresherStatus;
|
|
|
+ } else {
|
|
|
+ setTimeout(() => {
|
|
|
+ this.refresherStatus = refresherStatus;
|
|
|
+ }, commonDelayTime);
|
|
|
+ }
|
|
|
+ if (refresherCompleteDelay > 0) {
|
|
|
+ this.isRefresherInComplete = true;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (this.finalShowRefresherWhenReload) {
|
|
|
+ const stackCount = this.refresherRevealStackCount;
|
|
|
+ this.refresherRevealStackCount--;
|
|
|
+ if (stackCount > 1) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.refresherStatus = refresherStatus;
|
|
|
+ } else {
|
|
|
+ setTimeout(() => {
|
|
|
+ this.refresherStatus = refresherStatus;
|
|
|
+ }, commonDelayTime);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (shouldEndLoadingDelay) {
|
|
|
+ setTimeout(() => {
|
|
|
+ this.loading = false;
|
|
|
+ }, commonDelayTime);
|
|
|
+ } else {
|
|
|
+ this.loading = false;
|
|
|
+ }
|
|
|
+ this._cleanRefresherCompleteTimeout();
|
|
|
+ this.refresherCompleteTimeout = setTimeout(() => {
|
|
|
+ let animateDuration = 1;
|
|
|
+ if (fromAddData) {
|
|
|
+ const animateType = this.refresherEndBounceEnabled ? 'cubic-bezier(0.19,1.64,0.42,0.72)' : 'linear';
|
|
|
+ animateDuration = this.refresherEndBounceEnabled ? this.refresherCompleteDuration / 1000 : this.refresherCompleteDuration / 3000;
|
|
|
+ this.refresherTransition = `transform ${animateDuration}s ${animateType}`;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.refresherTransform = 'translateY(0px)';
|
|
|
+
|
|
|
+
|
|
|
+ this.wxsPropType = 'end' + (new Date()).getTime();
|
|
|
+
|
|
|
+
|
|
|
+ this._nRefresherEnd();
|
|
|
+
|
|
|
+ this.moveDistance = 0;
|
|
|
+
|
|
|
+ if (refresherStatus === Enum.RefresherStatus.Complete) {
|
|
|
+ if (this.refresherCompleteSubTimeout) {
|
|
|
+ clearTimeout(this.refresherCompleteSubTimeout);
|
|
|
+ this.refresherCompleteSubTimeout = null;
|
|
|
+ }
|
|
|
+ this.refresherCompleteSubTimeout = setTimeout(() => {
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.refresherStatus = Enum.RefresherStatus.Default;
|
|
|
+ this.isRefresherInComplete = false;
|
|
|
+ })
|
|
|
+ }, animateDuration * 800);
|
|
|
+ }
|
|
|
+
|
|
|
+ }, refresherCompleteDelay);
|
|
|
+ this.$emit('onRestore');
|
|
|
+ this.$emit('Restore');
|
|
|
+ },
|
|
|
+
|
|
|
+ _doRefresherRefreshAnimate() {
|
|
|
+ this._cleanRefresherCompleteTimeout();
|
|
|
+
|
|
|
+ const doRefreshAnimateAfter = !this.doRefreshAnimateAfter && (this.finalShowRefresherWhenReload) && this
|
|
|
+ .customRefresherHeight === -1 && this.refresherThreshold === '80rpx';
|
|
|
+ if (doRefreshAnimateAfter) {
|
|
|
+ this.doRefreshAnimateAfter = true;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.refresherRevealStackCount++;
|
|
|
+ this.refresherTransform = `translateY(${this.finalRefresherThreshold}px)`;
|
|
|
+
|
|
|
+ this.wxsPropType = 'begin' + (new Date()).getTime();
|
|
|
+
|
|
|
+ this.moveDistance = this.finalRefresherThreshold;
|
|
|
+ this.refresherStatus = Enum.RefresherStatus.Loading;
|
|
|
+ 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;
|
|
|
+ },
|
|
|
+
|
|
|
+ _preCheckShowLoadingMoreWhenNoMoreAndInsideOfPaging(newVal, scrollViewNode, pagingContainerNode) {
|
|
|
+ if (this.loadingStatus === Enum.LoadingMoreStatus.NoMore && this.hideLoadingMoreWhenNoMoreByLimit > 0 &&
|
|
|
+ newVal.length) {
|
|
|
+ this.showLoadingMore = newVal.length > this.hideLoadingMoreWhenNoMoreByLimit;
|
|
|
+ } else if ((this.loadingStatus === Enum.LoadingMoreStatus.NoMore && 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;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ 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.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();
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ async _checkScrollViewOutOfPage() {
|
|
|
+ try {
|
|
|
+ const scrollViewNode = await this._getNodeClientRect('.zp-scroll-view');
|
|
|
+ if (scrollViewNode) {
|
|
|
+ const scrollViewTotalH = scrollViewNode[0].top + scrollViewNode[0].height;
|
|
|
+ if (scrollViewTotalH > this.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(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.windowHeight) {
|
|
|
+ this._setAutoHeight(true, scrollViewNode);
|
|
|
+ callback(scrollViewNode, pagingContainerNode);
|
|
|
+ } else {
|
|
|
+ this._setAutoHeight(false);
|
|
|
+ callback(null, null);
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ callback(null, null);
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ async _setAutoHeight(shouldFullHeight = true, scrollViewNode = null) {
|
|
|
+ let heightKey = 'height';
|
|
|
+
|
|
|
+ if (this.usePageScroll) {
|
|
|
+ heightKey = 'min-height';
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ if (shouldFullHeight) {
|
|
|
+ let finalScrollViewNode = scrollViewNode ? scrollViewNode : await this._getNodeClientRect(
|
|
|
+ '.scroll-view');
|
|
|
+ if (finalScrollViewNode) {
|
|
|
+ const scrollViewTop = finalScrollViewNode[0].top;
|
|
|
+ const scrollViewHeight = this.windowHeight - scrollViewTop;
|
|
|
+ let additionHeight = zUtils.convertTextToPx(this.autoHeightAddition);
|
|
|
+ this.$set(this.scrollViewStyle, heightKey, scrollViewHeight + additionHeight - (this
|
|
|
+ .insideMore ? 1 : 0) + 'px');
|
|
|
+ this.$set(this.scrollViewInStyle, heightKey, scrollViewHeight + additionHeight - (this
|
|
|
+ .insideMore ? 1 : 0) + 'px');
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ this.$delete(this.scrollViewStyle, heightKey);
|
|
|
+ this.$delete(this.scrollViewInStyle, heightKey);
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _updateInsideOfPaging() {
|
|
|
+ if (this.insideMore && this.insideOfPaging === true) {
|
|
|
+ setTimeout(() => {
|
|
|
+ this.doLoadMore();
|
|
|
+ }, 200)
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _getNodeClientRect(select, inThis = true, scrollOffset = false) {
|
|
|
+
|
|
|
+ select = select.replace('.', '').replace('#', '');
|
|
|
+ const ref = this.$refs[select];
|
|
|
+ if (ref) {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ weexDom.getComponentRect(ref, option => {
|
|
|
+ if (option && 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();
|
|
|
+
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ _getRefresherTouchDisabled() {
|
|
|
+ let checkOldScrollTop = this.oldScrollTop > 5;
|
|
|
+ const res = this.loading || this.isRefresherInComplete || 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)
|
|
|
+ },
|
|
|
+
|
|
|
+ _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;
|
|
|
+ this.lastBackToTopShowTime = new Date().getTime();
|
|
|
+ setTimeout(() => {
|
|
|
+ this.backToTopClass = 'zp-back-to-top zp-back-to-top-show';
|
|
|
+ }, 300)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (this.showBackToTopClass) {
|
|
|
+ const currentTime = new Date().getTime();
|
|
|
+ let dalayTime = 300;
|
|
|
+ if(currentTime - this.lastBackToTopShowTime < 500){
|
|
|
+ dalayTime = 0;
|
|
|
+ }
|
|
|
+ this.backToTopClass = 'zp-back-to-top zp-back-to-top-hide';
|
|
|
+ setTimeout(() => {
|
|
|
+ this.showBackToTopClass = false;
|
|
|
+ }, dalayTime)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ _updatePageScrollTopOrBottomHeight(type) {
|
|
|
+
|
|
|
+ if (!this.usePageScroll) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const node = `.zp-page-scroll-${type}`;
|
|
|
+ const marginText = `margin${type.slice(0,1).toUpperCase() + type.slice(1)}`;
|
|
|
+ let safeAreaInsetBottomAdd = this.safeAreaInsetBottom;
|
|
|
+
|
|
|
+ if (!this.usePageScroll) {
|
|
|
+ safeAreaInsetBottomAdd = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.$nextTick(() => {
|
|
|
+ let delayTime = 0;
|
|
|
+
|
|
|
+ delayTime = 10;
|
|
|
+
|
|
|
+ setTimeout(() => {
|
|
|
+ this._getNodeClientRect(node).then((res) => {
|
|
|
+ if (res) {
|
|
|
+ let pageScrollNodeHeight = res[0].height;
|
|
|
+ if (type === 'bottom') {
|
|
|
+ if (safeAreaInsetBottomAdd) {
|
|
|
+ pageScrollNodeHeight += this.safeAreaBottom;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.$set(this.scrollViewStyle, marginText,
|
|
|
+ `${pageScrollNodeHeight}px`);
|
|
|
+ } else if (safeAreaInsetBottomAdd) {
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ if (this.doRefreshAnimateAfter) {
|
|
|
+ this.doRefreshAnimateAfter = false;
|
|
|
+ this._doRefresherRefreshAnimate();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ _emptyViewReload() {
|
|
|
+ let callbacked = false;
|
|
|
+ this.$emit('emptyViewReload', (reload) => {
|
|
|
+ if (reload === undefined || reload === true) {
|
|
|
+ this.fromEmptyViewReload = true;
|
|
|
+ this.reload();
|
|
|
+ }
|
|
|
+ callbacked = true;
|
|
|
+ });
|
|
|
+ this.$nextTick(() => {
|
|
|
+ if (!callbacked) {
|
|
|
+ this.fromEmptyViewReload = true;
|
|
|
+ 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(customPageNo = 0, customPageSize = 0) {
|
|
|
+ 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) {
|
|
|
+ if (customPageSize > 0) {
|
|
|
+ this.myParentQuery(customPageNo, customPageSize);
|
|
|
+ } else {
|
|
|
+ this.myParentQuery(this.pageNo, this.defaultPageSize);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _cleanRefresherCompleteTimeout() {
|
|
|
+ if (this.refresherCompleteTimeout) {
|
|
|
+ clearTimeout(this.refresherCompleteTimeout);
|
|
|
+ this.refresherCompleteTimeout = null;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _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
|
|
|
+ };
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ _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() {
|
|
|
+ this.nRefresherLoading = true;
|
|
|
+ if (this.nShowRefresherReveal) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.refresherStatus = Enum.RefresherStatus.Loading;
|
|
|
+ this._doRefresherLoad();
|
|
|
+ },
|
|
|
+
|
|
|
+ _nOnPullingdown(e) {
|
|
|
+ if (this.refresherStatus === Enum.RefresherStatus.Loading || (this.isIos && !this.nListIsDragging)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const viewHeight = e.viewHeight;
|
|
|
+ const pullingDistance = e.pullingDistance;
|
|
|
+ if (pullingDistance >= viewHeight) {
|
|
|
+ this.refresherStatus = Enum.RefresherStatus.PullToRefresh;
|
|
|
+ } else {
|
|
|
+ this.refresherStatus = Enum.RefresherStatus.Default;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ _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) {
|
|
|
+ this._cleanRefresherCompleteTimeout();
|
|
|
+ if (!this.finalShowRefresherWhenReload) {
|
|
|
+ setTimeout(() => {
|
|
|
+ this.refresherStatus = Enum.RefresherStatus.Default;
|
|
|
+ }, commonDelayTime);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const stackCount = this.refresherRevealStackCount;
|
|
|
+ if (height === 0 && checkStack) {
|
|
|
+ this.refresherRevealStackCount--;
|
|
|
+ if (stackCount > 1) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.refresherStatus = Enum.RefresherStatus.Default;
|
|
|
+ }
|
|
|
+ if (stackCount > 1) {
|
|
|
+ this.refresherStatus = Enum.RefresherStatus.Loading;
|
|
|
+ }
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
+ },
|
|
|
+};
|