<AppStateProvider>
<App/>
</AppStateProvider>
const [lang, setLang] = useAppState('lang', 'en');
return (
<>
<p>{lang}</p>
<button onClick={() => setLang(() => 'ko')}>KO</button>
<button onClick={() => setLang(() => 'en')}>EN</button>
</>
);
}
const appContext = createContext({});
export default function AppStateProvider() {
return (
<appContext.Provider value={}>
{props.children}
</appContext.Provider>
);
}
export function useAppState(keyName: string, defaultValue: any) {
...
return [_state, _setState];
}
export default function AppStateProvider() {
const [appState, setAppState] = useState({});
return (
<appContext.Provider
value={{
state: appState,
setState: (update: any) => setAppState(update)
}}
>
{props.children}
</appContext.Provider>
);
}
const { state, setState } = useContext(appContext);
// keyName 에 해당하는 값을 뽑아서 주자
const _state = state[keyName] ?? defaultValue; // 필터링
const _setState = (f: (s: any) => any) => {
setState({ ...state, [keyName]: f(_state) }); // 업데이트
};
return [_state, _setState];
export function useAppStateValue(keyName: string) {
const { state } = useContext(appContext);
return state[keyName]; // keyName 에 해당하는 값만
}
export default function AppStateProvider({initialState}) {
const [appState, setAppState] = useState(initialState);
...
}
Gist: AppStateProvider.tsx
CodeSandbox: Example
Context API로 직접 만들어보면 확실히 좋은 것 같아요! 디자인 패턴을 구현할 때 써봐도 좋기도 하구요 ㅎㅎ 잘 보고갑니다 :)