createContext
함수 사용Consumer Component
: Context의 변화를 감지Provider Component
: Context의 value를 변경좌클릭하면 큰 박스의 색상변경
우클릭하면 작은 박스의 색상변경
App.js
import ColorBox from "./components/ColorBox";
import SelectColors from "./components/SelectColors";
import { ColorProvider } from "./contexts/color";
function App() {
return (
<ColorProvider>
<div>
<SelectColors></SelectColors>
<ColorBox></ColorBox>
</div>
</ColorProvider>
);
}
export default App;
color.js
import { createContext, useState } from "react";
const ColorContext = createContext({
state: { color: "black", fontColor: "red" },
actions: {
setColor: () => {},
setFontColor: () => {},
},
});
const ColorProvider = ({ children }) => {
const [color, setColor] = useState("black");
const [fontColor, setFontColor] = useState("red");
const value = {
state: { color, fontColor },
actions: { setColor, setFontColor },
};
return (
<ColorContext.Provider value={value}>{children}</ColorContext.Provider>
);
};
// ColorContext.Consumer를 ColorConsumer라는 변수에 담아줌
const { Consumer: ColorConsumer } = ColorContext;
// ColorProvider, ColorConsumer 내보내기
export { ColorProvider, ColorConsumer };
export default ColorContext;
ColorBox.js
import React, { useContext } from "react";
import ColorContext from "../contexts/color";
const ColorBox = () => {
const { state } = useContext(ColorContext);
return (
<>
<div
style={{
width: "64px",
height: "64px",
background: state.color,
}}
></div>
<div
style={{
width: "32px",
height: "32px",
background: state.fontColor,
}}
></div>
</>
);
};
export default ColorBox;
SelectColor.js
import React from "react";
import { ColorConsumer } from "../contexts/color";
const colors = ["red", "orange", "yellow", "green", "blue", "navy", "purple"];
const SelectColors = () => {
return (
<div>
<h2>Choose Color</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.setFontColor(color);
}}
/>
))}
</div>
)}
</ColorConsumer>
<hr />
</div>
);
};
export default SelectColors;
{
type: 'ADD_TODO',
data: {
id: 1,
text: 'learning redux'
}
}
function addTodo(data) {
return {
type: 'ADD_TODO',
data
}
}
const addTodo = (data) => {
return {
type: 'ADD_TODO',
data
}
}
function reducer(atate, action) {
switch(action.type) {
case "ADD_TODO":
return {
새로운 상태 값;
}
default:
return state;
}
}