UNPKG

@deepjs/uni-pull

Version:

封装 uni-app 上拉加载 && 下拉刷新

160 lines (131 loc) 6.08 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PullUp = PullUp; exports.pullUp = void 0; var _qs = require("@deepjs/qs"); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var defaultConfig = { pageNum: 'pageNum', pageLimit: 'pageLimit', needPagination: 'needPagination', totalPage: 'totalPage', hasNext: 'hasNext', lastId: 'lastId' }; function PullUp() { var _listParamsDefault; var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var opts = _objectSpread(_objectSpread({}, defaultConfig), options); // 默认参数 var listParamsDefault = (_listParamsDefault = {}, _defineProperty(_listParamsDefault, "".concat(opts.pageNum), 1), _defineProperty(_listParamsDefault, "".concat(opts.pageLimit), 10), _defineProperty(_listParamsDefault, "".concat(opts.needPagination), 1), _defineProperty(_listParamsDefault, "".concat(opts.lastId), ''), _listParamsDefault); return { data: function data() { return { listData: [], listStatus: 'more', // 接口参数 listParams: {// [`${PAGE_LIMIT}`]: 10, // 可以修改默认值 } }; }, // 上拉触底事件 默认 onReachBottomDistance=50 onReachBottom: function onReachBottom(e) { this.loadNextPage(); }, methods: { // // 上拉触底事件 默认 onReachBottomDistance=50 // onScrollToLower(e) { // this.loadNextPage() // }, resetList: function resetList() { this.listStatus = 'more'; this.listData = []; this.listParams["".concat(opts.pageNum)] = 1; this.listParams["".concat(opts.lastId)] = ''; }, loadNextPage: function loadNextPage() { var _this = this; // 加载下一页 if (this.listStatus !== 'more') return; // 正在 loading 或 over 了 if (this.requestTask && this.requestTask.abort) { this.requestTask.abort(); } this.listStatus = 'loading'; this.listParams = _objectSpread(_objectSpread({ hideLoading: true }, listParamsDefault), this.listParams); this.requestTask = this.listModel(this.listParams, function (res) { _this.requestTask = null; _this.dealListRes(res); }, function (err) { _this.requestTask = null; _this.listStatus = 'more'; return _this.dealListErr(err); }); }, // 统一数据调用,需外部覆写,也可以这里 mock 数据 listModel: function listModel(params, success, err) {// setTimeout(() => { // success(mockData); // }, 1000); // const [...rest] = arguments // return requestTask // return this.$api.xxx.apply(this, rest) // return requestTask }, dealListErr: function dealListErr(err) {}, dealListRes: function dealListRes(res) { // 处理完去渲染数据后再将 loading 状态变更掉 // 预处理数据, if (typeof this.preDealListRes === 'function') { res = this.preDealListRes(res); if (!res) { this.$showToast('preDealListRes 必须要返回 res'); return; } } var _deepCopy = (0, _qs.deepCopy)(res), _deepCopy$data = _deepCopy.data, data = _deepCopy$data === void 0 ? {} : _deepCopy$data; var _data$list = data.list, list = _data$list === void 0 ? [] : _data$list; var pageNum = this.listParams["".concat(opts.pageNum)] || 1; var hasMore = data["".concat(opts.hasNext)] || data["".concat(opts.totalPage)] > pageNum; // TIP: 不允许存在这种情况,还有下页数据,但当前页却条数不足 console.log('hasMore', hasMore); if (typeof this.dealList === 'function') { list = this.dealList(list); if (!list) { this.$showToast('dealList 必须要返回 list'); return; } } this.listData = this.listData.concat((0, _qs.deepCopy)(list)); // console.log(this.listData); if (hasMore) { var len = list.length; if (len) { var last = list[len - 1] || {}; this.listParams["".concat(opts.lastId)] = data["".concat(opts.lastId)] || last.id || ''; } this.listParams["".concat(opts.pageNum)]++; this.listStatus = 'more'; } else { this.listStatus = 'over'; } // 最后无需数据参数 if (typeof this.afterDealListRes === 'function') { this.afterDealListRes(); } // TODO: aliapp $emit 一个非绑定的事件,会报错 这会影响其他组件的 change或 input 的$emit 操作吗? // this.$emit('list:complete'); } } }; } var pullUp = PullUp({ pageNum: 'page_num', pageLimit: 'page_limit', needPagination: 'need_pagination', totalPage: 'total_page', hasNext: 'has_next', lastId: 'last_id' }); exports.pullUp = pullUp;