tanstack-query์์ useQuery๋ฅผ ์ฌ์ฉํ๋ ๋์ค ์ผ๋ถ ๋ฐ์ดํฐ๋ง ํ์ํ ์ํฉ์ด ๋ฐ์ํ์๋ค. ๊ทธ๋ ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋ง ํ๋ ์ฌ๋ฌ๊ฐ์ง์ ๋ฐฉ๋ฒ๋ค์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
// 1. ํด๋ผ์ด์ธํธ์์ ์ง์ ํํฐ๋ง
const { data } = useQuery({
queryKey: ["items"],
queryFn: getItems
});
const filteredData = data?.filter(item => /* ํํฐ๋ง ์กฐ๊ฑด */);
// 2. ์๋ฒ์ ํํฐ๋ง ์กฐ๊ฑด ์ ๋ฌ
const { data } = useQuery({
queryKey: ["items", filterCondition],
queryFn: ({ queryKey }) => getItems(queryKey[1])
});
// 3. select ์ต์
์ผ๋ก ํํฐ๋ง
const { data } = useQuery({
queryKey: ["items"],
queryFn: getItems,
select: (data) => data.filter(item => /* ํํฐ๋ง ์กฐ๊ฑด */)
});
// 1. ๊ธฐ๋ณธ ๋ผ์ฐํธ
<Route path="/items" element={<ItemList />} />
<Route path="/items/:id" element={<ItemDetail />} />
// 2. ์ค์ฒฉ ๋ผ์ฐํธ (์ถ์ฒ!)
<Route path="/items">
// index routes ๋ฅผ ์ฌ์ฉํ๋ฉด, ์ผ์นํ๋ ๊ฒฝ๋ก๊ฐ ์๋ ๊ฒฝ์ฐ์ ๊ธฐ๋ณธ ํ์ด์ง๋ฅผ ํ์ํ ์ ์์ผ๋ฉฐ, ์ฝ๋์ ๊ฐ๋
์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ๋ ํฅ์๋๋ค.
<Route index element={<ItemList />} />
<Route path=":id" element={<ItemDetail />} />
</Route>
const ProductDetail = () => {
const { id } = useParams();
const { data } = useQuery({
queryKey: ['product', id],
queryFn: () => getProduct(id)
});
if (!data) return <div>๋ก๋ฉ์ค...</div>;
return (
<div>
<h1>{data.name}</h1>
<p>{data.description}</p>
</div>
);
};
| ๋ฐฉ๋ฒ | ํน์ง |
|---|---|
filter() ์ฌ์ฉ | ํด๋ผ์ด์ธํธ์์ ํํฐ๋ง (๊ฐ๋จํ๊ณ ๋น ๋ฆ) |
queryKey ํ์ฉ | ๋ฐฑ์๋์์ ํํฐ๋ง (๋ถํ์ํ ๋ฐ์ดํฐ ์์ฒญ ๋ฐฉ์ง) |
select ํ์ฉ | useQuery์์ ๋ฐ๋ก ํํฐ๋ง (๊น๋ํ ์ฝ๋) |
// ๊ฒ์์ด๋ก ํํฐ๋ง์ด ํ์ํ ๊ฒฝ์ฐ
const SearchResults = () => {
const [searchTerm, setSearchTerm] = useState('');
const { data } = useQuery({
queryKey: ['search', searchTerm],
queryFn: () => searchItems(searchTerm),
enabled: searchTerm.length > 0 // ๊ฒ์์ด๊ฐ ์์ ๋๋ง API ํธ์ถ
});
return (
<div>
<input
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
<div>
{data?.map(item => (
<div key={item.id}>
<Link to={`/items/${item.id}`}>{item.name}</Link>
</div>
))}
</div>
</div>
);
};