"파일 선택" 기능을 커스텀된 UI로 사용하고 싶어 아래와 같이 코드를 작성했는데 ....
<div onClick={() => {
console.log('파일선택 클릭 ');
fileInputRef.current?.click();
}}
>
<label htmlFor="fileInput">파일 선택</label>
<input
type="file"
id="fileInput"
ref={fileInputRef}
accept="image/jpeg, image/png, image/gif, image/webp, video/mp4, audio/mp3"
style={{ display: 'none' }}
onChange={handleFileSelect}
/>
</div>
왠걸 "파일선택"을 클릭하면 파일 탐색기(?) 파일 선택하는 창이
처음 실행이 되고 사진을 선택하니 한번 더 파일선택 창이 열리는게 아닌가
진짜 감이 안와서 (순간 리액트 strict모드인가 했는데 그건 아니었음) 원인을 찾아보니
바로바로 이론적으로(?)만 듣고 체감한적은 없던 "이벤트 버블링"에 따라 발생한 현상이었다.
클릭 이벤트가 onClick 핸들러를 통해 실행되는동안 해당 요소의 부모 요소들한테도 전달이 되어갔던 것!!!
따라서 이벤트 버블링을 막기 위해 stopPropagation() 함수를 사용하면 된다고 했다(이벤트 함수)
아래는 수정된 코드
onClick={(e: React.MouseEvent<HTMLDivElement>) => {
fileInputRef.current?.click();
e.stopPropagation();
}}
이렇게 코드를 수정하니 정상적으로 파일 선택창이 한번만 열리게 되어따 ㅎ.ㅎ
'📙 자바스크립트 공부' 카테고리의 다른 글
[ Blob ] formData를 보내는데, 왜 blob으로 감싸니 정상적으로 전송이 되었을까? (0) | 2023.06.06 |
---|---|
문득 궁금해진 Promise와 콜백지옥(Promise 객체 안쓸때)의 차이 (0) | 2023.04.17 |
&& 연산자로 undefined/null 걸러내기 (타입스크립트에서 응용) (0) | 2023.01.18 |
[js] 프로토타입이란? / 프로토타입 체인 (0) | 2023.01.15 |
[js] 클래스 개념 이해하기 (1) | 2023.01.15 |
댓글