ThemeProvider로 테마 설정 사용하기
테마 기능을 만들기 위해서는 현재 테마로 설정된 값을 사이트 전체에서 참조할 수 있어야 합니다. React에서는 이런 상황에서 Context라는 걸 사용하는데요. Styled Components에서도 Context를 기반으로 테마를 사용할 수 있습니다. Context를 내려주는 컴포넌트로 ThemeProvider라는 걸 사용하면 되죠.
import { ThemeProvider } from "styled-components";
import Button from "./Button";
function App() {
const theme = {
primaryColor: '#1da1f2',
};
return (
<ThemeProvider theme={theme}>
<Button>확인</Button>
</ThemeProvider>
);
}
export default App;
ThemeProvider라는 Context Provider를 사용해서 theme이라는 객체를 내려줍니다. 이렇게 하면 ThemeProvider 안에 있는 Styled Components로 만든 컴포넌트에서는 Props를 사용하듯이 theme이라는 객체를 쓸 수 있습니다.
const Button = styled.button`
background-color: ${({ theme }) => theme.primaryColor};
/* ... */
`;
만약에 여러 테마를 선택하게 하고 싶다면 useState 를 활용해서 테마를 바꿔주면 됩니다.
import { useState } from 'react';
import { ThemeProvider } from 'styled-components';
import Button from './Button';
function App() {
const [theme, setTheme] = useState({
primaryColor: '#1da1f2',
});
const handleColorChange = (e) => {
setTheme((prevTheme) => ({
...prevTheme,
primaryColor: e.target.value,
}));
};
return (
<ThemeProvider theme={theme}>
<select value={theme.primaryColor} onChange={handleColorChange}>
<option value="#1da1f2">blue</option>
<option value="#ffa800">yellow</option>
<option value="#f5005c">red</option>
</select>
<br />
<br />
<Button>확인</Button>
</ThemeProvider>
);
}
export default App;
만약 테마 설정 페이지를 만든다고 하면 테마 값을 일반적인 컴포넌트에서 참조할 필요도 생길 텐데요. 그럴 때는 ThemeContext를 불러오면 됩니다. 이 값은 React Context이기 때문에 useContext로 씁니다.
import { useContext } from 'react';
import { ThemeContext } from 'styled-components';
// ...
function SettingPage() {
const theme = useContext(ThemeContext); // { primaryColor: '#...' }
}
'개발 공부 일지 > React' 카테고리의 다른 글
리액트 - Cleanup (0) | 2024.08.13 |
---|---|
리액트 - useRef (0) | 2024.08.13 |
리액트 - [Styled Component] 글로벌 스타일 / 애니메이션 (0) | 2024.08.12 |
리액트 - [Styled Component] 상속/CSS 함수 (0) | 2024.08.12 |
리액트 - [Styled components] 시작하기/Nesting (0) | 2024.08.12 |