@wanp/use-swr-data
Version:
use-swr-data is a React hook that simplifies data fetching and caching using SWR (stale-while-revalidate) strategy.
78 lines (74 loc) • 2.63 kB
JavaScript
import { useState, useMemo, useCallback } from 'react';
import useSwr__default from 'swr';
export * from 'swr';
const DEFAULT_PAGE = { pageNum: 1, pageSize: 10 };
const SIMPLE_CONF = {
revalidateOnMount: true,
revalidateOnFocus: false,
revalidateOnReconnect: false,
shouldRetryOnError: false,
dedupingInterval: 500
};
function useSwrData(props) {
const { reqKey, req, params, ready = true, simple = false, paging = false, swrConfig } = props;
const defaultPage = "defaultPage" in props ? props.defaultPage || DEFAULT_PAGE : DEFAULT_PAGE;
const defaultSearch = "defaultSearch" in props ? props.defaultSearch : undefined;
const [pageInfo, setPage] = useState(defaultPage);
const [searchInfo, setSearch] = useState(defaultSearch);
// 合并参数的 key
const mergeKey = useMemo(() => {
if (ready === false) {
return null;
}
let mergeParams = {};
if (paging) {
mergeParams = { ...pageInfo, ...searchInfo, ...params };
}
else {
mergeParams = params;
}
return [reqKey, mergeParams];
}, [pageInfo, paging, params, ready, reqKey, searchInfo]);
// 合并 SWR 配置,优先级: swrConfig > SIMPLE_CONF > defaults
const mergeConf = useMemo(() => {
const defaults = { revalidateOnFocus: false };
const base = simple ? { ...defaults, ...SIMPLE_CONF } : defaults;
return { ...base, ...(swrConfig || {}) };
}, [simple, swrConfig]);
const swrData = useSwr__default(mergeKey, useCallback(async (data) => req(data[1]), [req]), mergeConf);
const onSearch = useCallback((value) => {
setSearch(value);
setPage(defaultPage);
}, [defaultPage]);
const result = useMemo(() => {
const baseResult = {
key: mergeKey,
get data() {
return swrData.data;
},
get error() {
return swrData.error;
},
get isLoading() {
return swrData.isLoading;
},
get isValidating() {
return swrData.isValidating;
},
refresh: swrData.mutate,
};
if (paging) {
return {
...baseResult,
pageInfo,
searchInfo,
onSearch,
setPage,
setSearch,
};
}
return baseResult;
}, [mergeKey, onSearch, pageInfo, paging, searchInfo, swrData]);
return result;
}
export { DEFAULT_PAGE, SIMPLE_CONF, useSwrData as default };