UNPKG

@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
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 };