์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ Props์ ํตํด ์ปดํฌ๋ํธ์ ์ ๋ฌ ๋๋๋ฐ ํญ์ ๋ฌธ์ ๊ฐ ๋๋ ๊ฑด state๋ฅผ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ํตํด ์ ๋ฌํ๋ ๊ฒฝ์ฐ์ด๋ค. ์ฆ ๊ธฐ๋ณธ์ ์ผ๋ก๋ Props์ ํ์ฉํด ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค. ์์ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ํ์ ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉํ๊ธฐ ์ํด์ Props๋ฅผ ๋ด๋ ค๋ฐ๋๋ฐ, ์์ - ํ์ - ํ์์ ํ์ ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ ๋ฐ๋ ๊ฒฝ์ฐ์๋ Props๋ฅผ ๊ณ์ ์ด์ด์ ๋ด๋ ค์ฃผ๋ ํํ๊ฐ ๋๋ค. ํ์ง๋ง ํ์์ ํ์ ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์์์์ ํ์๋ก Props๋ฅผ ๋ด๋ ค ์ฃผ๊ณ ํ์์์ ํ์์ ํ์ ์ปดํฌ๋ํธ์ Props๋ฅผ ๋๊ฒจ์ฃผ๋๋ฐ ์ด ํ์ ์ปดํฌ๋ํธ์์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์ฑ์ด ํฌ๋ค๋ฉด ์ ์ Props์ ๋๋ฆด๋ง์ด ๊น์ด์ง ์ ์๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค...?
๋๋งํ๋ฉด ์์๋ฆฌ...
์ด๋ ๊ฒ ๋ฆฌ์กํธ ๋ด๋ถ์ ์ผ๋ก stste๋ฅผ ๊ด๋ฆฌํด ์ฃผ๋ Context API๋ฅผ ์ฌ์ฉํ์ฌ, ์ฑ์ ์ด๋ค ์ปดํฌ๋ํธ์์๋ผ๋ ์ง์ ๋ณ๊ฒฝํด ์ฑ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ง์ ์ ๋ฌํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น? ๐ค
๋์ ๊ฒฝ์ฐ์๋ ์ด๋ค Tab์ธ์ง๋ฅผ ๊ตฌ๋ถํ์ฌ Tab๋ณ๋ก ์นดํ ๊ณ ๋ฆฌ์ ๋ง๋ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ ์ฃผ๊ธฐ ์ํด์ Tab์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด context API๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ค! ์ํ ๋ณํ๊ฐ ๊ทธ๋ ๊ฒ ํฌ๊ฒ ์ผ์ด๋ ๊ฒ ๊ฐ์ง ์๊ณ , ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ก ์๊ทผ ๋๋์ด์ ธ ์์ด์ props ๋๋ฆด๋ง์ด ์ผ์ด๋ฌ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ์ปดํฌ๋ํธ์ props ์ ๋ฌ์ ํ์ง ์์ผ๋ ค๊ณ ์ฌ์ฉํ๊ฒ ๋์๋ค. ๊ทธ๋ฆฌ๊ณ ์ํ ๊ด๋ฆฌ๋ก ๋ฆฌ๋์ค๋ ์ฌ์ฉํด ๋ณด์์ง๋ง... context API๋ ์ฌ์ฉํ๋คํ๋ค ํ๊ณ ํ ๋ฒ๋ ์ฌ์ฉํ ์ ์ด ์์๊ธฐ์ ์ด๋ฒ ๊ธฐํ์ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค!
import React, {
PropsWithChildren,
createContext,
useState,
useMemo,
} from 'react';
import Tab from '../constants/Tab';
interface TabContextType {
currentTab: string;
setCurrentTab: React.Dispatch<React.SetStateAction<string>>;
}
export const TabContext = createContext<TabContextType>({
currentTab: Tab.All,
setCurrentTab: () => {},
});
/*
createContext๋ฅผ ์ฌ์ฉํ์ฌ context๋ฅผ ์์ฑํ๋ค! ์ธ์๋ก๋ ์ด๊ธฐ๊ฐ์ ๋ฃ์ด ์ฃผ์๋ค!
const TabContext = React.createContext() ์ ๊ฐ์ด context๋ฅผ ์์ฑํด๋ ๋๋ค.
Context๋ฅผ ์์ฑํ๋ฉด Context ์์ Provider ๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ํตํด Context์ ๊ฐ์ ์ ํ ์ ์๋ค.
๊ทธ ๊ฐ์ value๋ก ์ ํ์ฌ ์ค์ ํ๋ค!
์๋์ ๊ฐ์ด TabProvider๋ฅผ ๋ง๋ค์ด ์ํ๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ปดํฌ๋ํธ์ ์์๋ก ๊ฐ์ธ ์ฃผ๋ฉด ๋๋ค.
<TabProvider>
<์ํ๋ฅผ ์ฌ์ฉํ ์ปดํฌ๋ํธ>
</TabProvider>
*/
function TabProvider({ children }: PropsWithChildren<{}>) {
const [currentTab, setCurrentTab] = useState<string>(Tab.All);
const value = useMemo(
() => ({ currentTab, setCurrentTab }),
[currentTab, setCurrentTab],
);
return <TabContext.Provider value={value}>{children}</TabContext.Provider>;
}
export default TabProvider;
๊ทผ๋ฐ ์ด๋ ๊ฒ context ์ ์ ํ๊ฒ ์ ์์ฑํ๋ค๊ณ ์๊ฐํ๋๋ฐ ์ค๋ฅ ํฌ์ฑ์ด๊ฐ ๋ ์ ์ ๊ทธ๋ฌ์ง...? ํ๋๋ฐ return์ jsx๋ก ๋๊ณ ์์ด์ ํ์ผ ํ์ฅ์๋ฅผ ts๋ก ํด ๋์ด์ ์ค๋ฅ ํฌ์ฑ์ด๊ฐ ๋์๋ค... ํ์ฅ์ ํ์ธ ์ํ์...! ์ฐธ๊ณ
// ์ํ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ฐ์ useContext๋ฅผ import ํ๋ค.
import { useContext } from 'react';
// ๊ทธ๋ฆฌ๊ณ createContect๋ฅผ ํตํด ๋ง๋ค์๋ Context ๋ํ import ํ๋ค.
import { TabContext } from '../context/TabContext';
/*
์ฌ์ฉํ๋ ค๋ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด์ด ์ฌ์ฉํ๋ฉด ๋๋ค.
๋๋ ๊ตฌ์กฐ๋ถํดํ ๋น์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ์ง๋ง
const value = useContext(TabContext);
์ ๊ฐ์ด ํ์ฌ value.currentTab ๊ณผ ๊ฐ์ด ์ฌ์ฉํด๋ ๋ฌด๋ฐฉํ๋ค.
*/
const { currentTab } = useContext(TabContext);
์ด๋ ๊ฒ ํ๋ฉด ๋ฌด์ง์ฑ props๋ก ๋๊ฒจ ์ฃผ์๋ ๋ถ๋ถ๋ ๊น๋ํ๊ฒ ์ญ์ ๊ฐ ๋๊ณ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์๋ง ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ ๊ฒ ์ข์ context API์๋ ๋จ์ ์ด ์์์ผ๋ , , ,