java-mall-app/components/QS-tabs-wxs-list/js/pageDemand.js
2024-11-01 16:35:40 +08:00

239 lines
7.6 KiB
JavaScript

"use strict";
import _app from './config.js';
const statusObj = {
getMore: {
text: '获取更多',
code: 1
},
noMore: {
text: '没有更多了',
code: 2
},
loading: {
text: '数据加载中',
code: 3
},
noData: {
text: '暂无数据',
code: 4
},
errFail: {
text: '数据错误',
code: 5
},
errCatch: {
text: '加载数据失败, 点击重试',
code: 6
}
}
function doPageDemand(obj) { //分页加载获取数据方法, 页面使用call绑定this使用
_app.log('进入getAndSetPageData方法');
let _this = this;
let {
getDataFn, //获取数据的方法
success, //接口访问成功回调
successEnd, //成功回调结束时
fail, //接口访问失败回调
sendDataName, //携带数据字段名称
pageNumName, //携带数据中的页数字段名称
pageSizeName, //携带数据中的条数字段名称
checkLastPageMode, //判断是否是最后一页的逻辑标识, 用于逻辑判断, 目前默认有两个参数 size: 判断条数, page: 判断页数, 默认为size
newDatafields, //接口访问成功后获取列表数据字段名称, 可用. 链式获取
dataLastPageName, //接口访问成功后数据中的最大页数字段名称, 可用. 链式获取
sizeName, //接口访问成功后数据中条数字段名称, 可用. 链式获取
setName, //页面中列表数据字段名称, 如果在页面中分别有两个或两个以上列表使用该js, 则页面中需区分传入, 否则可以忽略
statusTextName, //页面中列表状态字段名称, 如果在页面中分别有两个或两个以上列表使用该js, 则页面中需区分传入, 否则可以忽略
lastPageName, //页面中最后一页字段名称, 如果在页面中分别有两个或两个以上列表使用该js, 则页面中需区分传入, 否则可以忽略
waitingName, //页面中获取数据等待字段名称, 如果在页面中分别有两个或两个以上列表使用该js, 则页面中需区分传入, 否则可以忽略
refresh, //刷新标识, 若为true则会将携带数据中的页数重置为1
force, //强制标识, 若为true则会忽略等待标识为true时的跳过操作
doEvent, //进入状态判断标识, 若为true则会进入判断列表status而进行相应操作
noDataText, //访问接口后若数据长度为0则可自定义为空时文字
refreshClear //刷新时是否清空数据
} = obj;
waitingName = waitingName || 'getting';
if (_this[waitingName] && !force) return; //节流
if (doEvent) { //判断列表状态
if(_this[statusTextName].code !== undefined) {
switch (_this[statusTextName].code) {
case 1:
break;
case 6:
break;
default:
return;
break;
}
}
}
//初始化默认值
sendDataName = sendDataName || 'sendData';
setName = setName || 'list';
newDatafields = newDatafields || 'list';
dataLastPageName = dataLastPageName || 'lastPage';
lastPageName = lastPageName || dataLastPageName;
statusTextName = statusTextName || 'statusText';
pageNumName = pageNumName || 'pageNum';
pageSizeName = pageSizeName || 'pageSize';
sizeName = sizeName || 'size';
checkLastPageMode = checkLastPageMode || 'lastPage';
if (refresh) { //刷新, 重置为第一页
_this[sendDataName][pageNumName] = 1;
_this[lastPageName] = undefined; //重置最后一页状态
if(refreshClear) { //刷新是否清空数据
_this[setName] = [];
}
}
//浅拷贝携带数据对象
const sendData = { ..._this[sendDataName]
};
_app.log('sendData: ' + JSON.stringify(sendData));
_app.log('_this[lastPageName]:' + _this[lastPageName]);
// 当前最后一页
let lastPage = _this[lastPageName];
_app.log('lastPage:' + lastPage);
// 获取携带数据中的页数
const sendDataPageNum = Number(sendData[pageNumName]);
// 判断是否为最后一页
if (typeof(lastPage) === 'number' && lastPage >= 0) {
_app.log('sendData[pageNumName]:' + sendDataPageNum);
if (sendDataPageNum > lastPage) {
_this[statusTextName] = getStatus('noMore');
return;
}
}
let status; //声明 列表状态变量
// 改变状态为 访问接口中
_this[statusTextName] = getStatus('loading');
// 等待标识
_this[waitingName] = true;
_app.log('准备访问接口:' + JSON.stringify(sendData));
// 访问接口
getDataFn({ ...sendData
}).then(res => {
if(success && typeof success == 'function') success(res);
_app.log('page.js获取数据成功:' + JSON.stringify(res));
// 获取列表数据
const newList = getField(res, newDatafields);
// 判断是否存在并判断长度
const bl = (newList && newList.length > 0);
// 判断是否是第一页
if (sendDataPageNum === 1) {
// 第一页
if (bl) {
// 存在数据, 直接赋值
_this[setName] = newList;
_app.log('pageJS: 赋值了: setName:' + setName + ' ,newDatafields:' + newDatafields + ' ,data:' + JSON.stringify(newList))
} else {
// 不存在设置为空数组
_this[setName] = [];
}
} else {
// 不是第一页
if (bl) {
// 存在数据, 使用concat新增数据
_this[setName] = _this[setName].concat(newList);
}
}
// 获取数据中的最后一页
let dataLastPageNum = getField(res, dataLastPageName);
if (dataLastPageNum !== undefined) {
dataLastPageNum = Number(dataLastPageNum);
// 获取数据中的条数
const sizeNum = Number(getField(res, sizeName));
// 获取最后一页
let lastPageNum;
switch (checkLastPageMode) {
case 'size':
lastPageNum = Math.ceil(sizeNum / Number(sendData[pageSizeName]));
break;
case 'page':
lastPageNum = dataLastPageNum;
break;
default:
if (res[sizeName] !== undefined) {
lastPageNum = Math.ceil(sizeNum / Number(sendData[pageSizeName]));
} else {
lastPageNum = dataLastPageNum;
}
break;
}
_app.log('lastPageNum:' + lastPageNum);
// 赋值最后一页
_this[lastPageName] = lastPageNum;
_app.log('_this[lastPageName]:' + _this[lastPageName]);
// 判断最后一页与是否存在数据, 赋值相应状态
if (sendDataPageNum <= 1 && lastPageNum <= 1 && !bl) { //第一页并无数据
_app.log('noDataText:' + noDataText);
status = getStatus('noData', noDataText||'');
_app.log('没有数据,status:' + JSON.stringify(status));
} else if (sendDataPageNum < lastPageNum) { //可获取更多
status = getStatus('getMore');
} else { //没有更多了
status = getStatus('noMore');
}
} else {
status = getStatus('errFail');
}
// 页面携带数据页数加1
++_this[sendDataName][pageNumName];
// 赋值状态
_this[statusTextName] = status;
// 重置等待标识
_this[waitingName] = false;
if(successEnd && typeof successEnd == 'function') successEnd(res);
}).catch(err => {
_app.log('pageJS异常:' + JSON.stringify(err));
// 获取数据异常,可点击重新加载
_this[statusTextName] = { ...statusObj.errCatch
};
// 重置等待标识
_this[waitingName] = false;
if (fail && typeof fail === 'function') fail(err);
})
}
function getStatus(type, text) {
const obj = {...statusObj[type]};
obj.text = text||obj.text||'';
return obj;
}
function getField(data, fields, pattern) { //递归获取指定字段数据
if (!fields) return data;
var arr = fields.split('.');
var key = arr.shift();
var value = data[key];
if(value==null){
return value;
}else if(arr.length==0){
if(!pattern)return value;
var type = Object.prototype.toString.call(value).replace('[object ','').replace(']','');
if(pattern===true){
return type;
}else if(!pattern){
return value;
}else{
return type==pattern;
}
}
var result = getField(value,arr.join('.'),pattern);
return result;
}
module.exports = {
doPageDemand
}