안녕하세요
styled-component 다크모드: "css variable"로 구현하자 themeProvider 대신에 본문
데이터시각화-KMG/Styled-Component
styled-component 다크모드: "css variable"로 구현하자 themeProvider 대신에
sakuraop 2023. 7. 9. 16:58발단: 스타일드 컴포넌트로 다크모드 구현을 하는 방법을 검색해보면 themeProvider로 구현을 한다.
문제: 하지만 이 방식은 페이지를 리렌더링 하기 때문에 느리다.
Changing CSS Variables (e.g. changing themes) is significantly more performant, it doesn’t require React to re-render your entire app (or re-render almost anything in fact) and the changes will be instant. This is why frameworks like Emotion have experiments to use CSS Variables.
(100% 리렌더링이 일어나는 지에 대해서는 확실하지 않으나 사실상 모든 컴포넌트에 대해서 리렌더링이 일어났다.)
해결법: themeProvider를 버리고 css variable로 구현한다.
스타일드 컴포넌트의 createGlobalStyle로 생성한 css의 body에 테마를 지정한다.
=> (모르면 createGlobalStyle 검색)
const GlobalStyle = createGlobalStyle`
body[data-theme='light'] {
--mainBlue: #2da0fa;
--mainWhite: #ffffff;
}
body[data-theme='dark'] {
--mainBlue: #0d92ff;
--mainWhite: #2b2b2b;
}
`;
App의 상위컴포넌트에 GlobalStyle 컴포넌트를 위치시키면 테마를 프로젝트 전체에 적용시킬 수 있게 된다.
function App() {
return (
<>
<GlobalStyle />
<Wrapper>
<FloatingMenu />
<Navigation />
</Wrapper>
</>
);
}
스타일 전환 버튼을 구현한다.
const NavHead: React.FC<NavHeadProps> = ({ ...navHeadProps }) => {
const handleClickDarkModeButton = () => {
if (debounceTimeoutRef.current === null) {
setTheme(switchTheme);
debounceTimeoutRef.current = window.setTimeout(() => {
debounceTimeoutRef.current = null;
}, 300);
}
};
return (
<NavHeadContainer>
<DarkModeButton isDarkMode={isDarkMode} handleClickDarkModeButton={handleClickDarkModeButton} />
</NavHeadContainer>
);
};
=> UX를 위해 debounce를 300ms 주어서 연속된 클릭을 막도록 한다.
참고한 사이트
https://dominictobias.medium.com/is-it-time-to-ditch-your-react-themeprovider-e8560dad2652
https://www.sungikchoi.com/blog/detailed-dark-mode/
'데이터시각화-KMG > Styled-Component' 카테고리의 다른 글
스타일드 컴포넌트 참고 글 (0) | 2023.06.21 |
---|---|
스타일드 컴포넌트 프로퍼티에 따라 다른 css 보여주기 (0) | 2023.06.19 |
styled-component @font-face 폰트 깜빡임 문제 (0) | 2023.06.16 |
스타일드 컴포넌트 css 프롭스 전달 방법 (0) | 2023.05.11 |
스타일드 컴포넌트 이벤트 전달 방법 (0) | 2023.05.10 |