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
반응형
'React' 카테고리의 다른 글
[React] 이미지 슬라이드(가로형,버튼O,반응형) 만들기 (2) | 2023.03.07 |
---|---|
[React+TS] textarea 줄바꿈하는 법, 입력한 값만큼 height 늘어나게 하는 법 (0) | 2023.02.27 |
[React] react-select 사용해서 select 만들기 + select 전부 초기화하는 법 (0) | 2023.02.21 |
React Virtual DOM이란? (0) | 2023.02.08 |
[react] 중첩 삼항연산자 쓰는 법 + 단점 (0) | 2023.01.29 |
댓글