-
Notifications
You must be signed in to change notification settings - Fork 1
useToggleContents 기본값 설정 및 조건부 사용법
현재 useToggleContents 훅은 사용되는 곳이 3군데가 있다.
- 툴팁이 5초 뒤에 사라지는 부분
- 밸런스 게임 진행 중 5초 뒤에 메인 텍스트가 카운트다운 시계로 바뀌는 곳
- 버튼 클릭 시 컴포넌트가 바뀌는 곳
3번째의 경우에는 버튼 클릭만 하면 toggle 함수를 통해 두 개의 컴포넌트를 번갈아가면서 보여줄 수 있도록 토글해주면 되므로, duration 값이 필요 없기 때문에 useDuration이라는 boolean 값을 하나 추가해주었다.
우선 기본 값들은 아래와 같이 설정해주었다.
initialStatus?: boolean = true;
duration?: number = 5000;
useDuration?: boolean = true;
3군데 중 1, 2번째가 모두 true, 5000, true를 기본값으로 가지고 있기 때문에 이를 기준으로 기본값을 설정해주었다.
3번째 토글하는 부분에 있어서는, duration 값은 따로 설정해줄 필요 없이 그냥 useDuration를 false로 설정하면 알아서 duration이 유효하지 않도록 미리 if 문에서 걸러지도록 구현했다.
이때 유의해야할 점은 아래와 같이 기본 값을 빈 객체로 설정해주어야 하는데, 그렇지 않으면 그냥 아무런 Props 없이 useToggleContents 훅을 사용했을 경우 오류가 발생한다.
만약 ={}
를 지정하지 않고 함수를 호출할 때 매개변수를 전달하지 않으면, 함수가 undefined
를 받게 된다. 그리고 undefined
는 객체가 아니므로, 구조 분해 할당에 실패하게 된다.
UseToggleContentsProps = {}
따라서 위와 같이 = {}
를 통해 전체 객체의 기본값을 빈 객체로 설정하게 되면, 본 훅을 사용할 때 인자를 주지 않아도 기본값으로 동작할 수 있도록 해준다.
import { useCallback, useEffect, useState } from "react";
interface UseToggleContentsProps {
initialStatus?: boolean;
duration?: number;
useDuration?: boolean;
}
export default function useToggleContents({
initialStatus = true,
duration = 5000,
useDuration = true,
}: UseToggleContentsProps = {}) {
const [toggleContents, setToggleContents] = useState(initialStatus);
const toggle = useCallback(() => {
setToggleContents((prev) => !prev);
}, []);
useEffect(() => {
if (useDuration) {
const timer = setTimeout(() => {
toggle();
}, duration);
return () => clearTimeout(timer);
}
}, [useDuration, duration, toggle]);
return { toggleContents, toggle };
}
따라서 1, 2번째에서는 다음과 같이 사용해주면 알아서 5초에 맞게 알아서 toggleContents가 true에서 false로 값이 바뀌면서 원하는 기능을 수행할 수 있다.
const { toggleContents } = useToggleContents();
3번째에서는 toggle을 추가로 호출해주고, useDuration 값도 추가로 false 처리해주어, duration 값에 맞춰 자동으로 토글되지 않도록 설정해주었다. 이로써 각각의 컴포넌트 내부에서 특정 버튼을 클릭할 때 toggle 함수가 호출되어 두 개의 컴포넌트가 계속 토글되도록 처리할 수 있다.
const { toggleContents, toggle } = useToggleContents({ useDuration: false });
{toggleContents ? (
<SelectedCardDescription onClick={toggle} />
) : (
<SelectedCardCurrentRatio onClick={toggle} />
)}
- 페이지가 렌더링 된 후 스크롤을 최상단으로 올리기
- DOM을 이미지로 저장하기
- Context API에서 불필요한 리렌더링을 줄이는 방법
- 무한 Transition 애니메이션
- Github Action 워크플로우 정의하기
- 무한 Transition 애니메이션 최적화하기
- 무한 Transition 애니메이션 최적화하기 2
- 무한 Transition 애니메이션 최적화하기 3
- fetch timeout 구현하기
- ErrorBoundary 구현하기
- 뒤로가기 confirm 로직 구현하기
- 선착순 밸런스 게임 상태 관리
- Modal 내부 컴포넌트에서 무한 스크롤이 제대로 동작 안되는 문제
- useToggleContents 훅 기본값 설정 및 조건부 사용법
- 폰트 굵기 적용 이슈
- SVG 내부 stroke 속성 값 제어를 위한 SVGIcon Util 함수 및 SVGR 사용 과정
- tailwindCSS의 @apply를 cva로 바꾸기
- 스크롤 내려갈 때 해당 섹션의 요소들 인터렉션 동작
- 공통 컴포넌트 내부에 애니메이션을 넣는 것에 대한 고민
- 특정 컴포넌트 위치에서 헤더 스타일 다르게 적용하는 방법
- 스크롤 거꾸로 올릴 때 IntersectionObserver가 뷰포트 감지 못하는 현상
- 선착순 밸런스 게임 최종 결과 계산에 대한 고민 (08.14)
- 프로그래스바 공통 컴포넌트로 분리
- (08.23 기준) 선착순 서버 시간 연동 문제
- 게임 종료된 상태에서 사용자 게임 참여 여부에 따른 FinalResult 분기 처리
- FinalResult 컴포넌트의 “당신의 선택” 카테고리 설정 이슈
- 게임 접속 시 게임 현재 진행 상태 초기화 및 카운트 다운 설정
- 선착순 밸런스 게임 UX 개선