본문 바로가기

프론트엔드/React.js

Context

React Context란?

React에서 한 컴포넌트 안에서 데이터를 생성하거나 업데이트하거나 다른 컴포넌트와 데이터를 공유해서 사용하는 방법은 여러 가지가 있습니다.

 

react에서 데이터 흐름 컨트롤 하는 법(state관리하는 법)

  • state와 props를 사용해서 컴포넌트 간에 전달
  • react context 사용
  • mobx 사용
  • redux를 사용

 

react context는 component 트리의 깊이에 관계없이 props를 전달하지 않고도 component에 데이터를 제공합니다.

context 전역 데이터를 관리하는 데 사용됩니다. ex) 전역 상태, 테마, 서비스, 사용자 설정 등...

context는 모든 수준에서 수동으로 props를 전달하지 않고도 구성 요소 트리를 통해 데이터를 전달할 수 있는 방법을 제공합니다.

React.createContext

const MyContext = React.createContext(defaultValue);

context 객체를 만듭니다. react가 이 context 객체를 구독하는 구성 요소를 렌더링할 때 트리에서 그 위에 가장 근접하게 일치하는 Provider에서 현재 context값을 읽습니다.

defaultValue 인수는 트리에서 구성 요소 위에 일치하는 공급자가 없는 경우에만 사용됩니다.

 

Context.Provider

<MyContext.Provider value={ /* some value */}>

모든 context 객체에는 consumer 컴포넌트가 context 변경 사항을 구독할 수 있도록 하는 Provider react 구성 요소가 함께 제공됩니다.

A, B, C컴포넌트 모두 다 context를 구독중입니다. 그래서 context value에 변경 사항이 생기면 컴포넌트를 다시 렌더링 합니다.

변경 사항은 Object.is와 동일한 알고리즘을 사용하여 새 값과 이전 값을 비교하여 결정됩니다.

 

만약 createContext를 할 때 defaultValue를 { userName: "John" }이라고 했더라도

Context.Provider value props에서 { userName: "Han" }이라고 전달해주면

두 번째 value가 Consumer 컴포넌트 틀에 전달됩니다. (Provider 사용으로 context의 value를 변경해줄 수 있음)

const MyContext = React.createContext({ userName: "John" });
<MyContext.Provider value={{ userName: "Han" }}>

위 코드 같은 경우, createContext에서 John을 전달했지만, Provider에는 Han으로 전달했습니다.

결국 A, B, C컴포넌트는 Han으로 받습니다.

 

Class.contextType

클래스의 contextType 속성에는 React.createContext()에 의해 생성된 Context 객체가 할당될 수 있습니다.

이 속성을 사용하면 this.context를 사용하여 context 유형의 가장 가까운 현재 value를 사용할 수 있습니다.

렌더링 기능을 포함한 모든 수명 주기 메서드에서 이를 참조할 수 있습니다.

 

object.is vs ===

object.is 는 SameValue Algorithm입니다. ===는 Strict Equality Algorithm입니다.

둘은 비슷하지만 차이 조금 있습니다.

숫자를 비교할 때 ===는 -0와 +0를 구별할 수 없습니다.

 

useContext Hook 사용하기

클래스 컴포넌트에서 context value를 사용하려면 contextType property를 사용해야 합니다.

함수형 컴포넌트는 useContext Hook을 사용합니다.

const value = useContext(MyContext);

context 객체(React.createContext에서 반환된 값)을 인수로 가지고 현재 context value를 반환합니다.

현재 context value는 트리에서 호출 구성 요소 위에 가장 가까운 <MyContext.Provider>의 value prop에 의해 결정됩니다.

 

컴포넌트 위에 가장 가까운 <MyContext.Provider>가 업데이트되면 이 Hook은 해당 MyContext Provider에게 전달된 최신 context value로 다시 렌더링을 트리거합니다.

 

사용 예시

① createContext API를 이용해서 context 생성하기

context value를 공유하기 원하는 컴포넌트를 Context.Provider로 감싸주기 또한 공유하기 원하는 value를 value props으로 전달해주기

③ 해당 컴포넌트에서 context value를 사용하기 위해서 useContext Hook을 이용해주기

'프론트엔드 > React.js' 카테고리의 다른 글

redux toolkit - API들  (0) 2023.09.23
Redux  (0) 2023.09.23
React Portal로 모달 생성하기  (0) 2023.09.16
useRef  (0) 2023.09.15
React Router Dom  (0) 2023.09.14