본문 바로가기
React

[React] 클릭한 <Button> 색상 변경하기

by 1two13 2023. 2. 22.
728x90
반응형

프로젝트를 진행하면서 버튼을 클릭하면 해당 버튼의 색상을 변경하고 싶었다.

클릭한 "이름 순" 버튼 색상이 변경된 것을 확인할 수 있다.

 

 

 

 

728x90

useState와 onClick 이벤트를 사용하면 아주 쉽게 원하는 동작을 구현할 수 있다. 

나는 참고로 tailwind-css를 사용하고 있다. 

 

작성된 코드를 보는게 이해하기 쉬워 밑에 코드를 참고하는 것이 좋다. 

import { useState } from 'react';

function Button({ name, className }) {
  const [clicked, setClicked] = useState(false);
  const onClick = () => setClicked(!clicked);

  return (
    <div
      className={`${clicked
        ? 'border-deepGreen bg-deepGreen/10 text-deepGreen font-semibold'
        : 'bg-lightGray/5'
      }`}
      onClick={() => onClick()}
    >
      {name}
    </div>
  );
}

export default Button;

useState를 사용하여 버튼이 클릭되었는지를 알기 위한 clicked 상태를 생성하고, 버튼에 onClick 이벤트를 줬다.

onClick 함수는 클릭됐을 때 상태를 false에서 true로 변경해주도록 했다. 

 

그럼 clicked state에 true 또는 false가 계속 반전되며 값이 담기게 된다.(클릭할 때마다 state 값 변경) 이 state를 사용해 className, 즉 CSS를 변경해주면 된다. 

 

 

 

원래 위 글까지 포스팅을 완료했었는데,  문제점을 발견했다! 

바로 모든 버튼들을 클릭할 수 있다는 것이였다.

나는 저 많은 버튼들 중에 클릭한 버튼의 색상만 변경 + 1개의 버튼만 선택되게끔 하고 싶었던 것이였는데..

반응형

이를 해결하기 위한 코드는 아래와 같다. 

interface IButton {
  name: string;
  className?: string;
  onClick?: any;
  clicked?: boolean;
}

function Button({ name, className, onClick, clicked }: IButton) {
  return (
    <div
      className={`flex w-[81px] h-[36px] mr-[1%] pb-[1px] items-center justify-center cursor-pointer text-[14px] border-[2px] rounded-[80px] border-lightGray 
      ${className} ${
        clicked ? 'border-deepGreen bg-deepGreen/10 text-deepGreen font-semibold' : 'bg-lightGray/5'
      }`}
      onClick={onClick}
    >
      {name}
    </div>
  );
}
export default Button;

먼저 위에서 작성했던 Button 컴포넌트가 직접 onClick 이벤트를 핸들링하지 않도록 했다. onClick 이벤트는 props로 받아서 사용해야 1개의 버튼만 선택할 수 있기 때문이다. 

 

Button 컴포넌트를 사용하여 return 하는 코드는 아래와 같다. 

function Buttons() {
  const [clicked, setClicked] = useState('');
  const changeTag = (name: string) => {
    setClicked(name);
  };
  const buttonsNameList = ['최신 순', '이름 순', '좋아요 순', '북마크 순'];

  return (
    <div className="flex">
      <Button
        name={buttonsNameList[0]}
        onClick={() => changeTag(buttonsNameList[0])}
        clicked={clicked === buttonsNameList[0]}
      />
      <Button
        name={buttonsNameList[1]}
        onClick={() => changeTag(buttonsNameList[1])}
        clicked={clicked === buttonsNameList[1]}
      />
      <Button
        name={buttonsNameList[2]}
        onClick={() => changeTag(buttonsNameList[2])}
        clicked={clicked === buttonsNameList[2]}
      />
      <Button
        name={buttonsNameList[3]}
        onClick={() => changeTag(buttonsNameList[3])}
        clicked={clicked === buttonsNameList[3]}
      />
    </div>
  );
}

export default Buttons;

 

 

 

 


질문이나 잘못된 점은 댓글로 남겨주세요 :)💖

 

 

728x90
반응형

댓글