React: ํ›„ํฌ : useState๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์€ useContext

์— ๋งŒ๋“  2019๋…„ 01์›” 26์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react

๊ธฐ๋Šฅ ์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ๋ฒ„๊ทธ๋ฅผ๋ณด๊ณ  ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋ฒ„๊ทธ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๐Ÿ˜•

ํ˜„์žฌ ํ–‰๋™์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ค‘์ฒฉ ์ปจํ…์ŠคํŠธ ๊ณต๊ธ‰์ž์™€ useContext ํ›„ํฌ๊ฐ€ ์ถฉ๋Œํ•˜๋Š” ๊ฒƒ ๊ฐ™๊ณ  ์—…๋ฐ์ดํŠธ๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ปจํ…์ŠคํŠธ์— ์—ฐ๊ฒฐํ•  ๋•Œ value ๋ณ€๊ฒฝ ๋  ๋•Œ๋งˆ๋‹ค ์—…๋ฐ์ดํŠธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๋ฒ„์ „์˜ React์™€ ์–ด๋–ค ๋ธŒ๋ผ์šฐ์ € / OS๊ฐ€์ด ๋ฌธ์ œ์˜ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๊นŒ?

  • ๋ฐ˜์‘ : 18.8.0-alpha.1 ( 16.7.0-alpha.0 ์—์„œ๋„ ์žฌํ˜„ ๋จ)
  • ๋ธŒ๋ผ์šฐ์ € : chrome 71
  • os : macOS Sierra

์ž์„ธํ•œ ๋‚ด์šฉ์€

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


hlcecpq

Question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” codesandbox [3]์— ๋Œ€ํ•œ ๊ฐ„์†Œํ™” ๋œ ๋ฐ๋ชจ๋ฅผ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.

useContext ํ˜ธ์ถœ์ด Provider ๊ณผ ๋™์ผํ•œ ๊ตฌ์„ฑ ์š”์†Œ์—์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์˜๋ฏธ์—์„œ ๊ทธ๋“ค์€ ๊ณต๊ธ‰์ž (๊ธฐ๋ณธ๊ฐ’) ์œ„ ์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต๊ธ‰์ž์˜ ๊ฐ€์น˜๋Š” ๋‚ด๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ปจํ…์ŠคํŠธ์—๋งŒ ์˜ํ–ฅ์„์ค๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๋งŒ์•ฝ ๋‹น์‹ ์ด [A, B].map(useContext) ์™€ ๊ฐ™์€ ์ฝ”๋“œ๋กœ Hooks ๊ทœ์น™์„ ์†์ด์ง€ ์•Š์•˜๋‹ค๋ฉด ๋‹น์‹ ์€ ์ด๊ฒƒ์„ ๋” ๋นจ๋ฆฌ ์•Œ์•„ ์ฐจ๋ ธ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ;-)

๋ชจ๋“  3 ๋Œ“๊ธ€

๋‚˜๋Š” codesandbox [3]์— ๋Œ€ํ•œ ๊ฐ„์†Œํ™” ๋œ ๋ฐ๋ชจ๋ฅผ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.

useContext ํ˜ธ์ถœ์ด Provider ๊ณผ ๋™์ผํ•œ ๊ตฌ์„ฑ ์š”์†Œ์—์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์˜๋ฏธ์—์„œ ๊ทธ๋“ค์€ ๊ณต๊ธ‰์ž (๊ธฐ๋ณธ๊ฐ’) ์œ„ ์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต๊ธ‰์ž์˜ ๊ฐ€์น˜๋Š” ๋‚ด๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ปจํ…์ŠคํŠธ์—๋งŒ ์˜ํ–ฅ์„์ค๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๋งŒ์•ฝ ๋‹น์‹ ์ด [A, B].map(useContext) ์™€ ๊ฐ™์€ ์ฝ”๋“œ๋กœ Hooks ๊ทœ์น™์„ ์†์ด์ง€ ์•Š์•˜๋‹ค๋ฉด ๋‹น์‹ ์€ ์ด๊ฒƒ์„ ๋” ๋นจ๋ฆฌ ์•Œ์•„ ์ฐจ๋ ธ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ;-)

์•ˆ๋…• ๋Œ„! ๋น ๋ฅธ ์‘๋‹ต์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค (: ๋ฐฉ๊ธˆ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

btw : useContext ( useStorage )๋Š” App ๋‚ด๋ถ€์— ์žˆ์œผ๋ฉฐ, ReactDOM.render ํ•จ์ˆ˜์˜ Provider ๋‚ด๋ถ€์— ์žˆ์Šต๋‹ˆ๋‹ค. (์ด ์ค‘์ฒฉ์„๋ณด๊ธฐ์—๋Š” ์˜ˆ์ œ๋ฅผ ๋„ˆ๋ฌด ์งง๊ฒŒ ๋งŒ๋“ค์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).


ํ•ด๊ฒฐ์ฑ… :

๊ธฐ๋ฐœํ•œ .map ์ค„์„ ์ˆ˜์ •ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. observedBits ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ „๋‹ฌ๋˜๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ Issues / PRs์—์„œ ์ฝ์—ˆ์ง€๋งŒ ์žŠ์–ด ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•  ๋•Œ ๋™์ž‘์„ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

Aaah ๋‹น์‹ ์ด ๋งž์•„์š” ๋‹น์‹ ์˜ ์˜ˆ๋ฅผ ์ž˜๋ชป ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๋„ค, observedBits ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํ•จ์ •์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ useContext ๋™์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰