๊ธฐ๋ฅ ์ ์์ฒญํ๊ฑฐ๋ ๋ฒ๊ทธ๋ฅผ๋ณด๊ณ ํ์๊ฒ ์ต๋๊น?
๋ฒ๊ทธ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๐
ํ์ฌ ํ๋์ ๋ฌด์์ ๋๊น?
์ค์ฒฉ ์ปจํ
์คํธ ๊ณต๊ธ์์ useContext
ํํฌ๊ฐ ์ถฉ๋ํ๋ ๊ฒ ๊ฐ๊ณ ์
๋ฐ์ดํธ๊ฐ ์ญ์ ๋ฉ๋๋ค.
์์๋๋ ๋์์ ๋ฌด์์ ๋๊น?
์ปจํ
์คํธ์ ์ฐ๊ฒฐํ ๋ value
๋ณ๊ฒฝ ๋ ๋๋ง๋ค ์
๋ฐ์ดํธํด์ผํฉ๋๋ค.
์ด๋ค ๋ฒ์ ์ React์ ์ด๋ค ๋ธ๋ผ์ฐ์ / OS๊ฐ์ด ๋ฌธ์ ์ ์ํฅ์ ๋ฐ์ต๋๊น?
18.8.0-alpha.1
( 16.7.0-alpha.0
์์๋ ์ฌํ ๋จ)chrome 71
localStorage "์ฐ๊ฒฐ"์ ์ ๋ฆฌํ๋ ๋์
๊ณต์ ๋ฐ์ ๋ฌธ์์์ 2 ๊ฐ์ ๊ธฐ์ฌ ( [1]
& [2]
)๋ฅผ ํผํฉํ๋ ค๊ณ ์๋ํ์ง๋ง ํํฌ๋ก ๊ตฌํํ์ง๋ง ๊ฐ์ด ์ ๋ฌ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
codesandbox [3]
์ ๊ฐ์ํ ๋ ๋ฐ๋ชจ๋ฅผ
์ค์ ๊ตฌํ์ ๋ช ์ค๋ง ๋ ์ถ๊ฐ๋ฉ๋๋ค (ํ์ฑํ์ฌ JSON์ผ๋ก ๋ฌธ์์ด ํ).
๋ด๊ฐ ์ฐพ์ ํด๊ฒฐ ๋ฐฉ๋ฒ :
setValue
ํจ์ ์ฃผ์์ ๊ฐ ๋ ๋๋ง์ ๋ํด ์ ํจ์๋ฅผ ๋ง๋ค๋ฉด ์ค์ ๋ก ์๋ํฉ๋๋ค.[1]
์ ์กฐ์ธ์ ์๋ฐฐ๋ฉ๋๋ค.componentDidUpdate
๋์ useEffect
.์๋ ์ฝ๋์์ ์๋ํ์ง ์์์ผํ๋ ๊ฒ์ด ์์ต๋๊น? ํจ๊ณผ๋ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ์ ํํฌ๋ฅผ ํตํด ์๋นํ๋ ๊ตฌ์ฑ ์์์์ ์
๋ฐ์ดํธ๋์ง ์์ต๋๋ค. ์ฌํ ์ฝ๋ ์ฐธ์กฐ [3]
const createLocalStorage = key => {
const initialValue = localStorage.getItem(key)
const ValueContext = createContext(initialValue)
const SetterContext = createContext(() => {})
const useStorage = () => [ValueContext, SetterContext].map(useContext)
const Provider = ({children}) => {
const [value, setValue] = useState(initialValue)
useEffect(
() => {
console.log('effect', value)
localStorage.setItem(key, value)
},
[value],
)
return (
<ValueContext.Provider value={value}>
<SetterContext.Provider value={setValue}>
{children}
</SetterContext.Provider>
</ValueContext.Provider>
)
}
return [Provider, useStorage]
}
[1]
: https://reactjs.org/docs/hooks-faq.html#how -to-avoid-passing-callbacks-down
[2]
: https://reactjs.org/docs/context.html#updating -context-from-a-nested-component
[3]
: https://codesandbox.io/s/0yzjr8vnrv
๋๋ codesandbox [3]์ ๋ํ ๊ฐ์ํ ๋ ๋ฐ๋ชจ๋ฅผ ์ฌ๋ ธ์ต๋๋ค.
useContext
ํธ์ถ์ด Provider
๊ณผ ๋์ผํ ๊ตฌ์ฑ ์์์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฐ ์๋ฏธ์์ ๊ทธ๋ค์ ๊ณต๊ธ์ (๊ธฐ๋ณธ๊ฐ) ์ ์ ์ปจํ
์คํธ๋ฅผ ์ฝ๊ณ ์์ต๋๋ค.
๊ณต๊ธ์์ ๊ฐ์น๋ ๋ด๋ถ ๊ตฌ์ฑ ์์์ ์ปจํ ์คํธ์๋ง ์ํฅ์์ค๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๋ง์ฝ ๋น์ ์ด [A, B].map(useContext)
์ ๊ฐ์ ์ฝ๋๋ก Hooks ๊ท์น์ ์์ด์ง ์์๋ค๋ฉด ๋น์ ์ ์ด๊ฒ์ ๋ ๋นจ๋ฆฌ ์์ ์ฐจ๋ ธ์ ๊ฒ์
๋๋ค ;-)
์๋ ๋! ๋น ๋ฅธ ์๋ต์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค (: ๋ฐฉ๊ธ ์์ ํ์ต๋๋ค.
btw : useContext
( useStorage
)๋ App
๋ด๋ถ์ ์์ผ๋ฉฐ, ReactDOM.render
ํจ์์ Provider
๋ด๋ถ์ ์์ต๋๋ค. (์ด ์ค์ฒฉ์๋ณด๊ธฐ์๋ ์์ ๋ฅผ ๋๋ฌด ์งง๊ฒ ๋ง๋ค์์ ์ ์์ต๋๋ค).
ํด๊ฒฐ์ฑ :
๊ธฐ๋ฐํ .map
์ค์ ์์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. observedBits
๋งค๊ฐ ๋ณ์๋ฅผ ๋์ณค์ต๋๋ค. ๊ฒฐ๊ตญ ์ ๋ฌ๋๋ ๋งค๊ฐ ๋ณ์๋ฅผ ๋์ณค์ต๋๋ค. ์ฌ๊ธฐ Issues / PRs์์ ์ฝ์์ง๋ง ์์ด ๋ฒ๋ ธ์ต๋๋ค. ๊ตฌํํ ๋ ๋์์ ์๋ง์ผ๋ก ๋ง๋ค์์ต๋๋ค.
Aaah ๋น์ ์ด ๋ง์์ ๋น์ ์ ์๋ฅผ ์๋ชป ์ฝ์์ต๋๋ค. ๋ค, observedBits
์ด ๋ฌธ์ ์
๋๋ค. ํจ์ ์ฒ๋ผ ๋ณด์ด์ง๋ง useContext
๋์ ์ผ๋ก ํธ์ถํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
useContext
ํธ์ถ์ดProvider
๊ณผ ๋์ผํ ๊ตฌ์ฑ ์์์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฐ ์๋ฏธ์์ ๊ทธ๋ค์ ๊ณต๊ธ์ (๊ธฐ๋ณธ๊ฐ) ์ ์ ์ปจํ ์คํธ๋ฅผ ์ฝ๊ณ ์์ต๋๋ค.๊ณต๊ธ์์ ๊ฐ์น๋ ๋ด๋ถ ๊ตฌ์ฑ ์์์ ์ปจํ ์คํธ์๋ง ์ํฅ์์ค๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๋ง์ฝ ๋น์ ์ด
[A, B].map(useContext)
์ ๊ฐ์ ์ฝ๋๋ก Hooks ๊ท์น์ ์์ด์ง ์์๋ค๋ฉด ๋น์ ์ ์ด๊ฒ์ ๋ ๋นจ๋ฆฌ ์์ ์ฐจ๋ ธ์ ๊ฒ์ ๋๋ค ;-)