본문 바로가기
일상이 개발

React 버튼 클릭 피드백 제대로 만들기: 딜레이 없는 자연스러운 UX 설계

by 디어노미 2025. 4. 6.
반응형

🚀 React 버튼 클릭 피드백 제대로 만들기

딜레이 없는 자연스러운 UX 설계 가이드

React 앱을 사용하다 보면 버튼을 클릭했을 때
"응? 눌린 건가?" 하는 찰나의 어색함을 느껴본 적이 있을 거예요.

클릭에 대한 시각적 반응이 지연되거나,
클릭했지만 아무런 변화가 없으면 사용자는 혼란을 느낍니다.
→ 결과적으로 UX의 신뢰도가 떨어지게 되죠.

이번 글에서는 React 앱에서 버튼 클릭 피드백을 어떻게 자연스럽게 처리할 수 있는지,
그리고 반응 속도, 로딩 상태, 이중 클릭 방지 등 실전에서 꼭 필요한 설계 팁들을 알려드릴게요.


1. 버튼 클릭 UX, 왜 중요한가요?

  • 클릭 → 로딩이 오래 걸림 → 아무 피드백 없음
  • 클릭 → 아무런 시각적 변화 없음
  • 클릭 → 이중 요청 발생
  • 클릭 → 버튼 비활성화 or 중복 제출

버튼은 즉각 반응 + 명확한 상태 표시 + 피드백 지속 시간 조절이 핵심입니다.


2. 버튼 클릭 후 '딜레이' 없이 반응하는 법

const [clicked, setClicked] = useState(false);

const handleClick = () => {
  setClicked(true); // 즉시 반영되지 않음
};

해결 방법

  1. CSS active 효과
    button:active {
      transform: scale(0.98);
    }
    
  2. 내부 텍스트 변경
    <button onClick={handleClick}>
      {clicked ? "처리 중..." : "제출"}
    </button>
    
  3. 일시적 피드백 유지
    useEffect(() => {
      if (clicked) {
        const timer = setTimeout(() => setClicked(false), 800);
        return () => clearTimeout(timer);
      }
    }, [clicked]);
    

3. 로딩 상태를 명확히 보여주기

const [isLoading, setIsLoading] = useState(false);

const handleClick = async () => {
  setIsLoading(true);
  await fetchSomething();
  setIsLoading(false);
};
<button onClick={handleClick} disabled={isLoading}>
  {isLoading ? <Spinner /> : "제출"}
</button>
  • 클릭 후 바로 로딩 표시
  • 비활성화 처리로 중복 방지
  • 텍스트 + 스피너 조합이 좋음

4. 이중 클릭 방지

<button onClick={handleClick} disabled={isLoading}>
  {isLoading ? "처리 중..." : "제출"}
</button>
const handleClick = async () => {
  if (isLoading) return;
  setIsLoading(true);
  await api();
  setIsLoading(false);
};

5. 피드백은 즉시, 결과는 나중에

<button onClick={save} disabled={saving}>
  {saving ? <Spinner size={12} /> : "저장"}
</button>

사용자에게 “지금 뭔가 처리 중”임을 알려주는 게 중요합니다.


6. 모바일 환경 대응

터치 환경에서는 반응이 조금만 느려도 UX가 급격히 떨어집니다.

button:active {
  background-color: #eee;
}
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">

React Native에서는 TouchableOpacity, TouchableHighlight 사용


7. 클릭 후 상태 유지 시간 조절

  • 200ms 이하 → 피드백 생략 가능
  • 300ms~2초 → isLoading 유지
  • 3초 이상 → 재시도 안내 포함

8. 결과 피드백은 Toast로

toast.success("저장 완료되었습니다!");

추천 라이브러리

  • react-toastify
  • notistack
  • chakra-ui toast

✅ 마무리 요약

React 버튼 클릭 UX는 단순한 onClick 이벤트가 아닙니다.
클릭 → 피드백 → 처리 중 → 완료 안내 흐름이 UX를 완성합니다.

✔ 요약 정리

  • 즉각 반응, 눈에 보이는 변화 제공
  • 로딩 상태 피드백은 기본
  • 이중 클릭 방지 반드시 적용
  • 터치 UX까지 고려
  • Toast 등 완료 메시지 필수
사용자가 버튼을 눌렀을 때, 앱이 반응한다는 느낌을 주는 것.
그게 좋은 UX의 시작입니다. 😊
반응형