💎 React

React - Context

ji-hyun 2022. 3. 7. 19:58

리액트에서 데이터 흐름을 컨트롤 하는 방법(state 관리하는 법)은 여러가지가 있다.

 

  • state 와 props 를 사용해서 컴포넌트 간에 전달
  • React Context 사용
  • mobx 사용
  • redux를 사용
  • 등등등...

 

 

 

 

이중에서 우리는 Context 에 대해서 알아보자.

 

 

 

 

Context

context를 이용하면 단계마다 일일이 props를 넘겨주지 않고도 컴포넌트 트리 전체에 데이터를 제공할 수 있다.

일반적인 React 애플리케이션에서 데이터는 위에서 아래로 (즉, 부모로부터 자식에게) props를 통해 전달되지만, 애플리케이션 안의 여러 컴포넌트들에 전해줘야 하는 props의 경우 (예를 들면 선호 로케일, UI 테마) 이 과정이 번거로울 수 있다. context를 이용하면, 트리 단계마다 명시적으로 props를 넘겨주지 않아도 많은 컴포넌트가 이러한 값을 공유하도록 할 수 있다.

 

 

 

 

 

예제

context 를 사용해서 컴포넌트에 데이터 제공하기

 

애플리케이션에서 데이터를 처리하는 법은 여러가지 방법있다. 이 앱에서 보면 여행 상품을 계산하는 데이터를 처리해줘야 한다. 여행 상품을 추가할수록 그에 맞게 가격을 올려줘야 하고 옵션을 추가해도 올려줘야한다. 그리고 총 가격을 상품 주문 페이지에서도 보고 주문 확인 페이지에서 봐야하기 때문에 데이터를 여러곳에 이동해주어야 한다.

 

 

하나의 주문페이지에 많은 컴포넌트가 존재할 수 있다.

하나의 주문페이지 orderPage 에는

Products 컴포넌트-  상품과 상품 개수를 조절하는 칸이 존재

Options 컴포넌트 - 옵션을 추가하는 항목 존재

 

이 그림에서와 같이 한페이지에 컴포넌트가 많을 경우, A 컴포넌트에서 E 컴포넌트로 전달해주려면 A->B->D->E 혹은 E->D->B->A로 전달하는 하는 과정을 거치게 된다. 뿐만 아니라 다른 페이지에 전달해주려면 더 복잡한 과정을 거치게 되겠다.

 

 

 

 

 

 

간단한 예제

 

 

context 를 사용하려면 context 를 먼저 생성해야 하겠다.

이때 필요한건 createContext

 

// 이 파일은 context 파일이라고 생각하면 됨
import React, { createContext } from "react";

export const UserContext = createContext();   // context 생성

const UserStore = (props) => {

	const users = {
    		name: 'jihyun',
        	age: 26
    	}
        
    return <UserContext.Provider value={users}>{props.children}</UserContext.Provider>
    // value 안에 전달하고 싶은 값(객체 형태)을 넣어준다
    // Provider 사이에는 props.children 을 사용해서 하위 컴포넌트를 랜더링 해주는 것
}

export default UserStore;

 

 

해당 context 파일은 위와 같이 만들면 된다.

 

 

 

이론 설명)

context 를 만들고 어떤 특정한 컴포넌트를 연결하면 그 하위에 있는 모든 컴포넌트들은 context 에 대해 접근이 가능하다.

그래서 About, Profile 이라는 컴포넌트가 있고 최상위 컴포넌트는 App 이라고 가정할 때 이 App 에 context 를 연결해보자.

 

 

 

 

 

 

 

// 최상위인 App 컴포넌트
import React from "react";
import { BrowserRouter as Router, Route, Switch ] from "react-router-dom";
import { About } from "./pages/About";
import { Profile } from "./pages/Profile";
import { UserStore } from "./store/users";

export default function App(){
	return (
    	<UserStore>
        	<Router>
        	<Switch>
        		<Route path="/about">
        			<About>
        		</Route>
        		<Route path="/profile">
        			<Profile>
        		</Route>
        	</Switch>
        	</Router>
        </UserStore>
    )
}

 

App 과 context 를 연결해주자

위에서 만들어뒀던 context 파일인 UserStore 를 import 해서 불러온다.

그리고 이걸 바깥에다가 감싸준다.

 

 

 

 

 

이제 감싸져있는 하위 컴포넌트에서 context 에 있는 값을 불러와주자.

이때 필요한건 useContext

 

 

context 를 생성할 때는 createContext(), 불러올 때는 useContext()

 

 

 

import React, { useContext } from "react";
import { UserContext } from "../store/users";

export default function About(){
	const context = useContext(UserContext);
    	console.log(context);    // 반환값은 우리가 사용하고자 했던 객체를 반환 = users
    
    return (
    	<div>
        	<h3>About</h3>
            	<span>{context.name}</span>
        </div>
    );
}

 

반환값

Object { name: 'jihyun', age:26 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'💎 React' 카테고리의 다른 글

리액트 Context API, reducer  (0) 2022.03.24
React - reducer  (0) 2022.03.08
MakeStyle 이 뭘까  (0) 2022.03.05
React + Node Express 필터링  (0) 2022.03.01
리액트 페이지네이션 - Query Parameter  (0) 2021.12.26