first commit
This commit is contained in:
732
components/z-paging/js/modules/data-handle.js
Normal file
732
components/z-paging/js/modules/data-handle.js
Normal file
@@ -0,0 +1,732 @@
|
||||
// [z-paging]数据处理模块
|
||||
import u from '.././z-paging-utils'
|
||||
import c from '.././z-paging-constant'
|
||||
import Enum from '.././z-paging-enum'
|
||||
import interceptor from '../z-paging-interceptor'
|
||||
|
||||
const ZPData = {
|
||||
props: {
|
||||
//自定义初始的pageNo,默认为1
|
||||
defaultPageNo: {
|
||||
type: [Number, String],
|
||||
default: u.gc('defaultPageNo', 1),
|
||||
observer: function(newVal, oldVal) {
|
||||
this.pageNo = newVal;
|
||||
},
|
||||
},
|
||||
//自定义pageSize,默认为10
|
||||
defaultPageSize: {
|
||||
type: [Number, String],
|
||||
default: u.gc('defaultPageSize', 10),
|
||||
validator: (value) => {
|
||||
if(value <= 0) u.consoleErr('default-page-size必须大于0!');
|
||||
return value > 0;
|
||||
}
|
||||
},
|
||||
//为保证数据一致,设置当前tab切换时的标识key,并在complete中传递相同key,若二者不一致,则complete将不会生效
|
||||
dataKey: {
|
||||
type: [Number, String, Object],
|
||||
default: function() {
|
||||
return u.gc('dataKey', null);
|
||||
},
|
||||
},
|
||||
//自动注入的list名,可自动修改父view(包含ref="paging")中对应name的list值
|
||||
autowireListName: {
|
||||
type: String,
|
||||
default: function() {
|
||||
return u.gc('autowireListName', '');
|
||||
},
|
||||
},
|
||||
//自动注入的query名,可自动调用父view(包含ref="paging")中的query方法
|
||||
autowireQueryName: {
|
||||
type: String,
|
||||
default: function() {
|
||||
return u.gc('autowireQueryName', '');
|
||||
},
|
||||
},
|
||||
//z-paging mounted后自动调用reload方法(mounted后自动调用接口),默认为是。请使用简便写法:auto
|
||||
mountedAutoCallReload: {
|
||||
type: Boolean,
|
||||
default: u.gc('mountedAutoCallReload', true)
|
||||
},
|
||||
//z-paging mounted后自动调用reload方法(mounted后自动调用接口),默认为是
|
||||
auto: {
|
||||
type: Boolean,
|
||||
default: u.gc('auto', true)
|
||||
},
|
||||
//用户下拉刷新时是否触发reload方法,默认为是
|
||||
reloadWhenRefresh: {
|
||||
type: Boolean,
|
||||
default: u.gc('reloadWhenRefresh', true)
|
||||
},
|
||||
//reload时自动滚动到顶部,默认为是
|
||||
autoScrollToTopWhenReload: {
|
||||
type: Boolean,
|
||||
default: u.gc('autoScrollToTopWhenReload', true)
|
||||
},
|
||||
//reload时立即自动清空原list,默认为是,若立即自动清空,则在reload之后、请求回调之前页面是空白的
|
||||
autoCleanListWhenReload: {
|
||||
type: Boolean,
|
||||
default: u.gc('autoCleanListWhenReload', true)
|
||||
},
|
||||
//列表刷新时自动显示下拉刷新view,默认为否
|
||||
showRefresherWhenReload: {
|
||||
type: Boolean,
|
||||
default: u.gc('showRefresherWhenReload', false)
|
||||
},
|
||||
//列表刷新时自动显示加载更多view,且为加载中状态,默认为否
|
||||
showLoadingMoreWhenReload: {
|
||||
type: Boolean,
|
||||
default: u.gc('showLoadingMoreWhenReload', false)
|
||||
},
|
||||
//组件created时立即触发reload(可解决一些情况下先看到页面再看到loading的问题),auto为true时有效。为否时将在mounted+nextTick后触发reload,默认为否
|
||||
createdReload: {
|
||||
type: Boolean,
|
||||
default: u.gc('createdReload', false)
|
||||
},
|
||||
//本地分页时上拉加载更多延迟时间,单位为毫秒,默认200毫秒
|
||||
localPagingLoadingTime: {
|
||||
type: [Number, String],
|
||||
default: u.gc('localPagingLoadingTime', 200)
|
||||
},
|
||||
//当分页未满一屏时,是否自动加载更多,默认为否(nvue无效)
|
||||
insideMore: {
|
||||
type: Boolean,
|
||||
default: u.gc('insideMore', false)
|
||||
},
|
||||
//使用聊天记录模式,默认为否
|
||||
useChatRecordMode: {
|
||||
type: Boolean,
|
||||
default: u.gc('useChatRecordMode', false)
|
||||
},
|
||||
//自动拼接complete中传过来的数组(使用聊天记录模式时无效)
|
||||
concat: {
|
||||
type: Boolean,
|
||||
default: u.gc('concat', true)
|
||||
},
|
||||
//父组件v-model所绑定的list的值
|
||||
value: {
|
||||
type: Array,
|
||||
default: function() {
|
||||
return [];
|
||||
}
|
||||
},
|
||||
// #ifdef VUE3
|
||||
modelValue: {
|
||||
type: Array,
|
||||
default: function() {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
// #endif
|
||||
},
|
||||
data (){
|
||||
return {
|
||||
currentData: [],
|
||||
totalData: [],
|
||||
realTotalData: [],
|
||||
totalLocalPagingList: [],
|
||||
pageNo: 1,
|
||||
isLocalPaging: false,
|
||||
isAddedData: false,
|
||||
isTotalChangeFromAddData: false,
|
||||
privateConcat: true,
|
||||
myParentQuery: -1,
|
||||
firstPageLoaded: false,
|
||||
pagingLoaded: false,
|
||||
loaded: false,
|
||||
isUserReload: true,
|
||||
fromEmptyViewReload: false,
|
||||
listRendering: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
pageSize() {
|
||||
return this.defaultPageSize;
|
||||
},
|
||||
finalConcat() {
|
||||
return this.concat && this.privateConcat;
|
||||
},
|
||||
isFirstPage() {
|
||||
return this.pageNo === this.defaultPageNo;
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
totalData(newVal, oldVal) {
|
||||
this._totalDataChange(newVal, oldVal);
|
||||
},
|
||||
currentData(newVal, oldVal) {
|
||||
this._currentDataChange(newVal, oldVal);
|
||||
},
|
||||
useChatRecordMode(newVal, oldVal) {
|
||||
if (newVal) {
|
||||
this.nLoadingMoreFixedHeight = false;
|
||||
}
|
||||
},
|
||||
value: {
|
||||
handler(newVal) {
|
||||
this.realTotalData = newVal;
|
||||
},
|
||||
immediate: true
|
||||
},
|
||||
// #ifdef VUE3
|
||||
modelValue: {
|
||||
handler(newVal) {
|
||||
this.realTotalData = newVal;
|
||||
},
|
||||
immediate: true
|
||||
}
|
||||
// #endif
|
||||
},
|
||||
methods: {
|
||||
//请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为是否成功(默认是是)
|
||||
complete(data, success = true) {
|
||||
this.customNoMore = -1;
|
||||
this.addData(data, success);
|
||||
},
|
||||
//简写,与complete完全相同
|
||||
end(data, success = true) {
|
||||
this.complete(data, success);
|
||||
},
|
||||
//【保证数据一致】请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为dataKey,需与:data-key绑定的一致,第三个参数为是否成功(默认为是)
|
||||
completeByKey(data, dataKey = null, success = true) {
|
||||
if (dataKey !== null && this.dataKey !== null && dataKey !== this.dataKey) {
|
||||
if (this.isFirstPage) {
|
||||
this.endRefresh();
|
||||
}
|
||||
return;
|
||||
}
|
||||
this.customNoMore = -1;
|
||||
this.addData(data, success);
|
||||
},
|
||||
//简写,与completeByKey完全相同
|
||||
endByKey(data, dataKey = null, success = true) {
|
||||
this.completeByKey(data, dataKey, success);
|
||||
},
|
||||
//【通过totalCount判断是否有更多数据】请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为totalCount(列表总数),第三个参数为是否成功(默认为是)
|
||||
completeByTotalCount(data, totalCount, success = true) {
|
||||
if (totalCount == 'undefined') {
|
||||
this.customNoMore = -1;
|
||||
} else {
|
||||
let dataTypeRes = this._checkDataType(data, success, false);
|
||||
data = dataTypeRes.data;
|
||||
success = dataTypeRes.success;
|
||||
if (totalCount >= 0 && success) {
|
||||
this.$nextTick(() => {
|
||||
let nomore = true;
|
||||
let realTotalDataCount = this.realTotalData.length;
|
||||
if (this.pageNo == this.defaultPageNo) {
|
||||
realTotalDataCount = 0;
|
||||
}
|
||||
let exceedCount = realTotalDataCount + data.length - totalCount;
|
||||
if (exceedCount >= 0) {
|
||||
nomore = false;
|
||||
exceedCount = this.defaultPageSize - exceedCount;
|
||||
if (exceedCount > 0 && exceedCount < data.length) {
|
||||
data = data.splice(0, exceedCount);
|
||||
}
|
||||
}
|
||||
this.completeByNoMore(data, nomore, success);
|
||||
})
|
||||
return;
|
||||
}
|
||||
}
|
||||
this.addData(data, success);
|
||||
},
|
||||
//简写,与completeByTotalCount完全相同
|
||||
completeByTotal(data, totalCount, success = true) {
|
||||
this.completeByTotalCount(data, totalCount, success);
|
||||
},
|
||||
//简写,与completeByTotalCount完全相同
|
||||
endByTotalCount(data, totalCount, success = true) {
|
||||
this.completeByTotalCount(data, totalCount, success);
|
||||
},
|
||||
//简写,与completeByTotalCount完全相同
|
||||
endByTotal(data, totalCount, success = true) {
|
||||
this.completeByTotalCount(data, totalCount, success);
|
||||
},
|
||||
//【自行判断是否有更多数据】请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为是否有更多数据,第三个参数为是否成功(默认是是)
|
||||
completeByNoMore(data, nomore, success = true) {
|
||||
if (nomore != 'undefined') {
|
||||
this.customNoMore = nomore == true ? 1 : 0;
|
||||
}
|
||||
this.addData(data, success);
|
||||
},
|
||||
//简写,与completeByNoMore完全相同
|
||||
endByNoMore(data, nomore, success = true) {
|
||||
this.completeByNoMore(data, nomore, success);
|
||||
},
|
||||
//与上方complete方法功能一致,新版本中设置服务端回调数组请使用complete方法
|
||||
addData(data, success = true) {
|
||||
if (!this.fromCompleteEmit) {
|
||||
this.disabledCompleteEmit = true;
|
||||
this.fromCompleteEmit = false;
|
||||
}
|
||||
const currentTimeStamp = u.getTime();
|
||||
let addDataDalay = 0;
|
||||
const disTime = currentTimeStamp - this.requestTimeStamp;
|
||||
let minDelay = this.minDelay;
|
||||
if(this.isFirstPage && this.finalShowRefresherWhenReload){
|
||||
minDelay = Math.max(400,minDelay);
|
||||
}
|
||||
if(this.requestTimeStamp > 0 && disTime < minDelay){
|
||||
addDataDalay = minDelay - disTime;
|
||||
}
|
||||
this.$nextTick(() => {
|
||||
let delay = this.delay > 0 ? this.delay : addDataDalay;
|
||||
setTimeout(() => {
|
||||
this._addData(data, success, false);
|
||||
}, delay)
|
||||
})
|
||||
},
|
||||
//从顶部添加数据,不会影响分页的pageNo和pageSize
|
||||
addDataFromTop(data, toTop = true, toTopWithAnimate = true) {
|
||||
let dataType = Object.prototype.toString.call(data);
|
||||
if (dataType !== '[object Array]') {
|
||||
data = [data];
|
||||
}
|
||||
this.totalData = [...data, ...this.totalData];
|
||||
if (toTop) {
|
||||
setTimeout(() => {
|
||||
this._scrollToTop(toTopWithAnimate);
|
||||
}, c.delayTime)
|
||||
}
|
||||
},
|
||||
//重新设置列表数据,调用此方法不会影响pageNo和pageSize,也不会触发请求。适用场景:当需要删除列表中某一项时,将删除对应项后的数组通过此方法传递给z-paging。(当出现类似的需要修改列表数组的场景时,请使用此方法,请勿直接修改page中:list.sync绑定的数组)
|
||||
resetTotalData(data) {
|
||||
if (data == undefined) {
|
||||
if (this.showConsoleError) {
|
||||
u.consoleErr('方法resetTotalData参数缺失!');
|
||||
}
|
||||
return;
|
||||
}
|
||||
this.isTotalChangeFromAddData = true;
|
||||
let dataType = Object.prototype.toString.call(data);
|
||||
if (dataType !== '[object Array]') {
|
||||
data = [data];
|
||||
}
|
||||
this.totalData = data;
|
||||
},
|
||||
//添加聊天记录
|
||||
addChatRecordData(data, toBottom = true, toBottomWithAnimate = true) {
|
||||
let dataType = Object.prototype.toString.call(data);
|
||||
if (dataType !== '[object Array]') {
|
||||
data = [data];
|
||||
}
|
||||
if (!this.useChatRecordMode) return;
|
||||
this.isTotalChangeFromAddData = true;
|
||||
//#ifndef APP-NVUE
|
||||
this.totalData = [...this.totalData, ...data];
|
||||
//#endif
|
||||
//#ifdef APP-NVUE
|
||||
this.totalData = this.nIsFirstPageAndNoMore ? [...this.totalData, ...data] : [...data, ...this.totalData];
|
||||
//#endif
|
||||
if (toBottom) {
|
||||
setTimeout(() => {
|
||||
//#ifndef APP-NVUE
|
||||
this._scrollToBottom(toBottomWithAnimate);
|
||||
//#endif
|
||||
//#ifdef APP-NVUE
|
||||
if (this.nIsFirstPageAndNoMore) {
|
||||
this._scrollToBottom(toBottomWithAnimate);
|
||||
} else {
|
||||
this._scrollToTop(toBottomWithAnimate);
|
||||
}
|
||||
//#endif
|
||||
}, c.delayTime)
|
||||
}
|
||||
},
|
||||
//设置本地分页数据,请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging作分页处理(若调用了此方法,则上拉加载更多时内部会自动分页,不会触发@query所绑定的事件)
|
||||
setLocalPaging(data, success = true) {
|
||||
this.isLocalPaging = true;
|
||||
this.$nextTick(() => {
|
||||
this._addData(data, success, true);
|
||||
})
|
||||
},
|
||||
//重新加载分页数据,pageNo会恢复为默认值,相当于下拉刷新的效果(animate为true时会展示下拉刷新动画,默认为false)
|
||||
reload(animate = this.showRefresherWhenReload) {
|
||||
if (animate) {
|
||||
this.privateShowRefresherWhenReload = animate;
|
||||
this.isUserPullDown = true;
|
||||
}
|
||||
this._preReload(animate, false);
|
||||
},
|
||||
//刷新列表数据,pageNo和pageSize不会重置,列表数据会重新从服务端获取。必须保证@query绑定的方法中的pageNo和pageSize和传给服务端的一致
|
||||
refresh() {
|
||||
if(!this.realTotalData.length){
|
||||
this.reload();
|
||||
return;
|
||||
}
|
||||
const disPageNo = this.pageNo - this.defaultPageNo + 1;
|
||||
if (disPageNo >= 1) {
|
||||
this.loading = true;
|
||||
this.privateConcat = false;
|
||||
const totalPageSize = disPageNo * this.pageSize;
|
||||
this._emitQuery(this.defaultPageNo, totalPageSize, Enum.QueryFrom.Refresh);
|
||||
this._callMyParentQuery(this.defaultPageNo, totalPageSize);
|
||||
}
|
||||
},
|
||||
//清空分页数据
|
||||
clean() {
|
||||
this._reload(true);
|
||||
this._addData([], true, false);
|
||||
},
|
||||
//清空分页数据
|
||||
clear() {
|
||||
this.clean();
|
||||
},
|
||||
//手动触发滚动到顶部加载更多,聊天记录模式时有效
|
||||
doChatRecordLoadMore() {
|
||||
this.useChatRecordMode && this._onLoadingMore('click');
|
||||
},
|
||||
//reload之前的一些处理
|
||||
_preReload(animate = this.showRefresherWhenReload, isFromMounted = true) {
|
||||
this.isUserReload = true;
|
||||
this.loadingType = Enum.LoadingType.Refresher;
|
||||
if (animate) {
|
||||
this.privateShowRefresherWhenReload = animate;
|
||||
// #ifndef APP-NVUE
|
||||
if (this.useCustomRefresher) {
|
||||
this._doRefresherRefreshAnimate();
|
||||
} else {
|
||||
this.refresherTriggered = true;
|
||||
}
|
||||
// #endif
|
||||
// #ifdef APP-NVUE
|
||||
this.refresherStatus = Enum.Refresher.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);
|
||||
this._doRefresherLoad(false);
|
||||
});
|
||||
}, 10)
|
||||
return;
|
||||
// #endif
|
||||
} else {
|
||||
this._refresherEnd(false, false, false, false);
|
||||
}
|
||||
this._reload(false, isFromMounted);
|
||||
},
|
||||
//重新加载分页数据
|
||||
_reload(isClean = false, isFromMounted = false, isUserPullDown = false) {
|
||||
this.isAddedData = false;
|
||||
this.cacheScrollNodeHeight = -1;
|
||||
this.insideOfPaging = -1;
|
||||
this.pageNo = this.defaultPageNo;
|
||||
this._cleanRefresherEndTimeout();
|
||||
!this.privateShowRefresherWhenReload && !isClean && this._startLoading(true);
|
||||
this.firstPageLoaded = true;
|
||||
this.isTotalChangeFromAddData = false;
|
||||
this.totalData = [];
|
||||
if (!isClean) {
|
||||
this._emitQuery(this.pageNo, this.defaultPageSize, isUserPullDown ? Enum.QueryFrom.UserPullDown : Enum.QueryFrom.Reload);
|
||||
let delay = 0;
|
||||
// #ifdef MP-TOUTIAO
|
||||
delay = 5;
|
||||
// #endif
|
||||
setTimeout(() => {
|
||||
this._callMyParentQuery();
|
||||
}, delay)
|
||||
if (!isFromMounted && this.autoScrollToTopWhenReload) {
|
||||
let checkedNRefresherLoading = true;
|
||||
// #ifdef APP-NVUE
|
||||
checkedNRefresherLoading = !this.nRefresherLoading;
|
||||
// #endif
|
||||
if (checkedNRefresherLoading) {
|
||||
this._scrollToTop(false);
|
||||
}
|
||||
}
|
||||
// #ifndef APP-NVUE
|
||||
if (!this.usePageScroll && this.useChatRecordMode) {
|
||||
if (this.showConsoleError) {
|
||||
u.consoleWarn('使用聊天记录模式时,建议使用页面滚动,可将usePageScroll设置为true以启用页面滚动!!');
|
||||
}
|
||||
}
|
||||
// #endif
|
||||
}
|
||||
this.$nextTick(() => {
|
||||
// #ifdef APP-NVUE
|
||||
this.nShowBottom = this.realTotalData.length > 0;
|
||||
// #endif
|
||||
})
|
||||
},
|
||||
//处理服务端返回的数组
|
||||
_addData(data, success, isLocal) {
|
||||
this.isAddedData = true;
|
||||
this.fromEmptyViewReload = false;
|
||||
this.isTotalChangeFromAddData = true;
|
||||
this.refresherTriggered = false;
|
||||
!this.useCustomRefresher && uni.stopPullDownRefresh();
|
||||
// #ifdef APP-NVUE
|
||||
this.usePageScroll && uni.stopPullDownRefresh();
|
||||
// #endif
|
||||
const tempIsUserPullDown = this.isUserPullDown;
|
||||
if (this.showRefresherUpdateTime && this.isFirstPage) {
|
||||
u.setRefesrherTime(u.getTime(), this.refresherUpdateTimeKey);
|
||||
this.tempLanguageUpdateKey = u.getTime();
|
||||
this.$refs.refresh && this.$refs.refresh.updateTime();
|
||||
}
|
||||
if (tempIsUserPullDown && this.isFirstPage) {
|
||||
this.isUserPullDown = false;
|
||||
}
|
||||
let dataTypeRes = this._checkDataType(data, success, isLocal);
|
||||
data = dataTypeRes.data;
|
||||
success = dataTypeRes.success;
|
||||
let delayTime = c.delayTime;
|
||||
// #ifdef APP-NVUE
|
||||
if (this.useChatRecordMode) delayTime = 0;
|
||||
// #endif
|
||||
this.loadingForNow = false;
|
||||
setTimeout(() => {
|
||||
this.pagingLoaded = true;
|
||||
this.$nextTick(()=>{
|
||||
this._refresherEnd(delayTime > 0, true, tempIsUserPullDown);
|
||||
})
|
||||
}, delayTime)
|
||||
if (this.isFirstPage) {
|
||||
this.isLoadFailed = !success;
|
||||
}
|
||||
if (success) {
|
||||
if (!(this.privateConcat === false && this.loadingStatus === Enum.More.NoMore)) {
|
||||
this.loadingStatus = Enum.More.Default;
|
||||
}
|
||||
if (isLocal) {
|
||||
this.totalLocalPagingList = data;
|
||||
this._localPagingQueryList(this.defaultPageNo, this.defaultPageSize, 0, (res) => {
|
||||
this.complete(res);
|
||||
})
|
||||
} else {
|
||||
let dataChangeDelayTime = 0;
|
||||
// #ifdef APP-NVUE
|
||||
if (this.privateShowRefresherWhenReload && this.finalNvueListIs === 'waterfall') {
|
||||
dataChangeDelayTime = 150;
|
||||
}
|
||||
// #endif
|
||||
setTimeout(() => {
|
||||
this._currentDataChange(data, this.currentData);
|
||||
}, dataChangeDelayTime)
|
||||
}
|
||||
} else {
|
||||
this._currentDataChange(data, this.currentData);
|
||||
this.loadingStatus = Enum.More.Fail;
|
||||
if (this.loadingType === Enum.LoadingType.LoadingMore) {
|
||||
this.pageNo--;
|
||||
}
|
||||
}
|
||||
},
|
||||
//所有数据改变时调用
|
||||
_totalDataChange(newVal, oldVal, eventThrow=true) {
|
||||
if ((!this.isUserReload || !this.autoCleanListWhenReload) && this.firstPageLoaded && !newVal.length && oldVal.length) {
|
||||
return;
|
||||
}
|
||||
this._doCheckScrollViewShouldFullHeight(newVal);
|
||||
if(!this.realTotalData.length && !newVal.length){
|
||||
eventThrow = false;
|
||||
}
|
||||
this.realTotalData = newVal;
|
||||
if (eventThrow) {
|
||||
this.$emit('input', newVal);
|
||||
// #ifdef VUE3
|
||||
this.$emit('update:modelValue', newVal);
|
||||
// #endif
|
||||
this.$emit('update:list', newVal);
|
||||
this.$emit('listChange', newVal);
|
||||
this._callMyParentList(newVal);
|
||||
}
|
||||
this.firstPageLoaded = false;
|
||||
this.isTotalChangeFromAddData = false;
|
||||
this.$nextTick(() => {
|
||||
setTimeout(()=>{
|
||||
this._getNodeClientRect('.zp-paging-container-content').then((res) => {
|
||||
if (res) {
|
||||
this.$emit('contentHeightChanged', res[0].height);
|
||||
}
|
||||
});
|
||||
},this.isIos?100:300)
|
||||
// #ifdef APP-NVUE
|
||||
if (this.useChatRecordMode && this.nIsFirstPageAndNoMore && this.isFirstPage && !this.nFirstPageAndNoMoreChecked) {
|
||||
this.nFirstPageAndNoMoreChecked = true;
|
||||
this._scrollToBottom(false);
|
||||
}
|
||||
// #endif
|
||||
})
|
||||
},
|
||||
//当前数据改变时调用
|
||||
_currentDataChange(newVal, oldVal) {
|
||||
newVal = [...newVal];
|
||||
this.listRendering = true;
|
||||
this.$nextTick(() => {
|
||||
setTimeout(() => {
|
||||
this.listRendering = false;
|
||||
},50)
|
||||
})
|
||||
// #ifndef APP-NVUE
|
||||
if (this.finalUseVirtualList) {
|
||||
this._setCellIndex(newVal,this.totalData.length === 0);
|
||||
}
|
||||
this.useChatRecordMode && newVal.reverse();
|
||||
// #endif
|
||||
if (this.isFirstPage && this.finalConcat) {
|
||||
this.totalData = [];
|
||||
}
|
||||
if (this.customNoMore !== -1) {
|
||||
if (this.customNoMore === 0 || !newVal.length) {
|
||||
this.loadingStatus = Enum.More.NoMore;
|
||||
}
|
||||
} else {
|
||||
if (!newVal.length || (newVal.length && newVal.length < this.defaultPageSize)) {
|
||||
this.loadingStatus = Enum.More.NoMore;
|
||||
}
|
||||
}
|
||||
if (!this.totalData.length) {
|
||||
if (this.finalConcat) {
|
||||
// #ifdef APP-NVUE
|
||||
if(this.useChatRecordMode && this.isFirstPage && this.loadingStatus === Enum.More.NoMore){
|
||||
newVal.reverse();
|
||||
}
|
||||
// #endif
|
||||
this.totalData = newVal;
|
||||
}
|
||||
if (this.useChatRecordMode) {
|
||||
// #ifndef APP-NVUE
|
||||
this.$nextTick(() => {
|
||||
this._scrollToBottom(false);
|
||||
})
|
||||
// #endif
|
||||
}
|
||||
} else {
|
||||
if (this.useChatRecordMode) {
|
||||
// #ifdef APP-NVUE
|
||||
this.totalData = [...this.totalData, ...newVal];
|
||||
// #endif
|
||||
//#ifndef APP-NVUE
|
||||
const idIndex = newVal.length;
|
||||
let idIndexStr = `z-paging-${idIndex}`;
|
||||
this.totalData = [...newVal, ...this.totalData];
|
||||
if (this.pageNo !== this.defaultPageNo) {
|
||||
this.privateScrollWithAnimation = 0;
|
||||
let delayTime = 200;
|
||||
this.$emit('update:chatIndex', idIndex);
|
||||
setTimeout(() => {
|
||||
this._scrollIntoView(idIndexStr, 30 + this.cacheTopHeight, false, () => {
|
||||
this.$emit('update:chatIndex', 0);
|
||||
});
|
||||
}, this.usePageScroll ? 0 : delayTime)
|
||||
} else {
|
||||
this.$nextTick(() => {
|
||||
this._scrollToBottom(false);
|
||||
})
|
||||
}
|
||||
//#endif
|
||||
|
||||
} else {
|
||||
if (this.finalConcat) {
|
||||
const currentScrollTop = this.oldScrollTop;
|
||||
this.totalData = [...this.totalData, ...newVal];
|
||||
// #ifdef MP-WEIXIN
|
||||
if (!this.isIos && !this.refresherOnly && !this.usePageScroll && newVal.length) {
|
||||
this.loadingMoreTimeStamp = u.getTime();
|
||||
this.$nextTick(()=>{
|
||||
this.scrollToY(currentScrollTop);
|
||||
})
|
||||
}
|
||||
// #endif
|
||||
} else {
|
||||
this.totalData = newVal;
|
||||
}
|
||||
}
|
||||
}
|
||||
this.privateConcat = true;
|
||||
},
|
||||
//本地分页请求
|
||||
_localPagingQueryList(pageNo, pageSize, localPagingLoadingTime, callback) {
|
||||
pageNo = parseInt(pageNo);
|
||||
pageSize = parseInt(pageSize);
|
||||
if (pageNo < 0 || pageSize <= 0) {
|
||||
this._localPagingQueryResult(callback, [], localPagingLoadingTime);
|
||||
return;
|
||||
}
|
||||
pageNo = Math.max(1,pageNo);
|
||||
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)
|
||||
},
|
||||
//修改父view的list
|
||||
_callMyParentList(newVal) {
|
||||
if (this.autowireListName.length) {
|
||||
const myParent = u.getParent(this.$parent);
|
||||
if (myParent && myParent[this.autowireListName]) {
|
||||
myParent[this.autowireListName] = newVal;
|
||||
}
|
||||
}
|
||||
},
|
||||
//调用父view的query
|
||||
_callMyParentQuery(customPageNo = 0, customPageSize = 0) {
|
||||
if (this.autowireQueryName) {
|
||||
if (this.myParentQuery === -1) {
|
||||
const myParent = u.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);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
//发射query事件
|
||||
_emitQuery(pageNo, pageSize, from){
|
||||
this.requestTimeStamp = u.getTime();
|
||||
this.$emit('query', ...interceptor._handleQuery(pageNo, pageSize, from));
|
||||
},
|
||||
//检查complete data的类型
|
||||
_checkDataType(data, success, isLocal) {
|
||||
const dataType = Object.prototype.toString.call(data);
|
||||
if (dataType === '[object Boolean]') {
|
||||
success = data;
|
||||
data = [];
|
||||
} else if (dataType === '[object Null]') {
|
||||
data = [];
|
||||
} else if (dataType !== '[object Array]') {
|
||||
data = [];
|
||||
let methodStr = isLocal ? 'setLocalPaging' : 'complete';
|
||||
if (dataType !== '[object Undefined]') {
|
||||
if (this.showConsoleError) {
|
||||
u.consoleErr(`${methodStr}参数类型不正确,第一个参数类型必须为Array!`);
|
||||
}
|
||||
}
|
||||
}
|
||||
return {data,success};
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
export default ZPData;
|
||||
Reference in New Issue
Block a user