Recoil ์ค์น
npm install recoil
Recoil ์ ํ๋ฆฌ์ผ์ด์ ์ค์
Recoil์ ์ฌ์ฉํ๋ ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์์ RecoilRoot๋ฅผ ์ค์ ํด์ผํ๋ค.
src/App.js
import React from 'react';
import { RecoilRoot } from 'recoil';
import YourMainComponent from './YourMainComponent';
function App() {
return (
<RecoilRoot>
<YourMainComponent />
</RecoilRoot> );
}
export default App;
Recoil ์ํ ์์ฑ
Recoil ์ํ๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐ๊ฐ์ ์ค์ ํ๊ธฐ
src/atoms/counterAtom.js
import { atom } from 'recoil';
export const counterState = atom({
key: 'counterState',
default: 0,
});
Recoil ์ํ ์ฌ์ฉ
์์ฑํ Recoil ์ํ๋ฅผ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
src/components/CounterComponent.js
import React from 'react';
import { useRecoilState } from 'recoil';
import { counterState } from '../atoms/counterAtom';
function CounterComponent() {
const [counter, setCounter] = useRecoilState(counterState);
return (
<div>
<p>Counter: {counter}</p>
<button onClick={() => setCounter(counter + 1)}>Increment</button>
</div>
);
}
export default CounterComponent;
Recoil ์ํ ๊ฐฑ์ ( useRecoilState )
Recoil ์ํ๋ฅผ ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ์ useRecoilState ํ ์ผ๋ก ์ํ๋ฅผ ์ฝ๊ณ ์ธ ์ ์๋ค.
์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์๋ฅผ ์ด์ฉํ์ฌ Recoil ์ํ๋ฅผ ๊ฐฑ์ ํ๋ฉด, Recoil์ ํด๋น ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ๊ณ ์๋์ผ๋ก ๋ฆฌ๋ ๋๋งํ๋ค.
src/components/CounterComponent.js
import React from 'react';
import { useRecoilState } from 'recoil';
import { counterState } from '../atoms/counterAtom';
function CounterComponent() {
const [counter, setCounter] = useRecoilState(counterState);
const handleIncrement = () => {
setCounter(counter + 1);
};
const handleDecrement = () => {
setCounter(counter - 1);
};
return (
<div>
<p>Counter: {counter}</p>
<button onClick={handleIncrement}>Increment</button>
<button onClick={handleDecrement}>Decrement</button>
</div>
);
}
export default CounterComponent;
Recoil ์ํ ์กฐํฉ ( useRecoilValue )
์ฌ๋ฌ Recoil ์ํ๋ฅผ ์กฐํฉํ๋ ๋ฐฉ๋ฒ์ useRecoilValue ํ ์ผ๋ก ์ฌ๋ฌ ์ํ๋ฅผ ์ฝ์ด์ ์กฐํฉํ ์ ์๋ค.
src/atoms/combinedAtoms.js
import { atom, useRecoilValue } from 'recoil';
import { counterState } from './counterAtom';
export const combinedAtom = atom({
key: 'combinedState',
default: null,
});
export const CombinedComponent = () => {
const counter = useRecoilValue(counterState);
// ์ถ๊ฐ์ ์ธ Recoil ์ํ๋ค์ ์ฝ์ด์ ์กฐํฉ....
return <div>Combined State: {counter}</div>;
};
Recoil ์ํ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ( useRecoilCallback )
๊ณต์๋ฌธ์ : https://recoiljs.org/docs/api-reference/core/useRecoilCallback/
useRecoilCallback์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ฒ๋ฆฌํ๊ธฐ
src/atoms/asyncAtom.js
import { atom, useRecoilCallback } from 'recoil';
export const asyncAtom = atom({
key: 'asyncState',
default: null,
});
export const AsyncComponent = () => {
const fetchData = useRecoilCallback(async ({ snapshot }) => {
const currentState = await snapshot.getPromise(asyncAtom);
// ๋น๋๊ธฐ ์์
์ํ ํ Recoil ์ํ ์
๋ฐ์ดํธ
// snapshot.set(...) ๋๋ setAsyncAtom(...) ๋ฑ์ ์ฌ์ฉ
});
return (
<div>
<button onClick={fetchData}>Fetch Data</button>
</div>
);
};
- snapshot
useRecoilCallback ํ ์์์ snapshot์ ํ์ฌ Recoil ์ํ์ "์ค๋ ์ท"์ผ๋ก, ํ์ฌ ์์ ์ recoil ์ํ๋ฅผ ์ฝ์ ์ ์๋๋ก ํด์ค๋ค
useRecoilCallback์ ๋น๋๊ธฐ ํจ์๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋๋ฐ ์ด ํจ์๋ snapshot ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋๋ค.
snapshot์ ์ด์ฉํ๋ฉด ๋น๋๊ธฐ ํจ์ ์์์ ํ์ฌ Recoil ์ํ๋ฅผ ์์ ํ๊ฒ ์ฝ์ ์ ์๋ค.
import { useRecoilCallback } from 'recoil';
import { myAtom } from './atoms';
const myAsyncSelectorCallback = useRecoilCallback(async ({ snapshot }) => {
const currentValue = snapshot.getLoadable(myAtom).value;
// currentValue๋ฅผ ์ฌ์ฉํ ๋น๋๊ธฐ ์์
์ํ
const result = await someAsyncFunction(currentValue);
// ๊ฒฐ๊ณผ๋ฅผ Recoil ์ํ์ ๋ฐ์
snapshot.set(myAtom, result);
});
// myAsyncSelectorCallback์ ์ด์ฉํ์ฌ ๋น๋๊ธฐ ์์
์ํ
myAsyncSelectorCallback();
snapshot.getLoadable(myAtom).value๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ myAtom์ ๊ฐ์ ์ฝ์ด์ค๊ณ , ๊ทธ ๊ฐ์ ์ด์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ ์ํํ ํ snapshot.set(myAtom, result)์ ํตํด Recoil ์ํ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๋ค.
์ด๋ฅผ ํ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ ์ํํ๊ณ Recoil ์ํ๋ฅผ ๊ฐฑ์ ํ ์ ์๋ค.
'TIL > ์ํ๊ด๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] React Context (0) | 2023.09.22 |
---|---|
[TIL] Redux-Toolkit 2 - Main Project (0) | 2023.05.19 |
[TIL] Redux-Toolkit (0) | 2023.05.19 |