드림오구
article thumbnail
Published 2023. 6. 6. 21:52
[TIL : 230606] 🐹 TIL/Daily

🌊 TIL : 2023년 6월 6일  

 

오늘 한 것

 

  • 비동기 복습
  • 다크모드 react로 구현 후 타입스크립트 적용시켜보기

 

// ThemeContext.tsx

import React, { ReactNode, createContext, useEffect, useState } from 'react';

const ThemeContext = createContext({ isTheme: false, toggleTheme: () => {} });

interface ThemeProviderProps {
  children: ReactNode;
}

const ThemeProvider = ({ children }: ThemeProviderProps) => {
  const [isTheme, setTheme] = useState(
    () =>
      localStorage.theme === 'dark' ||
      (!('theme' in localStorage) &&
        window.matchMedia('(prefers-color-scheme: dark)').matches)
  );
  const toggleTheme = () => {
    setTheme((prev) => !prev);
  };

  useEffect(() => {
    if (isTheme) {
      document.documentElement.classList.add('dark');
      localStorage.theme = 'dark';
    } else {
      document.documentElement.classList.remove('dark');
      localStorage.theme = 'light';
    }
  }, [isTheme]);

  return (
    <ThemeContext.Provider value={{ isTheme, toggleTheme }}>
      {children}
    </ThemeContext.Provider>
  );
};

export { ThemeContext, ThemeProvider };

잘한 점

상황

다크모드 구현..?

액션

  • context api, useEffect를 적재적소에 사용한 것 같다.
  • tailwindcss를 사용하여 html 태그에 dark 태그가 있으면 darkmode css가 반영되도록 config 파일을 수정하였다.
  • tailwindcss 공식문서를 참고하여 localstorage에 theme가 저장되어있거나 window.matchMedia('(prefers-color-scheme: dark)').matches를 사용하여 운영체제 테마를 확인하여 적용하는 것도 성공.. 사실 이전에 해봤던 거라 많이 어렵진 않았지만!! 가물가물해서 기억이 안 났는데 다시 한 번 찾아보며 공식문서를 읽어보는 시간을 가지게 되어 좋았다. 또 tailwindcss로 다크모드 구현해본건 처음인데 너무 편리하게 변경되서 좋은 것 같다.

칭찬

└(^o^ ))┐┌(( ^o^)┘♩

 

배운 점

배움

provider에 children 을 매개변수로 넘길 때 타입 에러가 출력이 됐다. 이거 어떻게 타입을 지정해야하지..? 단순히 내가 배운 boolean, number로 지정하는게 아닌 것 같은데.. 고민하다 검색하여 ReactNode로 추가하였다. 근데 이거 any타입처럼 너무 넓은 범위 아닌가 싶어서 찾아보았는데 ReactNode로 적으신 부분이 있어 그대로 사용하였다. 

https://react.vlpt.us/using-typescript/04-ts-context.html

 

4. TypeScript 와 Context API 활용하기 · GitBook

4. TypeScript 와 Context API 활용하기 이번에는 TypeScript 와 Context API 를 활용하는 방법을 배워보겠습니다. 이번에 배울 것은 3장의 섹션2 Context API를 활용한 상태관리와 매우 유사합니다. State를 위한 Co

react.vlpt.us

https://react-typescript-cheatsheet.netlify.app/docs/basic/getting-started/context

 

Context | React TypeScript Cheatsheets

Basic example

react-typescript-cheatsheet.netlify.app

오늘 배움의 의미

react에서 생각해야할 type이 더 존재함을 알게 됐다. 

 

개선점

문제

사실 dom을 직접 조작하는 것이 react의 방향과 맞지 않는 것 같아 고민된다. 

원인

react는 직접적인 dom 조작을 지양하고 있는데 난 지금 직접적으로 건든 것이 되서.. 사실 올바른 코드가 맞을까? 하는 의문이 들기도 하다. 

조금 더 좋은 접근 방식이 있지 않을까 싶지만. 아직은 조금 어려운 것 같다.

 

생각해본 좋은 접근 방식은 html 태그에 dark 클래스를 추가하는 것이 아닌 app.tsx 파일 내부의 컴포넌트를 부를 때 컴포넌트에 상태를 추가해보는건 어떨까? 싶었는데 내가 현재 tailwind를 사용하고 있어 css 파일을 따로 둔 것이 아니니 어떻게 접근해야 할 지 고민이 되었다. 그래서 useEffect 안에서 theme 상태가 변경되면 html 태그에 dark 클래스를 추가하는 방식을 선택하게 되었는데 이 방법이 정말 괜찮은 방법일지?에 대한 고민은 조금 더 해봐야할 것 같다.

해결 방법

아직은 해결이 되지 않음 'ㅇ' 

'🐹 TIL > Daily' 카테고리의 다른 글

[TIL : 230610]  (0) 2023.06.10
[TIL : 230609]  (2) 2023.06.09
[TIL : 230605]  (0) 2023.06.06
[TIL : 230603]  (0) 2023.06.03
[TIL : 230602]  (1) 2023.06.02
profile

드림오구

@드림오구