1. Recoil ์ด๋?
- React ์ ํ๋ฆฌ์ผ์ด์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Facebook (๋ฉํ)์์ ๊ฐ๋ฐํ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, Atom ์ด๋ผ๋ ๋จ์๋ก ์ํ๋ฅผ ์ ์ํ๊ณ ์ด๋ฅผ ์ด์ฉํด ์ปดํฌ๋ํธ ์ฌ์ด์์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ฉฐ ์ํ๋ฅผ ์ ๋ฐ์ดํธํจ
- Recoil ๊ณต์๋ฌธ์ https://recoiljs.org/ko/
1.1 ์ Recoil๋ฅผ ์ฌ์ฉํ๋๊ฐ?
- ๊ฐํธํ ์ํ๊ด๋ฆฌ: ๊ฐํธํ๊ฒ ์ํ๋ฅผ ์ ์ํ๊ณ ๊ด๋ฆฌํ ์ ์์ (์ ์ญ ์ํ)
- ์ต์ ํ๋ ๋ฆฌ๋ ๋๋ง: ๋ด๋ถ์ ์ผ๋ก ์ต์ ํ๋์ด ํ์ํ ๊ฒฝ์ฐ์๋ง ๋ฆฌ๋ ๋๋ง
- ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉ: ๋ณต์กํ ์ํ ๊ด๋ฆฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ค๋ฃจ๋๋ฐ ์ ํฉํจ
1.2 ์ค์น ๋ฐ ์ธํ
(1) ์ค์น
1yarn add recoil
(2) ๋ฃจํธ ์ปดํฌ๋ํธ์ RecoilRoot ์ธํ
1import React from 'react'2import { RecoilRoot } from 'recoil'34function App() {5return (6<RecoilRoot>7<div>์ฑ ๋ด์ฉ</div>8</RecoilRoot>9)10}
(3) Atom ๋ฐ Selector ํจ์ ์ ์
1export const counterState = atom({2key: 'counterState', // ๊ณ ์ ํ ํค๊ฐ3default: 0, // ์ด๊ธฐ๊ฐ4})
2. Recoil ๊ธฐ๋ฅ
2.1 Atom
1import { atom } from 'recoil'23export const counterState = atom({4key: 'counterState', // ๊ณ ์ ํ ํค๊ฐ5default: 0, // ์ด๊ธฐ๊ฐ6})
Atom: Recoil์์ ์ํ๋ฅผ ๋ํ๋ด๋ ๋จ์ผ ๋จ์ํ ์ํ ์กฐ๊ฐ- ์ ์ญ ์ํ๋ฅผ ์ ์ํ๊ณ ๊ด๋ฆฌํ ์ ์์
- ํด๋น ์ํ๋ฅผ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์ฝ๊ฑฐ๋ ์ธ ์ ์์
2.2 Selector
1import { Selector } from 'recoil'2import { counterState } from './atoms'34export const squaredCounterState = selector({5key: 'squaredCounterState', // ๊ณ ์ ํ ํค๊ฐ6get: ({ get }) => {7const counter = get(counterState)8return counter ** 29},10})
Selector: Recoil์์ ํ์๋ ์ํ- ๋ค๋ฅธ atom ๋๋ selector์ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๊ณ์ฐ๋ ๊ฐ์ ์ ๊ณต
- ๋น๋๊ธฐ ์์ ์ด๋ ๋ณต์กํ ๊ณ์ฐ์ ์ฌ์ฉ
3. Recoil Hooks
3.1 useRecoilState
- atom ๋๋ selector์ ์ํ์ ํด๋น ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์๋ฅผ ๋ฐํ
1import React from 'react'2import { useRecoilState } from 'recoil'3import { counterState } from './atoms'45export default function Counter() {6// counterState๋ฅผ ์ฌ์ฉํด ์ ์ญ ์ํ๊ฐ counter๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉ7const [counter, setCounter] = useRecoilState(counterState)89const increment = () => setCounter(counter + 1)10const decrement = () => setCounter(counter - 1)1112return (13<div>14<h1>์นด์ดํธ : {counter}</h1>15<button onClick={increment}>์ฆ๊ฐ</button>16<button onClick={decrement}>๊ฐ์</button>17</div>18)19}
3.2 useRecoilValue
- atom ๋๋ selector์ ํ์ฌ ์ํ ๊ฐ์ ๋ฐํ
1import React from 'react'2import { useRecoilValue } from 'recoil'3import { squardCounterState } from './selectors'45export default function SquaredCounter() {6// useRecoilValue ํ ์ผ๋ก ๊ณ์ฐ๋๋ selector ๊ฐ ๊ฐ์ ธ์์ ์ฌ์ฉ7const squaredCounter = useRecoilValue(squardCounterState)8return <p>์ ๊ณฑ ์นด์ดํธ ๊ฐ : {counter}</p>9}
3.3 useSetRecoilState
- atom ๋๋ selector์ ํ์ฌ ์ํ ๊ฐ์ ๋ฐํ
1import React from 'react'2import { useRecoilValue } from 'recoil'3import { counterState } from './atoms'45export default function ResetCounter() {6// useSetRecoilState ํ ์ผ๋ก ์นด์ดํฐ ๊ฐ์ ์ํ๋ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ (setter ํจ์)7const setCounter = useSetRecoilState(counterState)8const reset = () => setCounter(0)9return <button onClick={reset}>์ด๊ธฐํ</button>10}
3.4 useResetRecoilState
- atom ๋๋ selector์ ํ์ฌ ์ํ ๊ฐ์ ๋ฐํ
1import React from 'react'2import { useResetRecoilState } from 'recoil'3import { counterState } from './atoms'45export default function ResetCounter() {6// useResetRecoilState ํ ์ผ๋ก counter ๊ฐ ์ด๊ธฐํ7const resetCounter = useResetRecoilState(counterState)8const reset = () => resetCounter()9return <button onClick={reset}>์ด๊ธฐํ</button>10}
4. ์ฐธ๊ณ
- Recoil ๊ณต์๋ฌธ์ : https://recoiljs.org/ko/