๐ ์๋ก์ด ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด๋ณด์
recoil์ react์ ์ํ๊ด๋ฆฌ management์ค ํ๋๋ก ์ํ๊ด๋ฆฌ๋ฅผ ์ ์ญ์ผ๋ก ๊ด๋ฆฌ ํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
์ด ๊ธ์ ์ฝ๋ ๋ ์๋ redux๋ฅผ ํ๋ฒ ์ ๋ ๋ผ๋ ์ ํด๋ณธ ์ฌ๋์ด ์ฝ์ผ๋ฉด ๋์์ด ๋ ๊ฒ์ด๋ค.
recoil์ ์ค์นํ ํ redux์ provider ์ฒ๋ผ RecoilRoot๋ ๊ฑธ import ํ ํ
root์ ๋ ๋๋ง ์ค์ธ App ์ปดํฌ๋ํธ๋ฅผ RecoilRoot๋ก ๊ฐ์ธ์ค๋ค.
recoil ์๋ recoil ๋ง์ state๊ฐ ์กด์ฌํ๋๋ฐ ๊ทธ๊ฑธ atom ์ด๋ผ๊ณ ํ๋ค
export const atomState = atom({
key : "์๋ช
",
value : ๊ฐ
})
์ฌ์ฉ ํ ์ปดํฌ๋ํธ์์ useState ์ฒ๋ผ import atomState from ~ ์ฃผ์
const [state,setRState] = useRecoilState(atomState) ์ด๋ ๊ฒ ์ฐ๋ฉด ๋๋ค.
์ํ ๋ณ๊ฒฝํ๋๋ฒ: ๊ทธ๋ฅ ์ ๋ ๊ฒ ๋ถ๋ฌ์ค๊ฒ ๋๋ฉด ์ด๋์๋ setRState() ์ด๋ ๊ฒ ํด์ฃผ๋ฉด ๋ฐ๋
useState ์ฒ๋ผ button onclick={() => setRState(์ก์ )} ์ด๋ ๊ฒ ํด์ฃผ๋ฉด ๋จ
setRstate๊ฐ ์๋ํด์ atomState์ value ๊ฐ์ด ๋ฐ๋ // ์ด๊ฑธ ๊ตฌ๋ ์ด๋ผ๊ณ ํ๋ค.
์ด๋ setRState๊ฐ ์คํ๋๋ฉด์ useRecoilState๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๊ณณ์ ์ ๋ถ ๋ฆฌ๋๋๋ฉ ๋๋ค.
๋จ useRecoilValue๋ฅผ ์ฌ์ฉํ ๋๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ํด๋น ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์๋ ํ ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๋ง๋์ง ์๋๋ค.
Recoil์์๋ useRecoilState๋ผ๋ hook์ ์ฌ์ฉํ์ฌ ์ธ์๋ก ์ ๋ฌํ ์ํ์ ๊ฐ๊ณผ setter๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
const SomeComponent = () => {
const [mode, setMode] = useRecoilState(modeState);
return <div>mode: {mode}</div>;
};
๋ง์ฝ ์ํ ๊ฐ๋ง ํ์ํ ๊ฒฝ์ฐ, useRecoilValue๋ผ๋ hook์ ์ฌ์ฉํ๋ค.
const SomeComponent = () => {
const mode = useRecoilValue(modeState);
return <div>mode: {mode}</div>;
};
const Button = () => {
const setMode = useSetRecoilState(modeState);
const toggleMode = () => {
setMode(prevMode => (prevMode === 'light' ? 'dark' : 'light'));
};
return (
<button type="button" onClick={toggleMode}>
์ ๋ฅผ ํด๋ฆญํ์๋ฉด mode๊ฐ ๋ฐ๋์ด์!
</button>
);
};
์ด hook์ ์ฌ์ฉํ๋ฉด setter๋ง ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
recoil์ ์ํฐ๋ง์ผ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ ํ ์ ์๋ค.
๊ทธ๋์ selector์ด๋ ํจ์๋ฅผ ์จ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
const cookieData = useRecoilValue(getCookieSelector);
// ์๋ ๊ทธ๋ฅ getCookieSelector์ ๋ถ๋ฌ์ค๋ ์ญํ
export const getCookieSelector = selector({
key: "cookie/get",
// ๊ณ ์ ์ ํค๊ฐ
get: async ({get}) => {
try {
const response = await fetch('/api/cookies'); // ๊ฐ์์ API ์ฃผ์
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching cookie data:', error);
throw error;
}
},
์ฌ๊ธฐ์ return data๋ฅผ set ๋ถ๋ถ์
set(์ํฐ๋ช
, newValue) ์ด๋ ๊ฒ ๋ฃ์ผ๋ฉด ์ํ๊ฐ ์
๋ฐ์ดํธ ๋๋ค.
set: ({set}, newValue)=> { //useRecoilState๋ฅผ ์ฐ๋ฉด ์๋ ์คํ
//return๋ data.data๊ฐ set์ผ๋ก ๋ณด๋ด์ง โ
set(cookieState, newValue)
//cookieState๋ผ๋ ์ํฐ์ newValue๋ก ์ํ๊ฐ์ ๋ฐ๊ฟ
}
});
})
get์ด ๋จผ์ ์คํ๋๋ set์ด ๋จผ์ ์คํ๋๋๋
useRecoilValue์ ์ป๋ useRecoilState๋ฅผ ์ป๋์ ๋ฌ๋ ธ๋ค
useRecoilState๋ get&set ๋๋ค ํธ์ถํ๋๋ฐ RecoilValue๋ get๋ง ํธ์ถํ๋ค.
๋์์ ์ํ๋๋ ๊ฒ์ด ์๋๋ผ, ์ฌ์ฉํ๋ ์ํฉ์ ๋ฐ๋ผ ํธ์ถ๋๋ ํ์ด๋ฐ์ด ๋ค๋ฅด๋ค.
useRecoilState๋ฅผ ์ฌ์ฉํ ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ ๋๋ง๋ ๋ get ํจ์๊ฐ ์คํ๋๊ณ , ์ด๋ Recoil ์ํ์ ํ์ฌ ๊ฐ์ ์ฝ์ด ์จ๋ค.
useRecoilState๋ฅผ ์ฌ์ฉํ ์ปดํฌ๋ํธ์์ Recoil ์ํ๋ฅผ ์ ๋ฐ์ดํธํ ๋, set ํจ์๊ฐ ํธ์ถ๋๊ณ ,
์ด๋ Recoil์ ์ํ๊ฐ ์ ๋ฐ์ดํธ ๋๋ฉฐ, ํด๋น Recoil์ ์ํ๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋๋ค.
๋ค์ ๋ ๋๋ง๋ ์ปดํฌ๋ํธ์์ useRecoilState๊ฐ ์ฌ์ฉ๋๋ฉด
๋ค์ get ํจ์๊ฐ ํธ์ถ๋์ด ์ต์ ๊ฐ์ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
์ด๋ฌํ ํ๋ฆ์์ get๊ณผ set์ ์๋ก ๋ค๋ฅธ ์ํฉ์์ ํธ์ถ๋๋ฉฐ
์ด๊ธฐ ๋ ๋๋ง ์ get์ด ๋จผ์ ์คํ๋๊ณ , ์ํ๋ฅผ ์ ๋ฐ์ดํธํ ๋ set์ด ๋จผ์ ์คํ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ค ๋ก๋ฉ๋๋ ๊ตฌ๊ฐ์ suspense์ fallback ์ฝ๋๋ก ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌํด์ฃผ๋ฉด ๋๋ค.
<RootRecoil>
<Suspense fallback={<div>Loading...</div>}>
//์ด๋ ๊ฒ suspense fallback={๋ก๋ฉ์ฒ๋ฆฌํ๋ ์ปดํฌ๋ํธ๋ div์ ์จ์ฃผ๋ฉด๋จ}
// ๊ทธ๋ผ ๋ค๋๋ฉด ๋ฐ์ Cookies๊ฐ ๋๋๋ง๋จ
<Cookies />
</Suspense>
</RootRecoil>
selector๋ ์ฝ๊ฒ ๋งํด์ ๊ธฐ์กด์ ์ ์ธํ atom์ ์ /ํ ์ฒ๋ฆฌํ์ฌ ์๋ก์ด ๊ฐ์ ๋ฆฌํดํ๊ฑฐ๋
๊ธฐ์กด atom์ ๊ฐ์ ์์ ํ๋ ์ญํ ์ ์ํํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐธ์กฐํ atom์ ๊ฐ์ด ์ต์ ํ๋๋ฉด ์๋์ผ๋ก
selector์ ๊ฐ๋ ์ต์ ํํ๋ฏ๋ก, ๊ด๋ฆฌํ๊ธฐ์๋ ๊ฐํธํ๋ค.
export const sampleState = atom({
key: "sampleState",
default: 0,
});
export const sampleSelector = selector({
key: "sampleSelector",
get: ({ get }) => get(sampleState) * 2,
set: ({ set }, newValue) => set(sampleState, newValue / 2),
});
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์์ ๋ฅผ ํ๋ฒ ๋ง๋ค์ด๋ดค๋ค. sampleSelector๋ sampleState๋ฅผ ์ฐธ์กฐํด
sampleState * 2 ๋ผ๋ ๊ฐ์ ๋ฆฌํดํ๊ณ ์๋ค.
๋ํ setter๋ฅผ ๋ณด๋ฉด ์๋กญ๊ฒ ์ ๋ ฅ๋ ๊ฐ์ ๋๋๊ธฐ 2 ํ์ฌ sampleState์ ์ ์ฉํ๊ณ ์๋ค.
์ด์ฒ๋ผ selector๋ฅผ ์ด์ฉํ๋ฉด ๊ธฐ์กด์ ์ ์ธํ atom๋ค์ ์ฐธ์กฐํ์ฌ ์๋ก์ด ๊ฐ์ ๋ง๋ค์ด๋ด๊ณ ,
์๋กญ๊ฒ ์ ๋ ฅ๋ฐ์ ๊ฐ์ ํ์ฒ๋ฆฌํ์ฌ atom์ ๊ฐ๊น์ง๋ ์์ ํ๋๋ก ์ค์ ํ ์ ์๋ค.