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.

76 lines (72 loc) 2.21 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); 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]); const mergeConf = useMemo(() => { let base = { revalidateOnFocus: false }; if (swrConfig) { base = swrConfig; } if (simple) { base = { ...SIMPLE_CONF, ...base }; } return base; }, [simple, swrConfig]); const { data, isLoading, error, mutate } = useSwr__default(mergeKey, async (data) => { return req(data[1]); }, mergeConf); const onSearch = useCallback((value) => { setSearch(value); setPage(defaultPage); }, [defaultPage]); if (paging) { return { key: mergeKey, data, error, isLoading, refresh: mutate, pageInfo, searchInfo, onSearch, setPage, setSearch, }; } else { return { key: mergeKey, data, error, isLoading, refresh: mutate, }; } } export { DEFAULT_PAGE, SIMPLE_CONF, useSwrData as default };