728x90

1. 어떻게?
state를 통해 버튼을 누르면 완료될때까지 버튼의 클릭 기능을 없애서 중복 클릭을 못하게 함.
2. 적용
1) 불리언 타입의 State 를 만들어 준다.
const [isBtnDisable, setIsBtnDisable] = useState(false);
2) 버튼의 state (true, false) 두가지 상태를 정의해준다.
*여기선 버튼 대신 이미지를 사용하였다.
*클릭 후 처리 중엔 아예 클릭이 불가능하게 하였다.
- 클릭 전 (onClick 프로퍼티가 있음)
isBtnDisable === false 일 때 버튼은 이렇고
// isBtnDisable === false && <img onClick={클릭시 함수} />
- 클릭 후 (onClick 프로퍼티가 없음)
isBtnDisable === true 일 때 (클릭 후) 버튼은 이렇다
// isBtnDisable && <img />
// 클릭 전 버튼
{isBtnDisable === false && <img onClick={()=>{클릭시 작동 함수()}} className='클래스' src="이미지 주소" alt="img" />}
// 클릭 후 버튼
{isBtnDisable && <img className='클래스' src="이미지 주소" alt="img" />}
3) 추가로 setter 함수에 (true), (false)를 넣어 언제 버튼을 누를 수 있고 언제 못 누르는 지 정의해준다.
setIsBtnDisable(true);
setIsBtnDisable(false);
📌 예시
1) 나는 버튼을 누르면 handle 함수가 실행되고 이 handle 함수에서 setter에(true)를 넣어 버튼을 못누르도록 함.
const handleChangeMon = async () => {
const newMonList = [...monList] // 지금까지 몬스터 리스트 받아오기
setIsLoading(true); // 로딩화면 on
setIsBtnDisable(true); // 버튼 다시 못누르게 on
await timer() // 로딩 2초간 진행되게
await fetch("http://localhost:3001/monsters")
.then(res => res.json())
.then(data => {
const randomNum = Math.floor(Math.random() * 10);
const newRandomNum = Math.floor(Math.random() * 10);
if (newRandomNum > 5 && newMonList[randomNum].name === "??") {
newMonList[randomNum] = data[randomNum];
setMonList(newMonList)
catchMon(data[randomNum])
} else if (newRandomNum > 5 && newMonList[randomNum].name !== "??") {
catchMon(data[randomNum])
} else {
missMon();
}
})
}
2) 그리고 특정한 로딩화면이 진행되는데 이게 다 진행된 후에 setter 에 (false)를 넣어 다시 클릭 가능하도록 함.
// 못잡은 경우 알림
const missMon = async () => {
setIsLoading(false)
setIsNotCateched(true)
await timer()
setIsNotCateched(false)
setIsBtnDisable(false)
await timer()
}
// 잡은 경우 알림
const catchMon = async (mon) => {
setIsLoading(false)
setIsCatched(true)
await timer()
setIsCatched(false)
alert(`야생의 '${mon.name}'을 잡았습니다!`)
setIsBtnDisable(false)
await timer()
}
3. 완성

*아 물론 disabled 를 활용해도 좋다 ^^
728x90
'react.js' 카테고리의 다른 글
[react 리액트] useRef 사용하여 DOM 요소 접근 (feat. focus()으로 input 창에 바로 입력하게 하기) (0) | 2023.06.14 |
---|---|
[react 리액트] useRef 언제 쓰나요? (react hook) (0) | 2023.06.14 |
[react 리액트] 초간단 게시판, 회원 리스트 만들기 (useState, CRUD) (0) | 2023.06.08 |
[react 리액트] 타입별 State 다루기 (number, string, boolean 타입) (0) | 2023.06.07 |
[react 리액트] custom Hook 커스텀 훅을 만들어보자 (0) | 2023.06.01 |