๐ ๋ณธ ๊ธ์ 2022๋ 4์ 12์ผ ๊ฐ์ธ github์ ์์ฑ๋ ๊ธ์ ๋๋ค.
๐ useContext ๋ฅผ ๋ง์ด ์ฐ๋ฉด ์๋๋ค...?
๐ค ์ฝํ
์คํฐ๋๊ฐ ๋๋๊ณ , ์ ์ ๋ฆฌ์กํธ์ ๋ํด ์ด์ผ๊ธฐ๋ฅผ ๋๋๋ ์ค์, useContext ์ ๋ํด ์คํฐ๋์ ํ๋ถ์ด useContext ๋ฅผ ๋ง์ด ์ฐ๋ฉด ์ข์ง์๋ค๋ ์ด์ผ๊ธฐ๋ฅผ ๋ค์ผ์
จ๋ค๊ณ ํ๋ค. useContext ๋ฅผ ์ฌ์ฉํ๋ฉด, ๋จ๋ฐํ๋ Props ์ ๋ฌ์ ์๋ฐฉํ ์ ์๋๋ฐ...
์?????? ๋ผ๋ ์๊ฐ์ ์ด๋ฒ WIL ์ ์ฃผ์ ๋ useContext ์ด๋ค.
useContext ๋?
1๏ธโฃcontext๋ฅผ ์ด์ฉํ๋ฉด ๋จ๊ณ๋ง๋ค ์ผ์ผ์ด props๋ฅผ ๋๊ฒจ์ฃผ์ง ์๊ณ ๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
๐ก ์ผ๋ฐ์ ์ธ React ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ ์์์ ์๋๋ก (์ฆ, ๋ถ๋ชจ๋ก๋ถํฐ ์์์๊ฒ) props๋ฅผ ํตํด ์ ๋ฌ๋์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ค์ ์ ํด์ค์ผ ํ๋ props์ ๊ฒฝ์ฐ (์๋ฅผ ๋ค๋ฉด ์ ํธ ๋ก์ผ์ผ, UI ํ ๋ง) ์ด ๊ณผ์ ์ด ๋ฒ๊ฑฐ๋ก์ธ ์ ์์ต๋๋ค. context๋ฅผ ์ด์ฉํ๋ฉด, ํธ๋ฆฌ ๋จ๊ณ๋ง๋ค ๋ช ์์ ์ผ๋ก props๋ฅผ ๋๊ฒจ์ฃผ์ง ์์๋ ๋ง์ ์ปดํฌ๋ํธ๊ฐ ์ด๋ฌํ ๊ฐ์ ๊ณต์ ํ๋๋ก ํ ์ ์์ต๋๋ค.
๋ฆฌ์กํธ ๊ณต์๋ฌธ์ useContext์ ๊ดํด ๊ธฐ์ฌ๋์ด์๋ ์ค๋ช ์ด๋ค.
๊ณต์ ๋ฌธ์์ ๊ธฐ์ฌ๋ ์์ ์ค๋ช
๋ง์ผ๋ก useContext ์ ๋ํ ์ดํด๊ฐ ์ ๋์๋ค.( ์ธ์ ๊ฐ ํ๋ก์ ํธ ๊ธฐ๊ฐ ์ฝ์น๋๊ป ๋ฆฌ์กํธ ๊ด๋ จ๋ ์ฑ
์ถ์ฒ์ ์ฌ์ญค๋ณด์๋๋ฐ ์ฑ
๋ณด๋ค ๊ณต์๋ฌธ์! ๋ผ๋ ๋ต๋ณ์ ์ฃผ์
จ๋๋ฐ, ๊ทธ ์ด์ ๊ฐ ์ดํด๊ฐ ๋์๋ค. )
์๋ฅผ ๋ค์ด์ ๋ค์ useContext ์ ๋ํด ๋งํด๋ณด์๋ฉด...์....๐ค (tmi...์์ฆ ๊ธ์ ์ธ๋, ์ต๋ํ ๋์ ์ธ์ด๋ก ํ์ดํด์ ์ฐ๊ณ ์ ๋
ธ๋ ฅํ๋ค....์์ง ์ต์ํ์ง ์์์ ์ ๋์ง๋ ์์ง๋ง.. ๊ณ์ํด์ ๊ณ ๋ฏผํ๋ค ๋ณด๋ฉด, ๋์ง์์๊น....?) ์๋ฌดํผ ๋ค์ ๋์์์ ์๋ฅผ ๋ค์ด ๋ด๊ฐ ๋ํ๋ณ์์ 5์ธต์ ์๋ ์ธ๊ณผ A์ ์๋์๊ฒ ์ง๋ฃ๋ฅผ ๋ณด์์ผํ๋ค๋ฉด, ์ผ๋จ 1์ธต์ ์๋ ์ ์์ฒ์ ์ ์๋ฅผ ํ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๊ณ ๋์ 2์ธต, 3์ธต, 4์ธต, 5์ธต์ ๊ฐ ์ธต์ ์ ์์ฒ๊ฐ ์๋ค๊ณ ๊ฐ์ ์ ํ๊ณ , ๊ทธ๋ผ ๋ด๊ฐ 5์ธต์ ์๋ ์ธ๊ณผ A ์ ์๋์ ๋ง๋๊ธฐ ์ํด 2์ธต์๋ ์ ์ -> 3์ธต์๋ ์ ์ -> 4์ธต์๋ ์ ์ -> 5์ธต์๋ ์ ์ ํ์ ์ ์๋์ ๋ง๋์ง ์๋๋ค!!!! ๊ทธ์ 1์ธต์ ํ๋ฒ ๋ฑ๋ก์ ํ๊ณ 5์ธต์ผ๋ก ๊ฐ์ ๋๋ฅผ ๋ถ๋ฅด๋ฉด ๋๋ ์ง๋ฃ์ค์ ๋ค์ด๊ฐ ๊ฒ์ด๋ค!
useContext ๋ ๋๊ฐ๋ค. ๋ฐ์ดํฐ๋ฅผ ์ค๊ฐ ์๋ฆฌ๋จผํธ์ Props๋ฅผ ์ด์ฉํ์ฌ ๊ณ์ ๋๊ฒจ์ค ํ์๊ฐ ์์ด ํด๋น ๋ฐ์ดํฐ๊ฐ ํ์ํ ์ปดํฌ๋ํธ๋ก ์๊ฐ์ด๋ ์์ผ์ค ์ ์๋ค!
useContext ์ฌ์ฉ๋ฐฉ๋ฒ ?
2๏ธโฃโ createContext : context ๊ฐ์ฒด๋ฅผ ์์ฑ.
const { Provider, Consumer } = React.createContext(defaultValue)
โ๏ธ defaultValue : Context ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์ ์์์ Provider๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ ๊ฐ.
๐ Provider value๋ก undefined ๋ฅผ ์ ๋ฌํ๋ฉด, Consumer ๊ฐ defaultValue ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ง๋๋ค.
โ
Provider : ์์ฑํ context๋ฅผ ํ์ ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌํ๋ ์ญํ .
โ๏ธ ํ๋์ Provider ์ ์ฌ๋ฌ๊ฐ์ Consumer ๋ค์ด ์ฐ๊ฒฐ ๋ ์ ์๋ค.
โ
Consumer : context์ ๋ณํ๋ฅผ ๊ฐ์ํ๋ ์ปดํฌ๋ํธ.
โ๏ธ context ๋ณํ๋ฅผ ๊ฐ์งํ๊ธฐ ์ํ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ.
โ ์์
- ์ต์๋จ ์ปดํฌ๋ํธ์์ createContext๋ฅผ import.
- 'UserContext'๋ผ๋ ๋ณ์์ ๋ด์ ๋ด๋ณด๋ผ ์ค๋น๋ฅผ ํ๋ค.
- ์ฌ์ฉํ๊ณ ์ ํ๋ state๋ฅผ value๊ฐ์ ๋ด์ ๋ณ์๋ก ์ง์ ํ๋ค.
- ํ์ ์ปดํฌ๋ํธ๋ค์ UserContext.Provider๋ก ๊ฐ์ธ๊ณ , value๊ฐ์ ๋ณด๋ด์ค๋ค.
import React, { createContext } from 'react'
import Children from './Children'
export const UserContext = createContext(defaultValue)
// defaultValue : Context ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์ ์์์ Provider๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ ๊ฐ.
const App = () => {
const user = {
userId: 'abcd',
userName: '๋์ฐ',
}
return (
<>
<UserContext.Provider value={user}>
<div>
<User />
</div>
</UserContext.Provider>
</>
)
}
export default App
๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด์ผํ๋ ํด๋น ์ปดํฌ๋ํธ์์ useContext ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์๋ ๋๊ฐ์ง๊ฐ ์๋ค.
โ ์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ
import React from 'react'
import { UserContext } from './App'
const User = () => {
return (
<UserContext.Consumer>
{(user) => (
<>
<h2>userId๋ {user.userId}์
๋๋ค.</h2>
<h2>userName {user.userName}์
๋๋ค.</h2>
</>
)}
</UserContext.Consumer>
)
}
export default User
โ ๋๋ฒ์งธ ๋ฐฉ๋ฒ
import React from 'react'
import { userContext } from './App'
import { UserContext } from 'react'
const User = () => {
const { userId, userName } = useContext(UserContext)
return (
<>
<h2>userId :{userId}</h2>
<h2>userName :{userName}</h2>
</>
)
}
export default User
์ด ๋ ๋ฐฉ๋ฒ์ ์ฐจ์ด์ ์ ์์ง ์ฐพ์ง๋ ๋ชปํ๋๋ฐ, ๋ด ์๊ฐ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๋ฐ๋ก ์ถ๋ ฅ๋ง ํ๋ค๋ฉด consumer ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํธํ ๊ฒ ๊ฐ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด์ผํ๋ค๋ฉด ๋๋ฒ์งธ ๋ฐฉ๋ฒ์ด ํธํ ๊ฒ๊ฐ๋ค. ๋์ ๊ฒฝ์ฐ๋ค๋ ๋๋ฒ์งธ ๋ฐฉ๋ฒ์ด ์กฐ๊ธ ๋ ํธํด์ ์ฌ์ฉ์ค์ด๋ค..๋ค๋ง, ์ถ๋ ฅ๋ง ํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค๋ฉด ์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๊ฒ๊ฐ๋ค!
์ด๋ถ๋ถ์ ์กฐ๊ธ ๋ ๋ณด์ถฉํด์ผ ํ ๊ฒ ๊ฐ๋ค!
context๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๊ณ ๋ คํ ๊ฒ
3๏ธโฃcontext์ ์ฃผ๋ ์ฉ๋๋ ๋ค์ํ ๋ ๋ฒจ์ ๋ค์คํ
๋ ๋ง์ ์ปดํฌ๋ํธ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์
๋๋ค.
context๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ๊ฐ ์ด๋ ค์์ง๋ฏ๋ก ๊ผญ ํ์ํ ๋๋ง ์ฐ์ธ์.
์ฌ๋ฌ ๋ ๋ฒจ์ ๊ฑธ์ณ props ๋๊ธฐ๋ ๊ฑธ ๋์ฒดํ๋ ๋ฐ์ context๋ณด๋ค ์ปดํฌ๋ํธ ํฉ์ฑ์ด ๋ ๊ฐ๋จํ ํด๊ฒฐ์ฑ
์ผ ์๋ ์์ต๋๋ค.
๊ณต์๋ฌธ์์ ๊ธฐ์ฌ๋ ๋ด์ฉ์ด๋ค.
์...? ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ๊ฐ ์ด๋ ค์์ง๊น....? ์ด ๋ถ๋ถ์ ์ดํดํด๋ณด์.
useContext์์ ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ์ด ์ด๋ ต๋ค...?
4๏ธโฃ
์ด ๋ถ๋ถ๊ณผ ๊ด๋ จํด์ ์คํฐ๋ ํ์๋ถ์ด ์ฌ๋ ค์ฃผ์ ์ค๋ช
์ด๋ค...!!
์ด ๋ถ๋ถ์ ์ฌ์ค ์ดํด๊ฐ ์๋ฒฝํ๊ฒ ๋์ง ์๋๊ฒ๊ฐ๋ค ใ
ใ
์ฝ๊ฐ ..์ ๊ทธ๋ ๊ตฌ๋...
๊ทธ๋ฅ ๋ฌด์กฐ๊ฑด Provider ์์ ๊ฐ์ธ์ ธ ์์ด์ผ..value ๋ฅผ ๋ฐ์ ์ ์์ผ๋๊น.. ๋ถ๋ฆฌ๊ฐ ์๋๋ ๊ตฌ๋ -> ๊ทธ๋์ ์ฌ์ฌ์ฉ์ฑ์ด ๋จ์ด์ง๋ค๋๊ตฌ๋! ์ด์ ๋์ ๋๋์ด๋ค...
์กฐ๊ธ ๋ ๊ณ ๋ฏผํ๊ณ ์๋ฃ๋ฅผ ์ฐพ์๋ด์ผ ํ ๊ฒ ๊ฐ๋ค. (์ฌ์ค ์ด ๋ถ๋ถ์ ์๋ฒฝํ ํ ์ํ์์ ๊ธ์ ์ฐ๊ณ ์ถ์ด์, ๊ณ์ ๊ธ์ ์์ฑํ๋ ๊ฒ์ ๋ฏธ๋ฃจ๊ฒ ๋์๋๋ฐ, ๋ง๋ฅ ๋ฏธ๋ฃฐ์๋ ์์ด์ ์ด๋ ๊ฒ ์ ์ด๋๊ณ , ์์ ํ ์์ ์ด๋ค!)
์ฃผ์์ฌํญ! ๋ชจ๋ ํ์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ค...!!
5๏ธโฃuseContext ์ ๋จ์ ์ผ๋ก Provider์ ๋ถ๋ชจ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค ๋ถํ์ํ๊ฒ ํ์ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง ๋๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค!!๐ฌ ํ์ง๋ง ์ญ์๋.. ๋ฌธ์ ํด๊ฒฐ๋ฐฉ๋ฒ์ ์กด์ฌํ์๋ค!
โ ํด๊ฒฐ์ฑ : useMemo ์ฌ์ฉํ๊ธฐ.
function CountProvider(props) {
const [count, setCount] = React.useState(0)
const value = React.useMemo(() => [state, setCount], [count])
return <CountContext.Provider value={value} {...props} />
}
ํด๋น ์๋ฃ์์ useMemo๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด, state ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง, ๋ ๋๋ง๋๋๋ก ํ ์ ์๊ธฐ๋๋ฌธ์, ๋ถํ์ํ ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์๋ค๊ณ ํ๋ค. ํ์ง๋ง ๋๋ ์ด๊ฒ ์ต์ ์ ์๋ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค!
function CountProvider(props) {
const [count, setCount] = React.useState(0)
const value = React.useMemo(() => [state, setCount], [count])
return
;<CountContext.Provider value={value} {...props}>
<useCountContextComponent />
<notUseCountContextComponent />
</CountContext.Provider>
}
์๋ฅผ ๋ค์ด ์์์ useCountContextComponent ๋ CountContext.Provider์ ๋๊ฒจ์ค value ๋ฅผ ์ฌ์ฉํ์ง๋ง,notUseCountContextComponent ๋ ์ฌ์ฉํ์ง ์๋ ์ปดํฌ๋ํธ๋ผ๊ณ ํ๋ฉด, ๊ฒฐ๊ตญ value ๊ฐ์ด ๋ฐ๋ ๋ value ๋ฅผ ์ฌ์ฉํ์ง ์๋ notUseCountContextComponent ์ปดํฌ๋ํธ๋ ๋ ๋๋ง ๋๊ธฐ ๋๋ฌธ์, ๊ฐ์ด ๋ฐ๋์ง ์์ ๋๋ ๋ค์ ๋ ๋๋ง์ด ๋๋ ๋ถ๋ถ์ useMemo ๋ก ํด๊ฒฐํ ์ ์์ง๋ง, ์๋ฒฝํ๊ฒ ๋ชจ๋ ์ํฉ์ ํด๊ฒฐํ ์ ๋ ์๋ค๋ ์๊ฐ์ด ๋ค์๋ค...๊ทธ๋ ๊ธฐ์ useMemo ๊ฐ ํ์คํ ํด๊ฒฐ์ฑ ์ ์๋๊ฒ ๊ฐ๋ค๋ ์๋ฌธ์ด ์๊ฒผ๋ค..
ํด๋น ๋ถ๋ถ์ ๋ํด ๋ ์ฐพ๋ค๋ณด๋ ์์ธํ ์ค๋ช ๋์ด์๋ ๋ธ๋ก๊ทธ ๋ฅผ ๋ฐ๊ฒฌํ์๋๋ฐ, ์ฌ๊ธฐ์ ์ปจํ ์คํธ๋ฅผ ์ํ๊ฐ / ์ก์ ์ผ๋ก ๋๋๋ ๋ฐฉ๋ฒ์ด ์์๋ค! ๋ค๋ง, ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ณ , ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ง์ ๊ฐ๋ฐ์๋ค์ด ๋ฆฌ๋์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๊ณ ํ๋ค..!!
์ด๋ก์จ ๋์ ๊ถ๊ธ์ฆ์ด ํด๊ฒฐ๋ ๊ฒ ๊ฐ๋ค!! (๋ฌผ๋ก , ์ฌ์ฌ์ฉ์ฑ์ ๋ํ ๋ถ๋ถ์ ๋ ๊ณต๋ถํด์ผํ ๋ถ๋ถ์ด๋ค.)
๋ฌผ๋ก ์์ง ๋ง์ ๋ถ๋ถ์์ ๋ถ์กฑํ๊ธฐ์ ์ง๊ธ์ ๊ธ์ ๊ณ์ํด์ ์กฐ๊ธ์ฉ ๋ณด์ํด๋๊ฐ ์์ ์ด๋ค!!
๐ Reference
GitHub - kentcdodds/old-kentcdodds.com: Kent's Homepage
Kent's Homepage. Contribute to kentcdodds/old-kentcdodds.com development by creating an account on GitHub.
github.com
GitHub - kentcdodds/old-kentcdodds.com: Kent's Homepage
Kent's Homepage. Contribute to kentcdodds/old-kentcdodds.com development by creating an account on GitHub.
github.com
'๐ WIL > ๐ React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ๏ธ useRef (0) | 2022.08.10 |
---|---|
โ๏ธ useMemo, useCallback (+ React.memo + HOC) (0) | 2022.08.10 |
๐ก Spread Syntax๋ฅผ ์ ์ฌ์ฉํ ๊น..? (0) | 2022.08.10 |
SSR ๊ณผ CSR, ๊ทธ๋ฆฌ๊ณ SEO (0) | 2022.08.10 |
Single Page Application (0) | 2022.08.10 |