-
Notifications
You must be signed in to change notification settings - Fork 1
SWR
-
api ํต์ ๊ธฐ๋ฐ ์ ์ญ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
-
SWR
์ ์บ์๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ ํ, fetch ์์ฒญ(์ฌ๊ฒ์ฆ)์ ํ๊ณ , ์ต์ข ์ ์ผ๋ก ์ต์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ ๋ต -
useSWR
ํจ์๋ ์ฒซ๋ฒ์งธ ์ธ์๋ก ํต์ ์ฃผ์, ํฌ๋ฒ์งธ ์ธ์๋ก ํต์ ํจ์๋ฅผ ๋ฐ์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ฒซ๋ฒ์งธ ๊ฐ์ฒด๋ก, ์๋ฌ๋ฅผ ๋๋ฒ์งธ ๊ฐ์ฒด๋ก ์ ๋ฌํจ.const {data, error, isValidating, mutate} = useSWR(key, fetcher, options)
- params
-
key
: ์๋ณ์, api ์ฃผ์๊ฐ ์ฃผ๋ก ๋ค์ด๊ฐ -
fetcher
: Promise data๋ฅผ ๋ฐํํ๋ ํจ์ -
option
: swr ์ต์ ์ค์ ๊ฐ์ฒด
-
- return value
-
data
: fetcher๋ก๋ถํฐ ๋ฐํ๋ ๋ฐ์ดํฐ -
error
: fetcher ์๋ฌ ๊ฐ์ฒด -
isValidating
: boolean fetching ์ค์ผ๋ ? -
mutate
: ์บ์ฑ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ ํจ์
-
- params
yarn add swr
or
npm i swr
-
์ฝ๋ฐฑ ์ธ์๋ก ์ฌ์ฉํ
fetcher
ํจ์๋ฅผ ์ ์ํ๋คconst fetcher = (url) => axios.get(url).then((res) => res.data);
-
useSWR
์ ์ํฌํธ ํ๊ณ ํจ์ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ฉด ๋๋ค.import useSWR from 'swr' const fetcher = (url) => axios.get(url).then((res) => res.data); function Profile() { const { data, error } = useSWR('/api/user', fetcher) if (error) return <div>failed to load</div> if (!data) return <div>loading...</div> return <div>hello {data.name}!</div> }
-
์ปค์คํ ํ ์ ๋ง๋ค์ด์ ์ฌ์ฉํด๋ ๋๋ค.
function useUser (id) { const { data, error } = useSWR(`/api/user/${id}`, fetcher) return { user: data, isLoading: !error && !data, isError: error } }
- ์ปค์คํ ํ ์ ์ ์ํด์ state๋ฅผ props์ ์ ๋ฌํ ํ์ ์์ด ํ์ํ ๊ณณ์์ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ค.
- ์ฌ๋ฌ๋ฒ ์ฌ์ฌ์ฉํด๋ ์์ฒญ์ ํ๋ฒ์ผ๋ก ํต์ผ๋๋ค.
import useSWR, { useSWRConfig } from 'swr'
const App () => {
const { mutate } = useSWRConfig()
mutate('/api') //ํด๋น ํค๋ฅผ ๊ฐ์ง swr์ ๊ฐฑ์ ์์ฒญ
///...return
}
- ์บ์๋ฅผ ์ ๋ฐ์ดํธ ํ ๋ ์ฌ์ฉ.
-
mutate(key)
๋ฅผ ํธ์ถํ์ฌ ๋์ผํ ํค๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธSWR hook
์๊ฒ ๊ฐฑ์ ๋ฉ์์ง๋ฅผ ์ ์ญ์ผ๋ก ๋ธ๋ก๋์บ์คํ ํ ์ ์๋ค.
ํฌ์คํธ ์์ฒญ ์
- ๊ธฐ๋ณธ์ ์ผ๋ก swr์ get์ ํนํ๋์ด์๋ค. ๋ฐ๋ผ์ post๋ง ์ฌ์ฉํ ๋๋ ํฐ ์ด์ ์ด ์๋ค๊ณ ํ๋ค.
- ํ์ง๋ง get์ผ๋ก ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธ ํ ๋ mutate๋ฅผ ์ฌ์ฉํ๋ฉด ํจ๊ณผ์ ์ด๋ค
mutate(key, postData, false)
-
ํฌ์คํธ ์์ฒญ์ ๋ณด๋ผ ๋, ์๋ฒ์์ ๋ฐ์์ค์ง ์๊ณ ๋ก์ปฌ์ ๋จผ์ ์ ๋ฐ์ดํธ ์ํฌ ์ ์์ (์ธ๋ฒ์งธ ์ธ์๋ฅผ false)๋ก ๋๋ฉด ๊ฐ๋ฅ.
-
useSWR
์ ๋ฐํ๋mutate
๋กkey
๋ฅผ ํฌํจํ์ง ์๊ณ ์ฌ์ฉํ ์ ์์import useSWR from 'swr' function Profile () { const { data, mutate } = useSWR('/api/user', fetcher) return ( <div> <h1>My name is {data.name}.</h1> <button onClick={async () => { const newName = data.name.toUpperCase() // ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด API๋ก ์์ฒญ์ ์ ์ก await requestUpdateUsername(newName) // ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ์ ๋ฐ์ดํธํ๊ณ ๊ฐฑ์ (refetch) // ๋ ธํธ: ๋ฏธ๋ฆฌ ๋ฐ์ธ๋ฉ ๋์์ผ๋ฏ๋ก useSWR์ ๋ฎคํ ์ดํธ๋ฅผ ์ฌ์ฉํ ๋๋ key๊ฐ ์๊ตฌ๋์ง ์์ mutate({ ...data, name: newName }) }}>Uppercase my name!</button> </div> ) }
-
๐ฉ post api ์ get api๊ฐ ๋ค๋ฅผ ๋
-
mutate
๋ฅผfalse
๋ก ํ ๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์ ๋ฐ์ดํธ -
axios
์์ฒญ์ผ๋ก ๋ฐ์ดํฐ post - ๋ค์
mutate
์คํํด์ ์ฑํฌ ์ ๋ฐ์ดํธ
-
-
๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ ์ฌ์ดํธ๊ฐ ํฌ์ปค์ฑ๋๋ฉด ์บ์๋ฅผ ์ ๋ฐ์ดํธํจ
-
์ต์ ์
refreshInterval
์ ์ค์ ํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์useSWR('/api/todos', fetcher, { refreshInterval: 1000 })