Stack/React
[React] Context API
7ingout
2022. 6. 27. 10:29
context API
1. 컨텍스트 만들기
const mycontext = createContext(기본값)
App
<MyContext.Provider value = {user}>
</MyContext.Provider>
2. 컨텍스트 값 사용하기
const user = useContext(MyContext)
context-react
1. MainPage.js
2. Header.js
3. Footer.js
4. Content.js
App.js
import './App.css';
import MainPage from './components/MainPage';
import { useState } from 'react'
import { ThemeContext } from './context/ThemeContext';
function App() {
const [ isDark, setIsDark ] = useState(false);
return (
// 두번재 방법
// context로 보낼 수 있음
<ThemeContext.Provider value={ {isDark, setIsDark}}>
<div className="App">
{/* 첫번째 방법 */}
{/* MainPage props 자리에 이것들을 받음 */}
{/* <MainPage isDark={isDark} setIsDark={setIsDark}/> */}
<MainPage/>
</div>
</ThemeContext.Provider>
);
}
export default App;
Components/MainPage.js
import React, { useContext } from 'react';
import { ThemeContext } from '../context/ThemeContext';
import Content from './Content';
import Footer from './Footer';
import Header from './Header';
const MainPage = () => { // props 자리에 있던 것들: { isDark, setIsDark }
// const data = useContext(ThemeContext);
// console.log(data);
return (
<div>
<Header />
<Content />
<Footer/>
{/* 첫번째방법 */}
{/* <Header isDark={isDark}/>
<Content isDark={isDark}/> */}
{/* 버튼이 footer에 있으니깐 */}
{/* <Footer isDark={isDark} setIsDark={setIsDark}/> */}
</div>
);
};
export default MainPage;
Components/Header.js
import React, { useContext } from 'react';
import { ThemeContext } from '../context/ThemeContext';
const Header = () => { // {isDark}
const {isDark} = useContext(ThemeContext);
return (
<div className={isDark? 'header dark' : 'header'}>
<h1>
Green
</h1>
<ul>
<li>menu1</li>
<li>menu2</li>
<li>menu3</li>
<li>menu4</li>
</ul>
</div>
);
};
export default Header;
Components/Content.js
import React, { useContext } from 'react';
import { ThemeContext } from '../context/ThemeContext';
const Content = () => { // {isDark}
const { isDark } = useContext(ThemeContext);
return (
// <div className='content'>
<div className={isDark? 'content dark' : 'content'}>
좋은 하루 되세요 ~
</div>
);
};
export default Content;
Components/Footer.js
import React, { useContext } from 'react';
import { ThemeContext } from '../context/ThemeContext';
const Footer = () => { // {isDark, setIsDark}
const { isDark, setIsDark } = useContext(ThemeContext);
const onClickDark = () => {
setIsDark(!isDark)
}
return (
<div className={isDark ? 'footer dark' : 'footer'}>
<button onClick={onClickDark}>다크모드</button>
</div>
);
};
export default Footer;
Context/ThemeContext.js
import { createContext } from "react";
export const ThemeContext = createContext(null);
App.css
* { margin : 0; padding: 0; box-sizing: border-box;}
li { list-style: none; }
.App {
text-align: center;
}
.header {
display: flex;
justify-content: space-between;
padding: 20px;
border-bottom: 1px solid #ccc;
}
.header.dark {
background: black;
color: #fff;
}
.header ul {
display: flex;
}
.header li {
padding: 0 20px;
}
.content {
height: 700px;
padding-top: 100px;
}
.content.dark {
background-color: #666;
color: #fff;
}
.footer {
border-top: 1px solid #ccc;
padding: 30px;
height: 100px;
}
.footer.dark {
background-color: #333;
color: #fff;
}
.footer button {
outline: none;
padding: 10px 20px;
float: right;
}
.footer.dark button {
background-color: #eee;
}
begin-react
App.js
import React, { useReducer, useContext } from 'react';
import { MyContext } from './component/MyContext';
import Counter2 from './Counter2';
function App() {
const newtext = "안녕하세요";
// const name = "리액트";
return (
// JSX에서 자바스크립트 표현식을 사용하려면 {}로 감싼다.
// if문 대신 조건부연산자 - 삼항연산자를 사용
<MyContext.Provider value={newtext}>
<div className='react'>
<Counter2 />
{/* <MyComponent name='green' age ='20'><h2>h2입니다.</h2></MyComponent> */}
{/* <MyComponentClass name="classGreen" age={30}>
<h3>children</h3>
</MyComponentClass>
<MyComponentClass></MyComponentClass> */}
{/* <MyComponent name='Green' age='30'/><h3>여러분</h3><MyComponent/>
<MyComponent name='Blue' age={50}/><h3>새과목</h3><MyComponent/>
<MyComponent/><h3>하하하</h3><MyComponent/> */}
{/* <h1>{name == '리액트' ? (<span>리액트입니다.</span>) : (<span>리액트가 아닙니다.</span>) } 안녕!</h1> */}
{/* <h2>하이하이</h2>
<input type="text"></input> */}
</div>
</MyContext.Provider>
);
// return React.createElement("div", null, "Hello", React.createElement("b", null, "react"));
}
export default App;
Counter2.js
import React, { useReducer, useContext } from 'react';
import { MyContext } from './component/MyContext'
function reducer(state, action) {
switch(action.type) {
case "INCREASE":
return state +1;
case "DECREASE":
return state-1;
default:
return state;
}
}
const Counter2 = (props) => {
const contextText = useContext(MyContext);
console.log(contextText);
// let number = 0;
const [ number, dispatch ] = useReducer(reducer, 0); // 기본값은 0이다
function Increase() {
dispatch({type: "INCREASE"});
}
function Decrease() {
dispatch({type: "DECREASE"});
}
return (
<div>
<h2>{number}</h2>
<button onClick={Decrease}>-1</button>
<button onClick={Increase}>+1</button>
</div>
);
};
export default Counter2;
MyContext.js
import { createContext } from "react";
export const MyContext = createContext("월요일");