UNPKG

rc-hooks

Version:
108 lines (107 loc) 7.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var react_1 = require("react"); var ut2_1 = require("ut2"); var useAsync_1 = tslib_1.__importDefault(require("../useAsync")); var useUpdateEffect_1 = tslib_1.__importDefault(require("../useUpdateEffect")); /** * 基于 `useAsync` 扩展,用于管理分页的 Hook。 * * @param {Function} asyncFn 异步函数。 * @param {Object} [options] 配置项。 * @param {number} [options.defaultPageSize=10] 默认每页的数量。 * @param {boolean} [options.autoRun=true] 在初始化时自动执行异步函数。如果设置为 `false`,则需要手动调用 `run` 触发执行。默认 `true`。 * @param {*} [options.initialData] 初始化的 `data`。 * @param {boolean} [options.defaultLoading=false] 初始化默认 `loading` 值。默认值等于 `autoRun && !loadingDelay`。 * @param {Array} [options.defaultParams] 如果 `autoRun=true` 自动执行 `run` 的默认参数。 * @param {Array} [options.refreshDeps] 在 `autoRun = true` 时,refreshDeps 变化,会重置 `current` 到第一页,并执行 `run` 方法。 * @param {Function} [options.onBefore] 异步函数执行前触发,参数为 `params`。 * @param {Function} [options.onSuccess] 异步函数 `resolve` 时触发,参数为 `data` 和 `params`。 * @param {Function} [options.onError] 异步函数报错时触发,参数为 `error` 和 `params`。 * @param {string} [options.cacheKey] 缓存的键值。启用缓存机制,异步成功结果将被缓存。如果多个相同 cacheKey 的异步同时触发中,将共享第一个异步结果。 * @param {number} [options.cacheTime=5*60*1000] 缓存时间。单位毫秒。 * @param {boolean} [options.persisted=false] 持久化数据。当有缓存数据时,不再执行异步函数。需要配合 `cacheKey` `cacheTime` 使用。默认 `false`。 * @param {number} [options.loadingDelay] 设置 `loading` 延迟时间,避免闪烁,单位为毫秒。 * @param {number} [options.pollingInterval] 轮询间隔,单位为毫秒。设置后,将进入轮询模式,定时触发 `run`。 * @param {boolean} [options.pollingWhenHidden=true] 在页面隐藏时,是否继续轮询。如果为 `true`,不会停止轮询。如果为 `false`,在页面隐藏时会暂时停止轮询,页面重新显示时继续上次轮询。默认 `true`。 * @param {boolean} [options.refreshOnWindowFocus=false] 在屏幕重新获取焦点或重新显示时,是否重新发起请求。如果为 `false`,不会重新发起请求。如果为 `true`,在屏幕重新聚焦或重新显示时,会重新发起请求。默认 `false`。 * @param {number} [options.focusTimespan=5000] 屏幕重新聚焦,重新发起请求时间间隔。需要配置 `refreshOnWindowFocus` 使用。默认 `5000`。 * @param {number} [options.debounceInterval] 防抖间隔,单位为毫秒,设置后,请求进入防抖模式。 * @param {number} [options.throttleInterval] 节流间隔,单位为毫秒,设置后,请求进入节流模式。 * @returns {Object} * @example * const { data, error, loading, run, params, refresh, pagination, tableProps } = usePagination(asyncFn, options); */ function usePagination(asyncFn, options) { var _a = options || {}, _b = _a.defaultPageSize, defaultPageSize = _b === void 0 ? 10 : _b, _c = _a.refreshDeps, refreshDeps = _c === void 0 ? [] : _c, defaultParamsProp = _a.defaultParams, _d = _a.autoRun, autoRun = _d === void 0 ? true : _d, restOptions = tslib_1.__rest(_a, ["defaultPageSize", "refreshDeps", "defaultParams", "autoRun"]); var defaultParams = (0, react_1.useMemo)(function () { return defaultParamsProp || [{ current: 1, pageSize: defaultPageSize }]; }, [defaultPageSize, defaultParamsProp]); var _e = (0, useAsync_1.default)(asyncFn, tslib_1.__assign({ defaultParams: defaultParams, autoRun: autoRun }, restOptions)), run = _e.run, data = _e.data, params = _e.params, loading = _e.loading, restAsyncReturn = tslib_1.__rest(_e, ["run", "data", "params", "loading"]); var _f = params && params[0] ? params[0] : defaultParams[0], current = _f.current, pageSize = _f.pageSize; var total = (data === null || data === void 0 ? void 0 : data.total) || 0; var changePagination = (0, react_1.useCallback)(function (pagination) { var _a = tslib_1.__read(params), oldParams = _a[0], restParams = _a.slice(1); return run.apply(void 0, [tslib_1.__assign(tslib_1.__assign({}, oldParams), pagination)].concat(restParams)); }, [params, run]); var refresh = (0, react_1.useCallback)(function () { return changePagination({ current: current, pageSize: pageSize }); }, [changePagination, current, pageSize]); var onChange = (0, react_1.useCallback)(function (c, p) { var toCurrent = c <= 0 ? 1 : c; var toPageSize = p <= 0 ? 1 : p; var tempTotalPage = Math.ceil(total / toPageSize); if (toCurrent > tempTotalPage && tempTotalPage > 0) { toCurrent = tempTotalPage; } changePagination({ current: toCurrent, pageSize: toPageSize }); }, [changePagination, total]); var changeCurrent = (0, react_1.useCallback)(function (c) { onChange(c, pageSize); }, [onChange, pageSize]); var changePageSize = (0, react_1.useCallback)(function (p) { onChange(current, p); }, [current, onChange]); var changeTable = (0, react_1.useCallback)(function (pagination, filters, sorter, extra) { changePagination({ current: pagination === null || pagination === void 0 ? void 0 : pagination.current, pageSize: pagination === null || pagination === void 0 ? void 0 : pagination.pageSize, filters: filters, sorter: sorter, extra: extra }); }, [changePagination]); (0, useUpdateEffect_1.default)(function () { if (autoRun && (0, ut2_1.isArray)(refreshDeps) && refreshDeps.length > 0) { changeCurrent(1); } }, refreshDeps); return tslib_1.__assign(tslib_1.__assign({}, restAsyncReturn), { data: data, run: run, refresh: refresh, loading: loading, params: params, /** * 分页数据及操作分页的方法。 */ pagination: { current: current, pageSize: pageSize, total: total, onChange: onChange, changeCurrent: changeCurrent, changePageSize: changePageSize }, /** * 适配 antd Table 组件的数据结构,可以直接用在 antd Table 组件上。 */ tableProps: { dataSource: ((data === null || data === void 0 ? void 0 : data.list) || []), loading: loading, onChange: changeTable, pagination: { total: total, current: current, pageSize: pageSize } } }); } exports.default = usePagination;