일단 하다보면 되겠지 ^v^ 자세히보기

React

[React] React Hook - useContext & Context API

뉴욕치킨 2022. 7. 27. 17:57

useContext 를 사용해야하는 이유

React 컴포넌트는 부모에서 자식으로 props 를 통해 데이터를 전달해야한다.

 

이때, 컴포넌트의 수가 많아지고 트리 구조가 복잡해지면

단계별로 데이터를 전달해야하는 리액트에서 코드는 굉장히 복잡해지기 마련이다.

 

중간에 코드가 바뀌게 된다면 일일히 다 찾아 바꿔야하기도 하고,

해당 데이터가 필요하지 않은 컴포넌트에도 데이터가 전달되어 코드가 지저분해지기도 한다.

 

이런 문제를 해결하기 위해 우리는 useContext 를 사용한다.

전역적으로 사용되는 데이터들을 공유해 최상단 컴포넌트에서 최하단 컴포넌트 까지 데이터 전달을 손쉽게 할 수 있다.

ex) 유저 정보, 테마, 언어, ...

 

하지만 Context 를 사용하게 된다면 컴포넌트의 재사용성이 떨어지므로 잘 생각하고 써야한다!

useContext 사용하기

유저 데이터를 반환하는 context 를 예시로 작성했다.

모든 코드는 해당 게시글 하단에 있는 링크에서 확인 가능하다! 직접 써보기도 가능!!

 

1. 전역으로 사용할 context 객체 생성

나는 context 객체를 루트 경로에 context 폴더를 새로 생성해 그 안에 선언했다.

 

아래의 형태로 선언을 해준다.

초기값은 Provider를 사용하지 않았을 때 적용되는 값이다.

createContext(초기값);

 

사용해보자! 나는 빈값을 정해줬다.

// src/context/UserContext.js

import { createContext } from "react";

export const UserContext = createContext("");

 

2. 최상단 컴포넌트에 선언

<UserContext.Provider> 로 감싸준 모든 하위 컴포넌트들은 value 로 넣어준  userDatasetUserData에 접근할 수 있게 된다! 

 

만약 초기값이 정해져 있다면 Provider와 value 를 생략해도 된다.

하지만 난 최상단 컴포넌트에서 값을 지정해 줬으므로 Provider 와 value 를 사용한다.

// src/App.js

import { UserContext } from "./context/UserContext";
import { useState } from "react";

function App() {
  const [userData, setUserData] = useState("");

  return (
    <div className="App">
      <UserContext.Provider value={{ userData, setUserData }}>
        <Page />
      </UserContext.Provider>
    </div>
  );
}

 

 

3. 상위에서 선언된 데이터 가져오기

가져오고 싶은 상위 데이터는 useContext를 선언해 가져오면 된다!

객체 형태로 넘어 온다는 것을 잊지 말자.

// src/component/UseContext2.js

import { useContext } from "react";
import { UserContext } from "../context/UserContext";

export default function UseContext2() {
  const { userData, setUserData } = useContext(UserContext);

  const Login = () => {
    setUserData("NYCHicken");
  };

  const Logout = () => {
    setUserData("");
  };

  return (
    <div>
      <div className="description context-example">
        {userData === "" ? "로그인해주세요" : <HelloUser userData={userData} />}{" "}
      </div>
      <div className="btn-wrap">
        <button onClick={Login}>LOGIN</button>
        <button onClick={Logout}>LOGOUT</button>
      </div>
    </div>
  );
}

function HelloUser(props) {
  return <>{props.userData}님 반갑습니다!</>;
}

 

useContext 예제 코드 페이지

UseContext.js 와 UseContext2.js 및 context 폴더 확인!

 

https://github.com/mirro97/react-playground/tree/main/src/component

 

GitHub - mirro97/react-playground

Contribute to mirro97/react-playground development by creating an account on GitHub.

github.com

 

useContext 예제 테스트 페이지

뭐든 직접 돌려봐야 이해가 간다. 돌려보자!

https://mirro97.github.io/react-playground-result/

 

'React' 카테고리의 다른 글

[React] React Hook - useMemo  (0) 2022.07.28
[React] React Hook - useRef  (0) 2022.07.25
[React] React Hook - useEffect  (0) 2022.07.25
[React] React 시작하기(9) - 합성  (0) 2022.07.20
[React] React 시작하기(8) - state 끌어올리기  (0) 2022.07.19