Study note/React

Save 버튼에 loading, done 효과 주기

공대 아로마 2024. 4. 17. 04:19

사용자에게 버튼 클릭이 작업을 수행하고 있음을 시각적으로 알려주는 것이 중요한 경우가 많다. 스켈레톤이나 전체를 덮는 로딩도 많이 사용하지만 필요에 따라서 이렇게 버튼 위에서 로딩을 보여주는 것도 필요했다.

 

내 경우엔 react-icons 을 사용했다. 다음 명령을 사용하여 설치할 수 있다.

npm install react-icons

 

아래는 사용 예시이다. 실제로 api 호출 등 시간 걸리는 걸로 교체하면 된다.

import React, { useState } from 'react';
import { FaSave, FaSpinner, FaCheck } from 'react-icons/fa';

const SaveButton = () => {
  const [loading, setLoading] = useState(false);
  const [done, setDone] = useState(false);

  const handleClick = () => {
    setLoading(true);

    // 실제로 저장하는 작업 수행 (예: API 호출 등)
    setTimeout(() => {
      setLoading(false);
      setDone(true);

      // 2초 후 done 상태 초기화
      setTimeout(() => {
        setDone(false);
      }, 2000);
    }, 2000);
  };

  return (
    <button onClick={handleClick} disabled={loading || done}>
      {loading ? (
        <FaSpinner className="spin" />
      ) : done ? (
        <FaCheck />
      ) : (
        <FaSave />
      )}
    </button>
  );
};

export default SaveButton;

 

버튼 클릭 시 Loading 상태가 되면 로딩 아이콘이 나타나고, 작업이 완료되면 Done 아이콘이 나타난다.