데이터 값이 변할 때마다 모든 하위 컴포넌트에게 "broadcast"하는 역할
const [value, setValue] = useState(‘hello‘);
const onSetValue = useCallback(value => setValue(value), []);
React.createContext() : context 생성
import React from "react";
const ColorContext = React.createContext({color:'black'});
export default ColorContext;
import React from "react";
import ColorContext from "./color";
const ColorBox = () => {
return (
<ColorContext.Consumer>
{(value) => (
<div
style={{
width: "64px",
height: "64px",
background: value.color
}}
/>
)}
</ColorContext.Consumer>
);
};
export default ColorContext;
import React from ‘react‘;
const RenderPropsSample = ({ children }) => {
return <div>결과: {children(5)}</div>;
};
export default RenderPropsSample;
//App.js
<RenderPropsSample>{value => 2 * value}</RenderPropsSample>;
context를 구독하는 컴포넌트들에게 context의 변화를 알림
import React from "react";
import ColorContext from "./context/color";
import ColorBox from "./context/colorBox";
const App = () => {
return (
<ColorContext.Provider value={{ color: "red" }}>
<div>
<ColorBox />
</div>
</ColorContext.Provider>
);
};
export default App;
Color.js
import React, { createContext, useState } from "react";
const ColorContext = createContext({
state: { color: "black", subcolor: "red" },
action: {
setColor: () => {},
setSubColor: () => {}
}
});
const ColorProvider = ({ children }) => {
const [color, setColor] = useState("black");
const [subcolor, setSubColor] = useState("red");
const value = {
state: { color, subcolor },
action: { setColor, setSubColor }
};
return (
<ColorContext.Provider value={value}>{children}</ColorContext.Provider>
);
};
const {Consumer:ColorConsumer} = ColorContext;
export {ColorProvider, ColorConsumer};
export default ColorContext;
const animal = {
name: '멍멍이',
type: '개'
};
const { name: nickname } = animal
App.js
import React from "react";
import ColorContext, { ColorProvider } from "./context/color";
import ColorBox from "./context/colorBox";
const App = () => {
return (
<ColorProvider>
<div>
<ColorBox />
</div>
</ColorProvider>
);
};
export default App;
ColorBox.js
import React from "react";
import ColorContext, { ColorConsumer } from "./color";
const ColorBox = () => {
return (
<ColorConsumer>
{(value) => (
<>
<div
style={{
width: "64px",
height: "64px",
background: value.state.color
}}
/>
<div
style={{
width: "64px",
height: "64px",
background: value.state.subcolor
}}
/>
</>
)}
</ColorConsumer>
);
};
export default ColorBox;
import React from "react";
import ColorContext, { ColorConsumer } from "./color";
const ColorBox = () => {
return (
<ColorConsumer>
{({state}) => (
<>
<div
style={{
width: "64px",
height: "64px",
background: state.color
}}
/>
<div
style={{
width: "64px",
height: "64px",
background: state.subcolor
}}
/>
</>
)}
</ColorConsumer>
);
};
export default ColorBox;
selectColors.js
import React from "react";
import { ColorConsumer } from "./color";
const colors = ["red", "orange", "yellow", "green", "blue", "violet"];
const SelectColors = () => {
return (
<div>
<h2>색상 선택</h2>
<ColorConsumer>
{({ action }) => (
<div style={{ display: "flex" }}>
{colors.map((color) => (
<div
key={color}
style={{
background: color,
width: "24px",
height: "24px",
cursor: "pointer"
}}
onClick={() => action.setColor(color)}
onContextMenu={(e) => {
e.preventDefault();
action.setSubColor(color);
}}
/>
))}
</div>
)}
</ColorConsumer>
<hr />
</div>
);
};
export default SelectColors;
ColorBox.js
import React, { useContext } from "react";
import ColorContext, { ColorConsumer } from "./color";
const ColorBox = () => {
const { state } = useContext(ColorContext);
return (
<>
<div
style={{
width: "64px",
height: "64px",
background: state.color
}}
/>
<div
style={{
width: "64px",
height: "64px",
background: state.subcolor
}}
/>
</>
);
};
export default ColorBox;