对常见的请求场景进行一个封装,可以跨组件的管理请求状态,并且支持多个框架版本。
由于V5版本只有纯英文文档,因此在进行阅读后记录它的基本用法,哪天用到了可以快速使用。
本篇记录的是react-query
的用法,其它版本大差不差。
const queryClient = new QueryClient()
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<QueryClientProvider client={queryClient}>
<App/>
</QueryClientProvider>
</React.StrictMode>,
)
实例化QueryClient
类,此处可传递全局配置。
使用QueryClientProvider
组件注入后,所有子组件就可以通过useQueryClient
来进行跨组件操作。
query
一般用于get
请求的场景,页面加载就可以发起请求。
const [enabled, setEnabled] = useState(false)
const { isPending, isFetching, isLoading, data, refetch } = useQuery({
// 这里可以放不同的数据类型,一般可以将组件的state放进去
queryKey: ['useQuery'],
// 这里会传入一些参数
queryFn: ({ queryKey }) => axios().then((response) => {
// 这里需要自行处理response得到的数据,最后就会放到data中
return response
}),
enabled,
placeholderData: keepPreviousData,
initialData: initialData
})
queryFn
为请求函数,无论是使用fetch
还是axios
只要是返回Promise
都可以使用。在调用queryFn
时,queryKey
会作为参数上下文中的queryKey
传给queryFn
。 当需要将请求状态更改为error
状态时可以在Promise
内返回reject
或throw new Error
。
queryKey
可以用于在其它地方通过queryClient
调用或通过其定义的queryKey
在变更时重新发起请求,queryKey
的数组内支持数字,字符串以及可序列化的对象。
useQuery
会返回请求的状态以及数据源,这里需要注意isPending
和isFetching
的区别,isPending
和devtools/network
的pending
不同, 它代表的是数据的获取状态,isFetching
才是请求的状态。isLoading
是isPending && isFetching
的计算值,一般用于惰性发起请求。
enabled
为组件的state
,然后将state
放入queryKey
当中,也可以从useQuery
内使用refetch
来手动发起请求,不过官方并不推荐手动发起。placeholderData
属性,可以使用自带的keepPreviousData
或自定义返回值,这样在切换分页时,在新数据获取之前,可以保留旧的数据。 这个属性可以理解为分页场景下的placeholder
。initialData
,数据类型要和data
内的相同,支持直接定义或函数返回。const { data, fetchNextPage, fetchPreviousPage, hasNextPage } = useInfiniteQuery({
queryKey: ['infinite'],
queryFn: ({ pageParam }) => axios(pageParam).then((res) => res.data),
initialPageParam: {
page: 1,
size: 10
},
getNextPageParam: (lastPage, allPage, pageParam) => {
// 在此返回下一页的pageParam
},
getPreviousPageParam: () => {
// 用法与getNextPageParam一致,但不是必填项
}
})
queryKey
与queryFn
和useQuery
的用法基本一致,不过queryFn
中多了一个pageParam
参数可供使用。
使用useInfiniteQuery
时必须传入initialPageParam
和getNextPageParam
。initialPageParam
为发起请求的初始值,一般为页码和页数或只有页码。 getNextPageParam
用于获取下一页数据(如调用了fetchNextPage
)时的pageParam
,如果后端提供了下一页
的字段,那么可以直接使用,若未提供则需要手动对页数进行+1
。
hasNextPage
是getNextPageParam
返回值,不为undefined
或null
时都为true
。
对应NextPage
,useInfiniteQuery
也提供了getPreviousPageParam
以及其它和NextPage
相似的功能,不过需要注意的是,getPreviousPageParam
不是获取上一页,而是从头部插入数据。
在data
上和useQuery
不同,data
则变为一个对象,包含page
和pageParams
,前者是请求获取的数据源,后者则是每次Next
或Previous
所得到的pageParam
需要注意的是这里的page
是由每一次获取到的数据一起拼接而成,是一个二维或多维数组,在使用时需注意使用方式。
{
data?.pages.map((group, index) => (
<Fragment key={index}>
{/*这里才是请求到的数据*/}
{group.map((item) => <p key={item.value}>{item.label}</p>)}
</Fragment>
))
}
常用于post
场景,需手动发起。
const { mutateAsync, mutate, isPending, isSuccess } = useMutation({
mutationKey: ['useMutation'],
mutationFn: (params) => axios(params),
onMutate: () => {},
onSuccess: () => {},
onError: () => {},
onSettled: () => {}
})
mutationKey
与mutationFn
和query
中的用法基本一致,mutationFn
的参数来自于mutate
或mutateAsync
传递的值。
useMutation
具有独特的回调事件,onMutate
可以理解为发起请求前需要进行的操作,其余三个回调事件可以对应理解为Promise
中的then
,catch
,finally
。
mutate
与mutateAsync
的使用方法一致,区别是若想触发useMutation
上定义的回调之外的其他回调,mutateAsync
可以向使用Promise
那样注册then/catch/finally
, 而mutate
需要作为第二个参数传入其回调事件。
mutate(params, {
onSuccess: () => {},
onError: () => {},
onSettled: () => {}
})
对常见的请求场景进行一个封装,可以跨组件的管理请求状态,并且支持多个框架版本。
由于V5版本只有纯英文文档,因此在进行阅读后记录它的基本用法,哪天用到了可以快速使用。
本篇记录的是react-query
的用法,其它版本大差不差。
const queryClient = new QueryClient()
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<QueryClientProvider client={queryClient}>
<App/>
</QueryClientProvider>
</React.StrictMode>,
)
实例化QueryClient
类,此处可传递全局配置。
使用QueryClientProvider
组件注入后,所有子组件就可以通过useQueryClient
来进行跨组件操作。
query
一般用于get
请求的场景,页面加载就可以发起请求。
const [enabled, setEnabled] = useState(false)
const { isPending, isFetching, isLoading, data, refetch } = useQuery({
// 这里可以放不同的数据类型,一般可以将组件的state放进去
queryKey: ['useQuery'],
// 这里会传入一些参数
queryFn: ({ queryKey }) => axios().then((response) => {
// 这里需要自行处理response得到的数据,最后就会放到data中
return response
}),
enabled,
placeholderData: keepPreviousData,
initialData: initialData
})
queryFn
为请求函数,无论是使用fetch
还是axios
只要是返回Promise
都可以使用。在调用queryFn
时,queryKey
会作为参数上下文中的queryKey
传给queryFn
。 当需要将请求状态更改为error
状态时可以在Promise
内返回reject
或throw new Error
。
queryKey
可以用于在其它地方通过queryClient
调用或通过其定义的queryKey
在变更时重新发起请求,queryKey
的数组内支持数字,字符串以及可序列化的对象。
useQuery
会返回请求的状态以及数据源,这里需要注意isPending
和isFetching
的区别,isPending
和devtools/network
的pending
不同, 它代表的是数据的获取状态,isFetching
才是请求的状态。isLoading
是isPending && isFetching
的计算值,一般用于惰性发起请求。
enabled
为组件的state
,然后将state
放入queryKey
当中,也可以从useQuery
内使用refetch
来手动发起请求,不过官方并不推荐手动发起。placeholderData
属性,可以使用自带的keepPreviousData
或自定义返回值,这样在切换分页时,在新数据获取之前,可以保留旧的数据。 这个属性可以理解为分页场景下的placeholder
。initialData
,数据类型要和data
内的相同,支持直接定义或函数返回。const { data, fetchNextPage, fetchPreviousPage, hasNextPage } = useInfiniteQuery({
queryKey: ['infinite'],
queryFn: ({ pageParam }) => axios(pageParam).then((res) => res.data),
initialPageParam: {
page: 1,
size: 10
},
getNextPageParam: (lastPage, allPage, pageParam) => {
// 在此返回下一页的pageParam
},
getPreviousPageParam: () => {
// 用法与getNextPageParam一致,但不是必填项
}
})
queryKey
与queryFn
和useQuery
的用法基本一致,不过queryFn
中多了一个pageParam
参数可供使用。
使用useInfiniteQuery
时必须传入initialPageParam
和getNextPageParam
。initialPageParam
为发起请求的初始值,一般为页码和页数或只有页码。 getNextPageParam
用于获取下一页数据(如调用了fetchNextPage
)时的pageParam
,如果后端提供了下一页
的字段,那么可以直接使用,若未提供则需要手动对页数进行+1
。
hasNextPage
是getNextPageParam
返回值,不为undefined
或null
时都为true
。
对应NextPage
,useInfiniteQuery
也提供了getPreviousPageParam
以及其它和NextPage
相似的功能,不过需要注意的是,getPreviousPageParam
不是获取上一页,而是从头部插入数据。
在data
上和useQuery
不同,data
则变为一个对象,包含page
和pageParams
,前者是请求获取的数据源,后者则是每次Next
或Previous
所得到的pageParam
需要注意的是这里的page
是由每一次获取到的数据一起拼接而成,是一个二维或多维数组,在使用时需注意使用方式。
{
data?.pages.map((group, index) => (
<Fragment key={index}>
{/*这里才是请求到的数据*/}
{group.map((item) => <p key={item.value}>{item.label}</p>)}
</Fragment>
))
}
常用于post
场景,需手动发起。
const { mutateAsync, mutate, isPending, isSuccess } = useMutation({
mutationKey: ['useMutation'],
mutationFn: (params) => axios(params),
onMutate: () => {},
onSuccess: () => {},
onError: () => {},
onSettled: () => {}
})
mutationKey
与mutationFn
和query
中的用法基本一致,mutationFn
的参数来自于mutate
或mutateAsync
传递的值。
useMutation
具有独特的回调事件,onMutate
可以理解为发起请求前需要进行的操作,其余三个回调事件可以对应理解为Promise
中的then
,catch
,finally
。
mutate
与mutateAsync
的使用方法一致,区别是若想触发useMutation
上定义的回调之外的其他回调,mutateAsync
可以向使用Promise
那样注册then/catch/finally
, 而mutate
需要作为第二个参数传入其回调事件。
mutate(params, {
onSuccess: () => {},
onError: () => {},
onSettled: () => {}
})