이벤트 버블링으로 생길 수 있는 문제를 막기 위해, 항상 부모 요소에 이벤트를 위임하는 방식으로 코드를 작성하고 있었다.
<label onClick={toggleSelectBox}>
<input id={id} type="text"/>
{!isSelectBoxClicked && (<DownArrowIcon size={20}/>)}
{!isSelectBoxClicked && (<UpArrowIcon size={20}/>)}
</label>
{isSelectBoxClicked && (
<ul className={styles.optionList}>/*...*/</ul>
)}
부모 컴포넌트인 label에 이벤트를 위임하면, input이나 Icon에 클릭 이벤트가 발생했을 때에도 label에 등록된 toggleSelectBox가 실행된다. 그래야 하는데 icon을 클릭했을 때 예상한 대로 동작하지 않는 것을 확인할 수 있었다. 그 이유는 다음과 같았다.
- 사실 icon을 클릭했을 때, label에 등록된 toggleSelectBox 함수가 잘 실행되었다.
- 문제는 그 다음 단계에서 일어났는데, icon을 클릭 하면 input에도 클릭이벤트가 발생했다. input이 icon의 부모 요소인 것도 아닌데!
- ??? 이유는 잘 모르겠다. icon이 클릭 상태에 따라 렌더링 화면에서 사라지는 것과 관련이 있을까?
- input 클릭이 발생했으므로 label에 등록된 toggle 함수가 다시 실행되어서, 원래 상태로 돌아와 버린다.
그래서 이런 저런 방법들을 시도해 보았고, 원하는 대로 코드를 동작하게 만들 수 있는 방법을 찾았다.
{!isSelectBoxClicked && (
<DownArrowIcon
size={20}
onClick={(event) => event.preventDefault()}
className={styles.icon}
/>
)}
- icon을 클릭했을 때 preventDefault를 실행하도록 했다.
- 이 때 여전히 icon을 이루고 있는 태그(svg, path)에는 클릭이벤트가 발생하지만, input에는 클릭 이벤트가 발생하지 않았다. => 코드가 원하는 대로 동작!
- ??? 클릭 이벤트의 default 동작이 무엇인지 정확히 알아볼 필요가 있다.
'Study > Side Projects' 카테고리의 다른 글
[Zeros] 1.0.0 마무리 (0) | 2022.09.01 |
---|---|
[Zeros] location.state를 사용하면 안되는 경우 (0) | 2022.09.01 |
[Zeros] 로그인 상태 유지하기 (1) | 2022.09.01 |
[Zeros] creat react app & postcss (0) | 2022.09.01 |
[Zeros] stopPropagation vs. event.target !== event.currentTarget (0) | 2022.08.26 |