접근 방법 3가지
1. consumer
2. useContext
3. contexttype
import React, { Component, Fragment } from 'react';
import Button from "./components/Button";
import Title from "./components/Title";
import Message from "./components/Message";
class App extends Component{
state = {lang: "en"};
toggleLang = () =>{
this.setState(({lang}) => ({
lang: lang === "en"? "kr" : "en"
}));
};
render() {
const {lang} = this.state;
return (
<Fragment>
<Button lang={lang} toggleLang={this.toggleLang} />
<Title lang={lang} />
<Message lang={lang} />
</Fragment>
);
}
}
export default App;
Button.js
import React from "react";
// lang이 변수, toggleLang이 함수
function Button({lang, toggleLang}){
return <button onClick={toggleLang}>{lang}</button>;
}
export default Button;
Message.js
import React, {Component} from "react";
class Message extends Component{
render(){
const {lang} = this.props;
if(lang === "en")
return(
<p>
"Context provides a way to pass data through the component tree
without having to pass props down manually at every level"
</p>
);
else
return(
<p>
"컨텍스트는 모든 레벨에서 이일이 props를 넘기지 않고도 컴포넌트 트리에
걸쳐서 데이터를 전달할 수 있는 방법을 제공합니다."
</p>
);
}
}
export default Message;
Title.js
import React from "react";
function Title({lang}){
const text = lang === "en"? "Context" : "컨텍스트";
return <h1>{text}</h1>;
}
export default Title;
구동시킨 모습

en 버튼을 누르면 다음과 같이 변환

import {createContext} from "react";
const LangContext = createContext("en");
export default LangContext;
button.js 수정
import React, { useContext } from "react";
import LangContext from "../LangContext";
function Button({toggleLang}){
const lang = useContext(LangContext);
return <button onClick={toggleLang}>{lang}</button>;
}
export default Button;
Title.js 수정
import React from "react";
import LangContext from "../LangContext";
function Title(){
return (
<LangContext.Consumer>
{lang => {
const text = lang === "en"? "Context" : "컨텍스트";
return <h1>{text}</h1>
}}
</LangContext.Consumer>
);
}
export default Title;
message.js 수정
import React, {Component} from "react";
import LangContext from "../LangContext";
class Message extends Component{
static contextType = LangContext;
render(){
const lang = this.context;
if(lang === "en")
return(
<p>
"Context provides a way to pass data through the component tree
without having to pass props down manually at every level"
</p>
);
else
return(
<p>
"컨텍스트는 모든 레벨에서 이일이 props를 넘기지 않고도 컴포넌트 트리에
걸쳐서 데이터를 전달할 수 있는 방법을 제공합니다."
</p>
);
}
}
export default Message;
app.js 수정
import React, { Component } from 'react';
import Button from "./components/Button";
import Title from "./components/Title";
import Message from "./components/Message";
import LangContext from './LangContext';
class App extends Component{
state = {lang: "en"};
toggleLang = () =>{
this.setState(({lang}) => ({
lang: lang === "en"? "kr" : "en"
}));
};
render() {
const {lang} = this.state;
return (
<LangContext.Provider value={lang}>
<Button toggleLang={this.toggleLang} />
<Title/>
<Message/>
</LangContext.Provider>
);
}
}
export default App;
실행 결과 값은 동일
실습2.
1. 기본형
import './App.css';
import React, {Component} from 'react';
// 기본형
class AddNumber extends Component{
render(){
return(
<div>
<h1>Add Number</h1>
<input type="button" value="+"></input>
<input type="text" value="0"></input>
</div>
);
}
}
class AddNumberRoot extends Component{
render(){
return(
<div>
<h1>Add Number Root</h1>
<AddNumber></AddNumber>
</div>
);
}
}
class DisplayNumber extends Component{
render(){
return(
<div>
<h1>Display Number</h1>
<input type="text" value="0" readOnly></input>
</div>
);
}
}
class DisplayNumberRoot extends Component{
render(){
return(
<div>
<h1>Display Number Root</h1>
<DisplayNumber></DisplayNumber>
</div>
);
}
}
function App(){
return (
<div className="App">
<h1>Root</h1>
</div>
);
}
export default App;

import React, { Component } from "react";
class AddNumber extends Component {
render() {
return (
<div>
<h1>Add Number</h1>
<input type="button" value="+"></input>
<input type="text" value="0"></input>
</div>
);
}
}
export default AddNumber;
AddNumberRoot.jsx
import React, {Component} from "react";
import AddNumber from "./AddNumber";
class AddNumberRoot extends Component{
render(){
return(
<div>
<h1>Add Number Root</h1>
<AddNumber></AddNumber>
</div>
);
}
}
export default AddNumberRoot;
DisplayNumber.jsx
import React, {Component} from "react";
class DisplayNumber extends Component{
render(){
return(
<div>
<h1>Display Number</h1>
<input type="text" value="0" readOnly></input>
</div>
);
}
}
export default DisplayNumber;
DisplayNumberRoot.jsx
import React, {Component} from "react";
import DisplayNumber from "./DisplayNumber";
class DisplayNumberRoot extends Component{
render(){
return(
<div>
<h1>Display Number Root</h1>
<DisplayNumber></DisplayNumber>
</div>
);
}
}
export default DisplayNumberRoot;
App.js 수정
import './App.css';
import React from 'react';
import AddNumberRoot from './components/AddNumberRoot';
import DisplayNumberRoot from './components/DisplayNumberRoot';
// 컴포넌트화
function App(){
return (
<div className="App">
<h1>Root</h1>
<AddNumberRoot></AddNumberRoot>
<DisplayNumberRoot></DisplayNumberRoot>
</div>
);
}
export default App;
App.css 수정
div{
border : 5px solid #764abc;
margin: 10px;
color: #764abc;
padding: 10px;
}

실습1-1 기본형에서 구동 오류

props를 사용하지 않고 데이터를 전달하는 컨텍스트를 학습하였는데, 전역 범위에 걸쳐서 전달하는 컨텍스트가 실무에서 더 많이 사용할 것으로 예상된다. 그리고 이제 컴포넌트화 하는 방법이 익숙해지고 있지만, 하위 컴포넌트를 선언하는 과정에서 import하는 부분을 놓쳐서 오류가 자주 났다. import와 export하는 부분을 놓치지 않고 생각하는 버릇이 필요하다!