공식 문서에서는 이렇게 설명 하고 있습니다.
Fetcher은 SWR의 아주 핵심적인 API입니다. 여기의 fetcher는 SWR의 key를 받고 데이터를 반환하는 비동기 함수입니다.
// fetcher.ts
import axios from 'axios'
export const fetcher = (url:string, token:string = "", params = {}) => {
if (typeof token === "object") {
return axios.get(url, { params }).then((res) => res.data.data);
}
return axios
.get(url, { params, headers: token ? { authorization: `Bearer ${token}` } : {} })
.then((res) => res.data.data);
};
function Article() {
const { data } = useSWR('/api/article')
return <h1>{data.title}</h1>
}
function Article() {
const { data } = useSWR(['/api/userInfo',Token])
return <h1>{data.userName}</h1>
}
or
function Article() {
const { data } = useSWR(['/api/userInfo',{ page:1 } ])
return <h1>{data.userName}</h1>
}
or
function Article() {
const { data } = useSWR(['/api/userInfo',Token,{ page:1 } ])
return <h1>{data.userName}</h1>
}
이전 포스팅에서 전역 설정에 fallback 옵션을 넣어주었습니다 넣어준 이유에 대해 알아보도록 하겠습니다
🙅 before
// page.tsx
const Page: NextPage = ({ newsData }) => {
const { data } = useSWR('/api/news', fetcher, { fallbackData: newsData })
....
};
export const getServerSideProps: GetServerSideProps = async () => {
const newsData = await fetcher(`/api/news`);
return {
props: {
newsData
},
},
};
};
👍 SWR은 전역 캐시를 사용해 모든 컴포넌트 사이에 데이터를 저장하고 공유합니다 그렇기 때문에 아래와 같은 코드로 작성이 가능합니다.
🙆 after
// page.tsx
const Page = () =>{
return (
<div>
<NewsItem/>
<PostItem/>
</div>
)
}
export const getServerSideProps: GetServerSideProps = async () => {
const [newsData, postData] = await Promise.all([
fetcher(`/api/news`),
fetcher(`/api/post`),
])
return {
props: {
fallback:{
['/api/news']:newsData,
['/api/post']:postData
}
},
};
};
<// NewsItem.tsx
const NewsItem = () =>{
const { data:newsData } = useSWR('/api/news')
return <>{newsData.title}</>
}
// PostItem.tsx
const NewsItem = () =>{
const { data:postData } = useSWR('/api/post')
return <>{postData.title}</>
}
위의 데이터는 캐시된 데이터이고
useSWRConfig hook을 사용해 전역 설정과 mutate 및 cache 를 얻을 수 있습니다.
SWR을 사용하면서 정말 편하다고 생각한 부분입니다
이전에 설명 한데로 SWR은 전역 캐시를 사용해 모든 컴포넌트 사이에 데이터를 저장하고 공유합니다
아래의 코드를 봤을때 당연히 Avatar 컴포넌트가 5개가 렌더링 되고 네트워크 요청이 5번을 할꺼 같지만 SWR 에서는 동일한 SWR Key를 갖고 있으므로 거의 동시에 렌더링 되며
단 한 번의 네트워크 요청만 발생합니다.
function Avatar () {
const { data, error } = useSWR('/api/user', fetcher)
if (error) return <Error />
if (!data) return <Spinner />
return <img src={data.avatar_url} />
}
function App () {
return <>
<Avatar />
<Avatar />
<Avatar />
<Avatar />
<Avatar />
</>
}
다음 포스팅에서는 typescript,인증, custom hooks, 인피니티 로딩을 다루어 보도록 하겠습니다.