Home ContextApi란
Post
Cancel

ContextApi란

ContextApi란?

기존에 Prop drilling로 불필요한 컴포넌트에도 값을 넘겨주는 것은 props가 변경되면 불필요하게 수정해야하는 공수가 너무 많이 들게된다.

그것을 해결하는 방법으로 React에서 Context를 만들었다.

😎 예시

1
2
3
4
5
6
7
8
9
10
// Context 생성
import { createContext } from "react";

export interface AppContextInterface {
  isDark: boolean;
  setIsDark: Function;
}

export const AppContext = createContext<AppContextInterface | null>(null);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Context 사용
import { useContext } from "react";
import { AppContext } from "../context/contextApiContext";

function Header() {
  const appContext = useContext(AppContext);

  return (
    <div style=>
      HIHI
    </div>
  );
}

export default Header;

App.tsx에서는 Props로 하위 컴포넌트에 값을 넘길 필요가 없다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// App.tsx
import React, { useState } from "react";
import logo from "./logo.svg";
import "./App.css";
import { AppContext, AppContextInterface } from "./context/contextApiContext";
import Header from "./component/Header";
import Content from "./component/Content";

function App() {
  const [isDark, setIsDart] = useState(false);

  const appContext: AppContextInterface = {
    isDark: isDark,
    setIsDark: setIsDart,
  };

  const changeMode = (): void => {
    setIsDart(!isDark);
  };

  return (
    <AppContext.Provider value={appContext}>
      <Header></Header>
      <Content></Content>
      <button onClick={changeMode}></button>
    </AppContext.Provider>
  );
}

export default App;

⚠ 주의점

“No Sliver Bullet(은탄환은 없다)”라는 말이 있듯이, 좋아보이는 Context를 남용하면, Component를 재사용하기 어려워 질 수 있다.

따라서, Prop drilling을 피하기 위한 목적이라면 Context가 아닌 Component Composition(합성)으로 문제를 해결하는 것이 더 바람직하다.

This post is licensed under CC BY 4.0 by the author.