const MyContext = React.createContext();
<MyContext.Provider value={{ userInfo, themeSettings }}>
...
</MyContext.Provider>;
Recoil의 핵심 장점 중 하나는 효율적인 구독 메커니즘이 있어서 해당 atom을 직접 구독하는 컴포넌트만 해당 atom의 변화에 반응하여 리렌더링된다.
npm install recoil
// index
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { RecoilRoot } from 'recoil';
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement,
);
root.render(
<React.StrictMode>
<RecoilRoot>
<App />
</RecoilRoot>
</React.StrictMode>,
);
import { atom } from 'recoil';
export const isDarkAtom = atom({
key: 'isDark',
default: false,
});
key
: Atoms는 디버깅, 지속성 및 모든 atoms의 map을 볼 수 있는 고유한 키
가 필요하다.default
: 컴포넌트의 상태처럼 기본값을 가진다.// App
import { useRecoilValue } from 'recoil';
import { isDarkAtom } from './atoms';
function App() {
const isDark = useRecoilValue(isDarkAtom);
return (
<ThemeProvider theme={isDark ? theme.dark : theme.light}>
useRecoilValue()
훅을 통해서 어느 컴포넌트에서든 사용이 가능하다.// coins
import { isDarkAtom } from '@/atoms';
import { useSetRecoilState } from 'recoil';
const Coins = () => {
const setDarkAtom = useSetRecoilState(isDarkAtom);
const toggleDarkAtom = () => setDarkAtom((prev) => !prev);
return (
<S.Container>
<S.Header>
<S.Title>Coins</S.Title>
<S.DarkModeIcon onClick={toggleDarkAtom} icon="moon" size="2x" />
useSetRecoilState()
훅을 통해 Atom의 상태를 변경하는 함수를 만들 수 있다.const [state, setState] = useState()
의 setState와 유사하다.const [value, setValue] = useRecoilState(myAtom);
현재 값
을 반환하는 훅. 상태만을 읽을 때 사용한다.const value = useRecoilValue(myAtom);
const setValue = useSetRecoilState(myAtom);
const resetValue = useResetRecoilState(myAtom);
const someCallback = useRecoilCallback(({ snapshot, set }) => async () => {
const currentValue = snapshot.getLoadable(myAtom).contents;
// Do something with currentValue or set new value
set(myAtom, newValue);
});