<< 학습 목표 >>
1. Context가 필요한 상황을 설명할 수 있다.
2. useContext 훅을 사용할 수 있다.
전 글 ( https://codingaja.tistory.com/84 ) 에서 주소록을 추가 하고 출력할 때 컴포넌트 간에 데이터를 전달하는 방법을 사용했음
1. 자식 컴포넌트에서 부모 컴포넌트로 데이터를 전달할 때는 부모 컴포넌트에서 setter 함수를 전달해야함
자식 컴포넌트는 부모 컴포넌트가 전달한 setter 함수를 사용해 값을 전달함
2. 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달할 때는 props 를 사용해 전달함
이번에는 Context 배우면서 Context와 useContext 훅으로 컴포넌트 간에 데이터를 주고 받는 방법을 배우자
우선 Context와 useContext 훅이 필요한 상황을 알아보자
우리가 지금 만들고 있는 컴포넌트 구조는 굉장히 간단함
우리가 그린 컴포넌트 구조(왼쪽 그림)를 일반적으로는 컴포넌트 트리(tree / 나무) 라고 부름
컴포넌트 트리 라고 부르는 이유는 컴포넌트 구조를 왼쪽으로 90도 틀면(오른쪽 그림) 부모 컴포넌트가 제일 밑, 자식 컴포넌트가 위로 향하는데 부모 컴포넌트가 나무의 뿌리처럼 밑에 박히고 자식 컴포넌트가 잎처럼 위로 향하기 때문
프로젝트가 점점 규모가 커져 아래와 같이 자식 컴포넌트가 생긴 상황이라고 해보자
이렇게 자식 컴포넌트가 많아진 상황을 "컴포넌트 트리가 깊어졌다" 라고 표현함
컴포넌트 트리가 깊어졌을 때 가장 마지막 자식 컴포넌트(어떤 컴포넌트4)의 값을 최상위에 있는 AddressMng 컴포넌트로 전달해야한다면?
1. AddressMng 컴포넌트에서 값을 전달 받기 위해 setter 함수를 AddressAdd 컴포넌트로 전달함
2. AddressAdd 컴포넌트는 부모 컴포넌트가 전달한 setter 함수를 어떤 컴포넌트1 자식 컴포넌트에게 전달함
3. 어떤 컴포넌트1 컴포넌트는 어떤 컴포넌트2 자식 컴포넌트에게 setter 함수를 전달함
4. 어떤 컴포넌트2 컴포넌트는 어떤 컴포넌트3 자식 컴포넌트에게 setter 함수를 전달함
5. 어떤 컴포넌트3 컴포넌트는 어떤 컴포넌트4 자식 컴포넌트에게 setter 함수를 전달함
6. 어떤 컴포넌트4 컴포넌트는 전달 받은 setter 함수를 사용해 값을 저장함
일반적인 프로젝트에서는 컴포넌트 트리가 굉장히 깊기 때문에 위 상황 보다 더 많은 컴포넌트를 거쳐야함
이렇게 최하위에 있는 자식 컴포넌트가 최상위에 있는 부모 컴포넌트로 값을 전달하는 경우에 setter 함수를 전달하려면 수도 없이 많은 컴포넌트를 거쳐야하기 때문에 하나라도 실수가 있다면 전체 프로젝트는 먹통이됨
컴포넌트 트리가 깊을 때 컴포넌트 간에 데이터를 주고 받기 위해 나온것이 Context와 useContext 훅임
Context와 useContext 훅을 사용하면 어느 컴포넌트든 컴포넌트 트리에만 있다면 Context에 값을 저장할 수 있고 Context에 저장된 값을 꺼낼 수 있음
잠깐 주소록 프로젝트는 두고 Context와 useContext 훅을 연습해보자
프로젝트 -> src -> chapter03 -> Component22.jsx 파일을 추가하고 아래 코드를 추가하자
import React from 'react';
import Component23 from './Component23';
export const MyContext = React.createContext();
function Component22() {
return(
<div>
<MyContext.Provider value="Hi">
<Component23 />
</MyContext.Provider>
</div>
);
}
export default Component22;
그리고 이어서 프로젝트 -> src -> chapter03 -> Component23.jsx 파일을 추가하고 아래 코드를 추가하자
import React, {useContext} from 'react';
import { MyContext } from './Component22';
function Component23() {
const value = useContext(MyContext);
return(
<div>
<h1>Component23 컴포넌트입니다</h1>
<p>부모 컴포넌트가 전달한 값은 {value} 입니다~!</p>
</div>
);
}
export default Component23;
<< 코드 설명 >>
(1). 부모 컴포넌트는 자식 컴포넌트들이 공용으로 사용할 변수를 선언함
이름이 MyContext인 공용 변수 선언, 일반적으로 공용 변수의 첫 글자는 컴포넌트처럼 대문자로 시작함
또한 자식 컴포넌트들이 공용 변수를 사용할 수 있도록 반드시 export 해줘야함
(2). 공용변수를 사용할 자식 컴포넌트를 지정
이 안에 있지 않은 자식 컴포넌트는 공용 변수를 사용할 수 없음
공용 변수를 사용할 권한을 주는거라고 생각하면 됨
특히, 자식 컴포넌트들을 또 다른 말로 Consumer 컴포넌트라고 부름
(3). 공용 변수를 사용할 권한이 있는 자식 컴포넌트에서 공용 변수를 사용하려면 반드시 불러와야함
(4). 불러온 공용 변수를 사용하기 위해서는 useContext 훅을 사용해 풀어 변수에 저장해야함
(5). 공용 변수로 전달 받은 값을 출력함
Context와 useContext 훅을 사용해서 컴포넌트 간에 데이터를 교환한다고 했는데 정확히 얘기하면 컴포넌트 간에 데이터를 교환하기 위해 공용 변수를 선언하는건 createContext가 담당을 하고 공용 변수를 사용하기 위해서 useContext 훅을 사용하는 것
위 코드설명의 (2) 에서 Provider의 값이 변하면 Provider 안에 있는 모든 Consumer 컴포넌트들은 재렌더링됨
여기에 useState, useEffect, useRef 등 지금까지 배운 훅들을 조합해서 활용하면 더 넓게 활용할 수 있음
'JS + React > React-Chapter03' 카테고리의 다른 글
Chapter03. 리엑트 프로젝트 / 주소록 수정, 삭제 (0) | 2023.04.03 |
---|---|
Chapter03. 리엑트 프로젝트 / 주소록 추가, 출력 개선 (0) | 2023.04.02 |
Chapter03. 리엑트 프로젝트 / 주소록 추가, 출력 (0) | 2023.04.01 |
Chapter03. 리엑트 프로젝트 / 주소록 관리 (0) | 2023.04.01 |
Chapter03. 리엑트 훅 / useRef 훅 (0) | 2023.04.01 |