Notice
Recent Posts
Recent Comments
Link
관리 메뉴

브래의 슬기로운 코딩 생활

모바일 웹 구축 실무 11주차 정리 - 2 (컨텍스트(Context)) 본문

2-2/모바일 웹 구축 실무

모바일 웹 구축 실무 11주차 정리 - 2 (컨텍스트(Context))

김브래 2023. 11. 12. 00:26

컨텍스트(Context)




컨텍스트란 무엇인가?


컴포넌트 간 데이터 전달 방식

리액트 컴포넌트 사이에서 props 통해 데이터를 전달하는 방식

부모에서 자식으로 단방향 전달

여러 컴포넌트에 걸쳐 자주 사용되는 데이터의 경우 depth가 깊어질수록 반복적인 코드 생성, 사용하기 불편

 

Context

- React 컴포넌트 트리 안에서 전역적으로 데이터를 공유할 수 있도록 고안된 방법
- 컴포넌트 트리를 통해 곧바로 컴포넌트에 데이터를 전달하는 방식

어떤 컴포넌트든지 데이터에 쉽게 접근할 수 있음

데이터를 한곳에서 관리 - 코드가 단순해지고 디버깅에 유리


언제 컨텍스트를 사용해야 할까?


여러 컴포넌트에서 자주 사용하는 데이터를 사용할 경우

사용자의 로그인 여부, 로그인 정보, UI 테마, 현재 선택된 언어

 

ex. 네비게이션 바에서 사용자의 로그인 여부에 따라 로그인/로그아웃 버튼 표시


컨텍스트를 사용하기 전에 고려할 점


context의 주된 용도 고려

- context는 다양한 레벨에 네스팅된 많은 컴포넌트에게 데이터를 전달하는 용도

- context 사용 시 컴포넌트 재사용이 어려워질 수 있음

- 꼭 필요한 경우에만 context 사용하고 컴포넌트 합성 방법 사용


Context API


Context.Provider

Context 객체에 포함된 React 컴포넌트로 데이터 제공자 역할

Context.Provider 하위 컴포넌트들은 해당 context의 데이터에 접근 가능

value prop을 받아서 이 값을 하위 컴포넌트에게 전달

context 구독하는 컴포넌트들(consumer)에게 context의 변화를 알리는 역할

- consumer 컴포넌트는 providervalue prop이 변경되면 재렌더링

 

하나의 Provider 컴포넌트는 여러 개의 consumer와 연결될 수 있으며 중첩되어 사용 가능

 

Context.Consumer

context의 데이터를 구독하는 React 컴포넌트

-함수 컴포넌트에서 context 구독에 사용

-컴포넌트의 자식은 함수(function as a child)

- 현재 contextvalue 받아서 React 노드를 반환

- valuecontextProvider 중 가장 가까운 Providervalue prop과 동일

- 상위 컴포넌트에 Provider가 없다면 createContext()defaultValue 값과 동일

 

Context.displayName

크롬의 리액트 개발자 도구에서 context 표시할 때 이 displayName을 표시

useContext


함수 컴포넌트에서 컨텍스트를 쉽게 이용하기 - useContext hook

useContext() 훅은 context 객체를 인자로 받아서 현재 value 값을 리턴

-컴포넌트 트리상에서 가장 가까운 상위 Provider로부터 contextvalue 값을 받아 옴
-context 값이 변경되면 변경된 값과 함께 useContext() 훅을 사용하는 컴포넌트가 재랜더링


[요약]


컨텍스트란?

컴포넌트들 사이에서 데이터를 props 통해 전달하는 것이 아닌 컴포넌트 트리를 통해 곧바로 데이터를 전달하는 방식
어떤 컴포넌트든지 컨텍스트에 있는 데이터에 쉽게 접근할 수 있음

언제 컨텍스트를 사용해야 할까?

여러 컴포넌트에서 계속해서 접근이 일어날 수 있는 데이터들이 있는 경우
Provider의 모든 하위 컴포넌트가 얼마나 깊이 위치해 있는지 관계없이 컨텍스트의 데이터를 읽을 수 있음

컨텍스트 사용 전 고려할 점

컴포넌트와 컨텍스트가 연동되면 재사용성이 떨어짐
다른 레벨의 많은 컴포넌트가 데이터를 필요로 하는 경우가 아니라면, 기존 방식대로 props 통해 데이터를 전달하는 것이 더 적합

Context API

React.createContext()

컨텍스트를 생성하기 위한 함수
컨텍스트 객체를 리턴함
기본값으로 underined 넣으면 기본값이 사용되지 않음

Context.Provider

모든 컨텍스트 객체는 Provider라는 컴포넌트를 갖고 있음
Provider 컴포넌트로 하위 컴포넌트들을 감싸주면 모든 하위 컴포넌트들이 해당 컨텍스트의 데이터에 접근할 수 있게 됨
Provider에는 value라는 prop이 있으며, 이것이 데이터로써 하위에 있는 컴포넌트들에게 전달됨
여러 개의 Provider 컴포넌트를 중첩시켜 사용할 수 있음

Context.Consumer

컨텍스트의 데이터를 구독하는 컴포넌트
데이터를 소비한다는 뜻에서 consumer 컴포넌트라고도 부름
consumer 컴포넌트는 컨텍스트 값의 변화를 지켜보다가 값이 변경되면 재랜더링
하나의 Provider 컴포넌트는 여러 개의 consumer 컴포넌트와 연결될 수 있음
상위 레벨에 매칭되는 Provider가 없을 경우 기본값이 사용됨

Context.displayName

크롬의 리액트 개발자 도구에서 표시되는 컨텍스트 객체의 이름

useContext()

함수 컴포넌트에서 컨텍스트를 쉽게 사용할 수 있게 해주는 훅
React.createContext() 함수 호출로 생성된 컨텍스트 객체를 인자로 받아서 현재 컨텍스트의 값을 리턴
컨텍스트의 값이 변경되면 변경된 값과 함께 useContext() 훅을 사용하는 컴포넌트가 재렌더링