React, Context, useContext Hook
2024. 12. 26. 16:32ㆍ웹 개발
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;
/contexts/color.jsx
import { createContext, useState } from 'react';
const ColorContext = createContext({
state: {
color: 'black',
subColor: 'red',
fontSize: '20px',
},
actions: {
setColor: () => {},
setSubColor: () => {},
setFontSize: () => {},
},
});
const ColorProvider = ({ children }) => {
const [color, setColor] = useState('black');
const [subColor, setSubColor] = useState('red');
const [fontSize, setFontSize] = useState('fontSize');
const value = {
state: { color, subColor, fontSize },
actions: { setColor, setSubColor, setFontSize },
};
return (
<ColorContext.Provider value={value}>{children}</ColorContext.Provider>
);
};
const { Consumer: ColorConsumer } = ColorContext;
export { ColorProvider, ColorConsumer };
export default ColorContext;
/components/ColorBox.jsx
import react, { useContext } from 'react';
import ColorContext from '../contexts/color';
const ColorBox = () => {
const { state } = useContext(ColorContext);
return (
<>
<div
style={{
width: '64px',
height: '64px',
fontSize: state.fontSize,
background: state.color,
}}
/>
<div
style={{
width: '32px',
height: '32px',
fontSize: state.fontSize,
background: state.subColor,
}}
/>
</>
);
};
export default ColorBox;
/components/SelectColors.jsx
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);
const handleSetColor = (color) => {
actions.setColor(color);
};
const handleSetSubcolor = (subColor) => {
actions.setSubColor(subColor);
};
return (
<div>
<h2>색상을 선택하세요.</h2>
<div style={{ display: 'flex' }}>
{colors.map((color) => (
<div
key={color}
style={{
background: color,
width: '24px',
height: '24px',
cursor: 'pointer',
}}
onClick={() => handleSetColor(color)}
onContextMenu={(e) => {
e.preventDefault();
handleSetSubcolor(color);
}}
/>
))}
</div>
<hr />
</div>
);
};
export default SelectColors;
https://stackblitz.com/edit/vitejs-vite-hvvem4gc?embed=1&file=src%2FApp.jsx
'웹 개발' 카테고리의 다른 글
React + Redux, useStore, useDispatch (1) | 2024.12.27 |
---|---|
React, Redux (1) | 2024.12.26 |
React, Context + Consumer (0) | 2024.12.26 |
React, usePromise 커스텀 훅 (0) | 2024.12.23 |
React, Axios (0) | 2024.12.23 |