: 데이터 가져오기를 위한 React Hooks
먼저 캐시로부터 데이터를 반환한 후, fetch 요청을 하고, 최종적으로 최신화된 데이터를 가져오는 전략
SWR를 사용하면, 컴포넌트는 지속적이며 자동으로 데이터 업데이트 스트림을 받게 됨
UI가 항상 빠르고 반응적이게 반응하게 됨
전체적으로는 React Query가 더 😊 BUT 패키지 크기가 SWR의 3배가 넘기 때문에, 간단한 어플을 만들기에는 SWR이 good!!!!!!!
SWR 설치
npm i swr 또는
npm i swr --legacy-peer-deps
https://swr.vercel.app/ko/docs/getting-started
const fetcher = (...args) => fetch(...args).then(res => res.json());
: useSWR hook은 key 문자열과 fetcher 함수를 받음
import axios from 'axios';
const axiosFetcher = async (url) => {
const response = await axios.get(url);
return response.data;
};
const { data } = useSWR('/api/data', axiosFetcher);
import useSWR from 'swr'
function Profile() {
const { data, error, isLoading } = useSWR('/api/user', fetcher)
if (error) return <div>failed to load</div>
if (isLoading) return <div>loading...</div>
return <div>hello {data.name}!</div>
}
import useSWR from "swr";
// 이렇게 한 곳에 함수로 만들어서 모아두고 export할수도 있음
export const useData( ) => {
const {data, error, isLoading} = useSWR("api/users..", fetcher);
return data;
}
useSWR은 자체로 useEffect처럼 동작하기 때문에, useEffect의 하위에서는 사용할 수 XX
아래에 있는 2개의 코드는 동일하게 작동하는 2개의 코드.
// useEffect를 사용한 코드
import React from 'react';
import { useState, useEffect } from 'react';
import { getData } from './lib/api';
const App = () => {
const [data, setData] = useState(null);
useEffect(() => {
const data = getData();
setData(data);
});
return <div>{data.name}</div>;
}
export default App;
//useSWR를 사용한 코드
import useSWR from 'swr';
import { fetch } from './lib/api';
const App = () => {
const { data } = useSWR('api/data/', fetch);
return <div>{data.name}</div>;
}
export default App;