일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Eclipse Bug
- gulp
- 자바스크립트
- Sass
- SSR
- 보일러플레이트
- TaskRunner
- npm
- error
- java
- Adobe
- 1분코딩
- ref전달하기
- 이클립스
- next.js
- animation
- Eclipse Compare View
- Study
- React
- 이클립스 소스 비교 안보일 때
- VW
- html
- 정적웹사이트
- frontend
- tomcat
- ref
- JavaScript
- CSS3
- css
- Eclipse
- Today
- Total
프론트 개발 블로그
Context API 본문
context 를 이용하면 컴포넌트 단계마다 props를 넘겨주지 않고도 컴포넌트 트리 전체에 데이터를 제공할 수 있다.
일반적인 React 애플리케이션에서 데이터는 위에서 아래로 props 를 통해 전달되지만,
애플리케이션 안의 여러 컴포넌트들에게 전해줘야 하는 props의 경우 이 과정이 번거로울 수 있다.
context 를 사용하면 트리마다 명시적으로 props를 넘겨주지 않아도 많은 컴포넌트가 이러한 값을 공유할 수 있다.
언제 context 를 써야 할까
하위에 있는 여러 컴포넌트들에게 props를 전달 해야 할 때 Context 를 이용하면 중간에 있는 엘리먼트들에게 props 를 넘겨 주지 않아도 전달 할 수 있다.
context 를 사용 전에 고려 해야 할 것.
context 를 사용하면 컴포넌트의 재사용이 어려워지므로 꼭 필요할 때만 사용한다.
여러 레벨에 걸쳐 props 넘기는걸 대체하는 데에 context 보다 컴포넌트 합성이 간단한 해결책일 수 있다.
그렇다면 어느정도의 단계까지 사용하는 것이 좋을까?
하위 컴포넌트 중에 재사용을 하지 않을 컴포넌트의 경우에 사용하는 것이 좋지 않을까?
Context API
- React.createContext
- Context.Provider
- Class.contextType
- Context.Consumer
- context.displayName
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import React from 'react';
const ThemeContext = React.createContext('light');
ThemeContext.displayName = 'ThemeDisplayName'; function App() {
return(
<ThemeContext.Provider value="dark">
<Toolbar />
</ThemeContext.Provider>
);
}
function Toolbar() {
return(
<ThemedButton />
);
}
class ThemedButton extends React.Component {
static contextType = ThemeContext;
render() {
return <button theme={this.context}>button</button>
}
}
export default App;
|
(context API 예시 코드)
React.createContext
context 객체를 만듭니다.
트리 상위에서 가장 가까이 있는 Provider 로부터 현재 값을 읽습니다.
createContext 의 dafualtValue 매개변수는 트리 안에서 적절한 Provider value 를 찾지 못했을 때 쓰입니다.
Context.Provider
Provider 는 context 를 구독하는 컴포넌트들에게 context의 변화를 알리는 역할을 합니다.
Provider 컴포넌트는 value props 값을 하위 컴포넌트들에게 전달합니다.
하위 컴포넌트는 value props가 바뀔 때마다 다시 렌더링 됩니다.
! 하위 컴포넌트의 렌더링을 피하는 방법
Provider 로부터 하위 Consumer 로의 전파는 shouldComponentUpdate 메서드가 적용되지 않는다.
그러므로 상위 컴포넌트의 업데이트를 건너 뛰더라도 불필요하게 하위 컴포넌트가 다시 렌더링 되는 문제가 생길 수 있다.
이를 피하기 위해서 값을 부모의 state로 끌어올려서 사용합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
value: 'dark'
}
}
render() {
return(
<ThemeContext.Provider value={this.state.value}>
<Toolbar />
</ThemeContext.Provider>
);
}
}
|
https://ko.reactjs.org/docs/context.html#caveats
Class.contextType
context 객체를 원하는 클래스의 contextType 프로퍼티로 지정할 수 있습니다.
그러면 그 클래스 안에서 this.context 를 이용해 해당 context 의 가까운 Provider 를 찾아 그 값을 읽을 수 있습니다.
이 값은 render() 메서드를 포함해 모든 생명주기 메서드에서 사용할 수 있습니다.
static contextType = ThemeContext;
위의 코드는 실험적 기능인 Public class fields syntax 의 정적 클래스 프로퍼티 입니다.
정적 프로퍼티는 프로퍼티 앞에 static이 붙으며, 클래스에서 생성하는 모든 인스턴스에 대한 필드가 아닌,
클래스마다 단 한개의 필드가 존재하기를 원할 때 유용하게 사용할 수 있습니다.
하지만 실험적 기능이므로 바벨(7이상)과 사용해야 합니다.
+ Public class fields syntax 에 대해서 더 알아보기
Context.Consumer
함수 컴포넌트 안에서 context 를 읽을 때 사용합니다.
context.consumer 의 자식은 함수이여야 하며, 이 함수는 context 의 현재 값을 받고 React 노드를 반환합니다.
이 함수가 받는 value props는 가장 가까운 Provider value props 와 동일합니다.
Context.displayName
context 객체는 displayName 문자열 속성을 설정할 수 있습니다.
React 개발자 도구에서 이 문자열을 사용하여 context 를 어떻게 보여줄 지 결정합니다.
ko.reactjs.org/docs/context.html
'React' 카테고리의 다른 글
Ref 와 DOM (0) | 2020.12.17 |
---|---|
Forwarding Refs (React.forwardRef) (0) | 2020.12.14 |
[Errer] name can no longer contain capital letters (0) | 2020.10.28 |
What is StrictMode in React? (0) | 2020.10.27 |
[Error] create-react-app / jest 설치 후 발생하는 에러 (0) | 2020.10.14 |