๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋ก ํŠธ์—”๋“œ/React

Context API

by alswlfl 2022. 11. 24.

https://ko.reactjs.org/docs/context.html 

 

Context – React

A JavaScript library for building user interfaces

ko.reactjs.org

Context: ๋‹จ๊ณ„๋งˆ๋‹ค ์ผ์ผ์ด props๋ฅผ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š๊ณ ๋„ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ „์ฒด์— ๋ฐ์ดํ„ฐ ์ œ๊ณต

๐Ÿ’ก React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ props ์ „๋‹ฌ ๋ฐฉ์‹: ์œ„์—์„œ ์•„๋ž˜๋กœ(๋ถ€๋ชจ์—์„œ ์ž์‹์œผ๋กœ)
→ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์˜ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋“ค์— ์ „๋‹ฌํ•ด์ค˜์•ผ ํ•˜๋Š” props์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ณผ์ • ๋ฒˆ๊ฑฐ๋กœ์›€
โญ๏ธ context ์ด์šฉํ•˜์—ฌ ํŠธ๋ฆฌ ๋‹จ๊ณ„๋งˆ๋‹ค ๋ช…์‹œ์ ์œผ๋กœ props๋ฅผ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š์•„๋„ ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•ด๋‹น ๊ฐ’ ๊ณต์œ  ๊ฐ€๋Šฅ

โ—๏ธํŠน์ • ํ•จ์ˆ˜๋ฅผ ํŠน์ • ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑฐ์ณ์„œ ์›ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์ž‘์—…์ด 3~4๊ฐœ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑฐ์ณ์„œ ์ „๋‹ฌ ํ•ด์•ผํ•˜๋Š” ์ผ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ๋ฒˆ๊ฑฐ๋Ÿฌ์›€

→ ๋ฆฌ์•กํŠธ์˜ Context API์™€ dispatch ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ

Context API

  • ํ”„๋กœ์ ํŠธ ์•ˆ์—์„œ ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’ ๋˜๋Š” ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ → ๊ฐ’์€ ํ•จ์ˆ˜์ผ ์ˆ˜ ์žˆ๊ณ , ์–ด๋–ค ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ธ์Šคํ„ด์Šค์ผ ์ˆ˜ ์žˆ๊ณ , DOM์ผ ์ˆ˜ ์žˆ์Œ
  • ์ƒˆ๋กœ์šด Context๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•
    • const UserDispatch = React.createContext(null);
    • createContext์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์—๋Š” Context์˜ ๊ธฐ๋ณธ ๊ฐ’ ์„ค์ • ๊ฐ€๋Šฅ(์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ
  • Provider ์ปดํฌ๋„ŒํŠธ: Context์˜ ๊ฐ’ ์ •ํ•จ
    • <UserDispatch.Provider value={dispatch}>…</UserDispatch.Provider>
    • value๋ผ๋Š” ๊ฐ’ ์„ค์ •
    • Provider์— ์˜ํ•ด ๊ฐ์‹ธ์ง„ ์ปดํฌ๋„ŒํŠธ ์ค‘ ์–ด๋””์„œ๋“ ์ง€ Context์˜ ๊ฐ’์„ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ฐ”๋กœ ์กฐํšŒํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
export const UserDispatch = React.createContext(null);

return (
    <UserDispatch.Provider value={dispatch}>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} onToggle={onToggle} onRemove={onRemove} />
      <div>ํ™œ์„ฑ์‚ฌ์šฉ์ž ์ˆ˜: {count}</div>
    </UserDispatch.Provider>
  );
  • ์–ด๋””์„œ๋“ ์ง€ dispatch ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ์Œ
  • ๋‚˜์ค‘์— ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ, ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•
    • import { UserDispatch } from ‘./App’;

[์‚ฌ์šฉํ•˜๊ธฐ]

import React, { useContext } from "react";
import { UserDispatch } from "./App";

const User = React.memo(function User({ user }) {
  const dispatch = useContext(UserDispatch);
  return (
    <div>
      <b
        style={{ cursor: "pointer", color: user.active ? "green" : "black" }}
        onClick={() => {
          dispatch({ type: "TOGGLE_USER", id: user.id });
        }}
      >
        {user.username}
      </b>
      &nbsp;
      <span>({user.email})</span>
      <button
        onClick={() => {
          dispatch({ type: "REMOVE_USER", id: user.id });
        }}
      >
        ์‚ญ์ œ
      </button>
    </div>
  );
});

'ํ”„๋ก ํŠธ์—”๋“œ > React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ  (0) 2022.12.02
Immer  (0) 2022.11.24
์ปค์Šคํ…€ Hooks ๋งŒ๋“ค๊ธฐ  (0) 2022.11.24
useReducer  (0) 2022.11.24
useCallback, React.memo  (0) 2022.11.24