<aside> ๐Ÿ’ก

์•„๋ž˜ ๋‚ด์šฉ์€

https://github.com/To-Letter/To-Letter-front ๋ ˆํฌ์ง€ํ† ๋ฆฌ

useContext - ์ปค๋ฐ‹ ๋ฒˆํ˜ธ a15156138a7871b3e7bc616b2153e8f30f05e7d3

๋ฅผ ์˜ˆ์‹œ๋กœ ์ž‘์„ฑ

</aside>

useContext


react์—์„œ ์ปจํ…์ŠคํŠธ(Context) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ์ „์—ญ์ ์œผ๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Hook

์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์—์„œ ๋ถ€๋ชจ- ์ž์‹ ๊ฐ„์˜ ๊นŠ์ด ์žˆ๋Š” prop ์ „๋‹ฌ์„ ์ƒ๋žตํ•˜๊ณ  ์ƒํƒœ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

useContext ๋™์ž‘ ๊ตฌ์กฐ

  1. Context ์ƒ์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด React.createContext()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ

    ์ด ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์†Œ๋น„ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ

    ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋ฉฐ react ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๊ฐ€ ์ด ๊ฐ’์„ ์ฐธ์กฐ ๊ฐ€๋Šฅ

    ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์†์„ฑ์„ ํฌํ•จ

    1. Provider: ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ์—ญํ• , ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ์ปจํ…์ŠคํŠธ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์—ญํ• 
    2. Consumer: ๊ฐ’์„ ์†Œ๋น„ํ•˜๋Š” ์—ญํ• , useContext๋ฅผ ํ†ตํ•ด ์ปจํ…์ŠคํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฐ€๋Šฅ
    interface MenuContextProps {
      menuNumber: number;
      setMenuNumber: React.Dispatch<React.SetStateAction<number>>;
    };
    
    export const MenuContext = createContext<MenuContextProps | undefined>(
      undefined
    );
    
  2. Provider๋กœ ๊ฐ’ ์ œ๊ณต ์ƒ์„ฑ๋œ ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด์—๋Š” Provider ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Œ

    ์ด Provider๋Š” react ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ์ƒ์œ„์— ์œ„์น˜ํ•˜๋ฉฐ, ์ปจํ…์ŠคํŠธ์˜ ๊ฐ’ ์„ค์ • ๋ฐ ํ•ด๋‹น ๊ฐ’์„ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋“ค์— ์ œ๊ณตํ•˜๋Š” ์—ญํ• 

    Provider๋Š” value๋ผ๋Š” ์†์„ฑ์„ ํ†ตํ•ด ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •, ์ด ๊ฐ’์€ react ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ํ• ๋‹น๋จ

    export const MenuProvider: React.FC<{ children: ReactNode }> = ({
      children,
    }) => {
      const [menuNumber, setMenuNumber] = useState<number>(1);
    
      return (
        <MenuContext.Provider value={{ menuNumber, setMenuNumber }}>
          {children}
        </MenuContext.Provider>
      );
    };
    
  3. useContext(Consumer ์—ญํ• **)๋กœ ๊ฐ’ ์†Œ๋น„** ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ useContext(MyContext)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด React๋Š” ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ƒ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด Provider๋ฅผ ์ฐพ์•„ ํ•ด๋‹น Provider์˜ value๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค

    ์ด ๊ฐ’์€ React์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ๋ Œ๋”๋ง์„ ํ†ตํ•ด ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ์ตœ์‹  ๊ฐ’์„ ์ฐธ์กฐ

    const { menuNumber, setMenuNumber } = useContext(MenuContext)!;
    // menuNumber: ํ˜„์žฌ ๋ฉ”๋‰ด ๋ฒˆํ˜ธ
    // setMenuNumber: ๋ฉ”๋‰ด ๋ฒˆํ˜ธ ๋ณ€๊ฒฝ
    
  4. Context ๋ณ€๊ฒฝ ์‹œ ์ž๋™ ๋ฆฌ๋ Œ๋”๋ง Provider์˜ value ๊ฐ’( menuNumber, setMenuNumber)์ด ๋ณ€๊ฒฝ๋˜๋ฉด, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž๋™์œผ๋กœ ๋ฆฌ๋ Œ๋” ๋จ, ์ด๋Š” React์˜ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™

    ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” value๊ฐ€ ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค ์ตœ์‹  ๊ฐ’์„ ๋ฐ›๊ฒŒ ๋จ.

useContext ๋ฆฌ๋žœ๋”๋ง

**useContext**๋Š” React์—์„œ ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•

**useContext**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœย props๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ,ย context ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ด๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๊ตฌ์กฐ.

๋ฆฌ๋ Œ๋”๋ง ๊ณผ์ •:

์ด๋กœ ์ธํ•ด ๊ตฌ๋…ํ•œ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ๋‹ค์‹œ ๋ Œ๋”๋ง๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฆฌ๋ Œ๋”๋ง ๋ฒ”์œ„๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•˜๊ธฐ ์–ด๋ ค์›€. ์ฆ‰, ๋ฆฌ๋ Œ๋”๋ง์„ ์ตœ์ ํ™”ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉดย **useMemo**๋‚˜ย **React.memo**์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.

์„ฑ๋Šฅ ๋ฌธ์ œ:

์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๊ตฌ๋… ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย ๋ชจ๋“  ๊ตฌ๋… ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.