티스토리 뷰
728x90
SMALL
새 context 만들기
import {createContext} from 'react';
const ColorContext=createContext({color:'black'});
export default ColorContext;
consumer
<ColorContext.Consumer>
{value=>(
<div style={{background:value.colr}}/>
)}
</ColorContext.Consumer>
provider
<ColorContext.Provider value={{color:'red'}}>
<div>
<ColorBox/>
</div>
</ColorContext.Provider>
동적 Context 사용
import { createContext, useState } from "react";
const ColorContext = createContext({
state: { color: "black", subcolor: "red" },
actions: {
setColor: () => {},
setSubcolor: () => {},
},
});
const ColorProvider = ({ children }) => {
const [color, setColor] = useState("black");
const [subcolor, setSubcolor] = useState("red");
const value = {
state: { color, subcolor },
actions: { setColor, setSubcolor },
};
return (
<ColorContext.Provider value={value}>{children}</ColorContext.Provider>
);
};
//const ColorConsumer=ColorContext.Consumer와 같은 의미
const { Consumer: ColorConsumer } = ColorContext;
//ColorProvider와 ColorConsumer 내보내기
export { ColorProvider, ColorConsumer };
export default ColorContext;
app.js
import React from "react";
import ColorBox from "./components/ColorBox";
import SelectColors from "./components/SelectColors";
import { ColorProvider } from "./contexts/color";
const App = () => {
return (
<ColorProvider>
<div>
<SelectColors />
<ColorBox />
</div>
</ColorProvider>
);
};
export default App;
훅
Consumer 대신 Hook 사용
const { state } = useContext(ColorContext);
클래스
Consumer 대신 static contextType 사용
static contextType = ColorContext;
이렇게 하면 this.context를 조회했을 때 현재 Context의 value를 가리키게 된다.
여기서
import React from "react";
import { ColorConsumer } from "../contexts/color";
const colors = ["red", "orange", "yellow", "green", "blue", "indigo", "violet"];
const SelectColors = () => {
return (
<div>
<h2>색상을 선택하세요.</h2>
<ColorConsumer>
{({ actions }) => (
<div style={{ display: "flex" }}>
{colors.map((color) => (
<div
key={color}
style={{
background: color,
width: "24px",
height: "24px",
cursor: "pointer",
}}
onClick={() => actions.setColor(color)}
onContextMenu={(e) => {
e.preventDefault();
actions.setSubcolor(color);
}}
/>
))}
</div>
)}
</ColorConsumer>
<hr />
</div>
);
};
export default SelectColors;
훅으로 더 간편하게
import React, { useContext } from "react";
import ColorContext from "../contexts/color";
const colors = ["red", "orange", "yellow", "green", "blue", "indigo", "violet"];
const SelectColors = () => {
const { actions } = useContext(ColorContext);
return (
<div>
<h2>색상을 선택하세요.</h2>
<div style={{ display: "flex" }}>
{colors.map((color) => (
<div
key={color}
style={{
background: color,
width: "24px",
height: "24px",
cursor: "pointer",
}}
onClick={() => actions.setColor(color)}
onContextMenu={(e) => {
e.preventDefault();
actions.setSubcolor(color);
}}
/>
))}
</div>
<hr />
</div>
);
};
export default SelectColors;
728x90
LIST
'책 > 리다기' 카테고리의 다른 글
리다기 정리9(리덕스 미들웨어) (0) | 2021.01.27 |
---|---|
리다기 정리8(리덕스) (0) | 2021.01.25 |
리다기 정리6(뉴스뷰어 만들기) (0) | 2021.01.22 |
리다기 정리5(immer, SPA) (0) | 2021.01.22 |
리다기 정리4(아이콘, 최적화) (0) | 2021.01.21 |
댓글
공지사항