UNPKG

vtils

Version:

一个面向业务的 JavaScript/TypeScript 实用程序库。

128 lines (123 loc) 3.29 kB
import { useCallback, useEffect, useRef, useState } from 'react'; import { useLatest } from 'react-use'; /** * 加载服务载荷。 * * @public */ /** * 加载服务结果。 * * @public */ /** * 加载服务。 * * @public */ /** * 加载更多结果。 * * @public */ /** * 数据加载。 * * @public * @param service 数据加载服务 * @param deps 依赖若发生变化则从首页重新加载数据 * @returns 返回结果 */ export function useLoadMore(service, deps) { var _useState = useState([]), data = _useState[0], setData = _useState[1]; var _useState2 = useState(1), pageNumber = _useState2[0], setPageNumber = _useState2[1]; var _useState3 = useState(true), initialLoading = _useState3[0], setInitialLoading = _useState3[1]; var _useState4 = useState(false), incrementalLoading = _useState4[0], setIncrementalLoading = _useState4[1]; var loading = initialLoading || incrementalLoading; var _useState5 = useState(false), noMore = _useState5[0], setNoMore = _useState5[1]; var _useState6 = useState(0), total = _useState6[0], setTotal = _useState6[1]; var firstRef = useRef(true); var latest = useLatest({ service: service, data: data, loading: loading, pageNumber: pageNumber, noMore: noMore }); var load = useCallback(function (nextPageNumber) { return new Promise(function (resolve, reject) { var _latest$current = latest.current, data = _latest$current.data, service = _latest$current.service; var isFirstPage = nextPageNumber === 1; if (isFirstPage) { setData([]); } setInitialLoading(isFirstPage); setIncrementalLoading(!isFirstPage); setPageNumber(nextPageNumber); service({ offset: data.length, pageNumber: nextPageNumber }).then(function (res) { setInitialLoading(false); setIncrementalLoading(false); if (Array.isArray(res)) { setNoMore(res.length === 0); setData(isFirstPage ? res : [].concat(data, res)); } else { setTotal(res.total); var pageData = res.data || res.list || []; setNoMore((isFirstPage ? 0 : data.length) + pageData.length >= res.total); setData(isFirstPage ? pageData : [].concat(data, pageData)); } resolve(); }).catch(reject); }); }, []); var loadMore = useCallback(function () { var _latest$current2 = latest.current, noMore = _latest$current2.noMore, loading = _latest$current2.loading, pageNumber = _latest$current2.pageNumber; if (!noMore && !loading) { return load(pageNumber + 1); } return Promise.resolve(); }, []); var reload = useCallback(function () { var loading = latest.current.loading; if (firstRef.current || !loading) { firstRef.current = false; return load(1); } return Promise.resolve(); }, []); useEffect(function () { reload(); }, deps); return { pageNumber: pageNumber, data: data, total: total, loading: loading, initialLoading: initialLoading, incrementalLoading: incrementalLoading, noMore: noMore, loadMore: loadMore, reload: reload, setData: setData }; }