Context
์ปจํ ์คํธ๋ ๊ณต๊ธ์๊ฐ ์๋ก์ด ๊ฐ์ ๊ฐ๊ฒ ๋๋ฉด ๋ชจ๋ ์ปจํ ์คํธ ์๋น์๋ ์๋ก์ด ๊ฐ์ ๋ฐ๊ณ ๋ฆฌ๋ ๋๋ง ๋๋ค.
์ปจํ
์คํธ ์ ํ์ ์๋ ๋ฐฉ์
๋ฆฌ์กํธ์์ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ ์ด์ ๋ ๋ ๊ฐ์ง๋ค.
๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋์์ ๋
์ปจํ ์คํธ๊ฐ ๋ณ๊ฒฝ๋์์ ๋
์ปจํ
์คํธ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์์๋๋ฐ๋ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด,
memo
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
memo๋ฅผ ์ฌ์ฉํด์ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๋ ์์
const ColorContext = createContext('black')
const ColorComponent = () => {
const color = useContext(ColorContext)
// ๋๋๋ง ํ์ ํ์ธ
const renderCount = useRef(1)
useEffect(()=> {
renderCount.current += 1
})
return (
<div style={{ color}}>
Hello {color} (renders: {renderCount.current})
</div>
)
}
memo๋ก ๊ฐ์ผ ColorComponent
const MemoizedColorComponent = memo(ColorComponent)
useContext๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ปดํฌ๋ํธ ์์ฑ
const DummyComponent = () => {
const renderCount = useRef(1);
useEffect(() => {
renderCount.current += 1;
});
return <div>Dummy (renders: {renderCount.current})</div>;
}
memo๋ก ๊ฐ์ผ DummyComponent
const MemoizedDummyComponent = memo(DummyComponent)
๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ปดํฌ๋ํธ ๋ ๋๋ง
const Parent = () => {
<ul>
<li><DummyComponent></li>
<li><MemoizedDummyComponent></li>
<li><ColorComponent></li>
<li><MemoizedColorComponent></li>
</ul>
}
App ์ปดํฌ๋ํธ์์ Parent ์ปดํฌ๋ํธ ๋ ๋๋ง
const App = () => {
const [color, setColor] = useState('red')
return (
<ColorContext.Provider value={color}>
<input value={color} onChange={(e)=> setColor(e.target.value)} />
<Parent />
</ColorContext.Provider>
)
}
์ ์ปดํฌ๋ํธ๋ฅผ ์คํํ๋ฉด,
์ฒ์์ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ค.
ํ ์คํธ ์ ๋ ฅ ํ๋์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด useState๋ก ์ธํด App ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ค.
ColorContext.provider๋ ์๋ก์ด ๊ฐ์ ๋ฐ๊ณ , Parent ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ค.
DummyComponent๋ ๋ฆฌ๋ ๋๋ง ๋์ง๋ง MemoizedDummyComponent๋ ๋ฆฌ๋ ๋๋ง ๋์ง ์๋๋ค.
ColorComponent๋ ๋ ๊ฐ์ง ์ด์ ๋ก ๋ฆฌ๋ ๋๋ง๋๋ค.
๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋จ
์ปจํ ์คํธ๊ฐ ๋ณ๊ฒฝ ๋จ
MemoizedColorComponent๋ ์ปจํ ์คํธ๊ฐ ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ๋ฆฌ๋ ๋๋ง๋๋ค.
memo
๋ฅผ ์ฌ์ฉํด๋ ์ปจํ
์คํธ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ฆฌ๋ ๋๋ง์ ๋ง์ ์ ์๋ค.
์ปจํ
์คํธ๋ฅผ ์ฌ์ฉํ ๋ชจ๋ฒ ์ฌ๋ก
// ์ด๊ธฐ๊ฐ์ด null์ธ ์ปจํ
์คํธ ์์ฑ
type CountContextType = [
number,
Dispatch<SetStateAction<number>>
]
const Count1Context = createContext<CountContextType | null>(null)
// Count1Provider๋ฅผ ์ ์ํด์ useState๋ก ์ํ๋ฅผ ์์ฑํ๊ณ ์ปจํ
์คํธ์ ์ ๊ณต
export const count1Provider = ({
children
}: {
children: ReactNode
}) => {
<Count1Context.Provider value={useState(0)}>
{children}
</Count1Context.Provider>
}
// Count1Context์์ ๊ฐ์ ๊ฐ์ ธ์ค๋ ์ปค์คํ
ํ
export const useCount1 = () => {
const value = useContext(Count1Context)
if (value === null) throw new Error("Provider missing")
return value
}
// Count2Context๋ฅผ ์์ฑ
const Count2Context = createContext<CountContextType | null>(null)
export const Count2Provider = ({
children
}: {
children: ReactNode
}) => {
<Count2Context.Provider value={useState(0)}>
{children}
</Count2Context.Provider>
}
export const useCount2 = () => {
const value = useContext(Count2Context)
if (value === null) throw new Error("Provider missing")
return value
}
// count1์ ์ฌ์ฉํ๊ณ ์นด์ดํธ์ ๋ฒํผ์ ๋ณด์ฌ์ฃผ๋ ์ปดํฌ๋ํธ
const Counter1 = () => {
const [count1, setCount1] = useCount1()
return (
<div>
Count1: {count1}
<button onClick={() => setCount1((c) => c + 1)}>+1</button>
</div>
)
}
// count2๋ฅผ ์ฌ์ฉํ๊ณ ์นด์ดํธ์ ๋ฒํผ์ ๋ณด์ฌ์ฃผ๋ ์ปดํฌ๋ํธ
const Counter2 = () => {
const [count2, setCount2] = useCount2()
return (
<div>
Count2: {count2}
<button onClick={() => setCount2((c) => c + 1)}>+1</button>
</div>
)
}
const parent = () => {
return (
<div>
<Counter1>
<Counter1>
<Counter2>
<Counter2>
</div>
)
}
const App = () => {
return (
<Count1Provider>
<Count2Provider>
<Parent />
</Count2Provider>
</Count1Provider>
)
}
Last updated