QueryClientConsumer
<QueryClientConsumer/>
๋ ์คํ ๊ธฐ๋ฅ์ด๋ฏ๋ก ์ด ์ธํฐํ์ด์ค๋ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
React hook์ ์ ์ฝ์ ํผํด JSX ์์์ useQueryClient
๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ์ปดํฌ๋ํธ์
๋๋ค.
์ฌ์ฉ์ ํ๊ฒฝ์ ์ค์น๋์ด ์๋ @tanstack/react-query
์ ๋ฒ์ ์ ๋ฐ๋ผ props ์ธํฐํ์ด์ค๊ฐ ๋ค๋ฆ
๋๋ค. @tanstack/react-query
v4 ๋ฒ์ ์ด ์ค์น๋์ด ์๋ค๋ฉด props.context
๋ฅผ ์ฌ์ฉํ๊ณ , v5๋ฒ์ ์ด๋ฉด props.queryClient
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
props๋ฅผ ํตํด QueryClient๊ฐ ์ ๋ฌํ์ง ์๋๋ค๋ฉด, ์ปดํฌ๋ํธ์ ๊ฐ์ฅ ๊ฐ๊น์ด QueryClient๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
import { useSuspenseQuery } from '@tanstack/react-query'
import { QueryClientConsumer } from '@suspensive/react-query'
const PostsPage = () => {
const { data: posts } = useSuspenseQuery({
queryKey: ['posts'],
queryFn: () => getPosts(),
})
return (
<>
<QueryClientConsumer>
{(queryClient) => (
<button
onClick={() =>
queryClient.invalidateQueries({
queryKey: ['posts'],
})
}
>
Posts refresh
</button>
)}
</QueryClientConsumer>
{posts.map((post) => (
<Post key={post.id} {...post} />
))}
</>
)
}
props.queryClient (@tanstack/react-query v5)
@tanstack/react-query
v5๊ฐ ์ค์น๋ ํ๊ฒฝ์ด๋ผ๋ฉด props.queryClient
์ฌ์ฉํ์ฌ ์ํ๋ QueryClient์ ์ ๊ทผํ ์ ์์ต๋๋ค.
import { QueryClient } from '@tanstack/react-query'
import { QueryClientConsumer } from '@suspensive/react-query'
const queryClient = new QueryClient()
const Example = () => {
return (
{/* 5๏ธโฃ @tanstack/react-query v5์ ์ฌ์ฉํ์ ๋ค๋ฉด props.queryClient๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. */}
<QueryClientConsumer queryClient={queryClient}>
{(queryClient) => (<>{/* props.queryClient๋ก ์ ๋ฌ๋ QueryClinet๋ฅผ ์ฌ์ฉํฉ๋๋ค. */}</>)}
</QueryClientConsumer>
)
}
props.context (@tanstack/react-query v4)
@tanstack/react-query
v4๊ฐ ์ค์น๋ ํ๊ฒฝ์ด๋ผ๋ฉด props.context
๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ QueryClient์ ์ ๊ทผํ ์ ์์ต๋๋ค.
import { createContext } from 'react'
import { QueryClient } from '@tanstack/react-query'
import { QueryClientConsumer } from '@suspensive/react-query'
const queryClient = new QueryClient()
const queryClientContext = createContext<QueryClient>(queryClient)
const Example = () => {
return (
{/* 4๏ธโฃ @tanstack/react-query v4์ ์ฌ์ฉํ์ ๋ค๋ฉด props.context ์ฌ์ฉํ ์ ์์ต๋๋ค.*/}
<QueryClientConsumer context={queryClientContext}>
{(queryClient) => (<>{/* props.queryClient๋ก ์ ๋ฌ๋ QueryClinet๋ฅผ ์ฌ์ฉํฉ๋๋ค. */}</>)}
</QueryClientConsumer>
)
}
๋๊ธฐ: ๋ฆฌ์กํธ ํ ์ ํจ์ํ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํจ
React์ ํ
(useQueryClient)์ ํจ์ํ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ ๊ฑฐ์ ํด๋์ค ์ปดํฌ๋ํธ์์๋ ์ฟผ๋ฆฌ ๋ฌดํจํ(invalidateQueries)์ ๊ฐ์ ๊ธฐ๋ฅ์ด ํ์ํ ๋๊ฐ ์์ต๋๋ค. ์ด๋ <QueryClientConsumer/>
๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์ ์ฝ์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
import React from 'react'
import { QueryClientConsumer } from '@suspensive/react-query'
class PostsRefreshButton extends React.Component {
render() {
return (
{/* โ
๋ ๊ฑฐ์ ํด๋์ค ์ปดํฌ๋ํธ์์ queryClient๋ฅผ ์ ๊ทผํ์ฌ ์ฟผ๋ฆฌ ๋ฌดํจํ(invalidateQueries)๋ฅผ ํ ์ ์์ต๋๋ค. */}
<QueryClientConsumer>
{(queryClient) => (
<button
onClick={() =>
queryClient.invalidateQueries({
queryKey: ['posts'],
})
}
>
Posts refresh
</button>
)}
</QueryClientConsumer>
)
}
}
export default PostsRefreshButton