React Context 간단 정리

박성룡 ( Andrew park )
5 min readFeb 10, 2019

--

React 에서 일반적인 값을 자손에게 전달하는 방법은 하향식으로 전달해야한다.

전달받은 값을 자손에서 부모에게 변경하고 싶다고 알려주려면, 하향식으로 전달받은 함수를 이용해야한다.

Level 이 깊어질수록 불편함을 야기한다.

이를 해결하기위한 방법으로 flux, reflux, redux, mobx 를 이용할 수 있다.

React 16.3 부터는 Context API를 이용해서 트리의 모든 레벨에 값을 공유하는 방법을 제공한다.

Toggle 예제

// javascript
import React, { Component, useContext } from 'react';
const MyContext = React.createContext(
{
bool: true,
toggleBool: () => {},
}
);
const toggleStyle = (bool) => ({
backgroundColor: (bool ? '#000' : '#fff'),
color: (bool ? '#fff' : '#000')
});
function Button({bool, toggleBool, children}) {
return (
<button onClick={toggleBool} style={toggleStyle(bool)}>
{children}
</button>
);
}
class ContextApp extends Component {
constructor(props) {
super(props);
this.toggleBool = () => {
this.setState({bool: !this.state.bool });
};
this.state = {
bool: true,
toggleBool: this.toggleBool
};
}
render() {
return (
<div>
<MyContext.Provider value={this.state} >
<FunctionWrapper />
<ClassWrapper />
</MyContext.Provider>
</div>
);
}
}
function FunctionWrapper() {
return (
<>
<div><FunctionToggleButton /></div>
<div><HookToggleButton /></div>
</>
)
}
function FunctionToggleButton() {
return (
<MyContext.Consumer>
{({bool, toggleBool}) => (
<Button {...{toggleBool, bool}}>Function Toggle</Button>
)}
</MyContext.Consumer>
);
}
function HookToggleButton() {
const {bool, toggleBool} = useContext(MyContext);
return (
<Button {...{toggleBool, bool}}>Hook Toggle</Button>
);
}
class ClassWrapper extends Component {
render() {
return (
<div>
<ClassToggleButton />
</div>
)
}
}
class ClassToggleButton extends Component {
static contextType = MyContext;
render() {
const {bool, toggleBool} = this.context;
return (
<Button {...{toggleBool, bool}}>Class Toggle</Button>
);
}
}

React.createContext

Context 객체를 만들수 있다.

const MyContext = React.createContext(defaultValue);

Context.Provider

Provider 를 이용하여 Context 변경 사항을 자손들에게 제공 할 수 있다.

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

Provider 의 Value는 하위의 모든 Consumer 에서 사용할 수 있으며, Provider 하위의 모든 Consumer 는 Provider 의 value가 변경 될 때마다 재 렌더링 된다.

Context.Consumer

MyContext Provide의 Value의 변경 사항을 구독하며, Context 에서 가장 가까운 Provider 의 Value 를 참조한다.

<MyContext.Consumer>
{(value) => (/* render something based on the context value */)}
</MyContext.Consumer>

Class.contextType

Class 의 contextType 에 Context 객체를 할당 할 수 있다.
this.context 로 해당 Context 의 Value를 참조할 수 있다.

class Some extends Component {
static contextType = MyContext;
render() {
const value = this.context;
return {}
}
}
Some.contextType = MyContext;

Hook의 useContext

Hook의 useContext로 Context 객체의 value를 가져올 수 있다.

const value = useContext(MyContext);

문서 URL

https://reactjs.org/docs/context.html

--

--