리액트에서 이벤트 버블링과 캡쳐를 알아보자.

Luffy.A·2022년 5월 1일
1

버블링? 캡쳐? 당췌 무슨 소리인지 모르겠다. 이 참에 알아보자.

버블링

버블링은 한 요소에 이벤트가 발생 했을 때,

이벤트에 걸어둔 핸들러(함수, 명령)가 동작하고,

이어서 부모요소의 핸들러가 동작한다.

쉽게말하면 버튼을 클릭하는 순간, 족보대로 올라가면서 조상들이 갖고 있는 핸들러도 모두 실행된다.

(5대 호카게를 눌러 나선환을 발사시키면, 4대 호카게 고유기술, 3대 호카게 고유기술, 2대 호카게 고유기술, 1대 호카게 고유기술이 차례로 발사한다!!)

거품처럼 계속 올라간다 해서 버블링인가?

<div class="1대">
	<div class="2대">
		<div class="3대">
			<div class="4대">
				<div class="5대">
					나선환!!!!!!!!!!🌀
				</div>
			</div>
		</div>
	</div>
</div>

캡처링

캡처링은 버블링과 반대개념이라고 생각하면 된다.

버블링이 가장 하단 요소에서 조상요소로 올라간다면

캡처링은 그 반대로 조상에서 하단으로 내려가는 셈이다. (족보 순이다)

5대 호카게를 누르면 1대 2대 3대 4대 5대 순으로 캡처링을 한다.

쉽게 생각하면,

버블링은 줌아웃 느낌이고

캡처링은 줌인 느낌이다.

(그런데 줌인 줌아웃 하면서 다 건드린다ㅎㅎㅎ)

그러면, 리액트에서 버블링과 캡처링의 실행순서는 어떻게 될까??

버블링과 캡처링의 실행 순서

const Event = () => {
    

    const handleClickCapture = () => {
        console.log("할아버지 캡쳐")
    }

    const handleClickCapture2 = () => {
        console.log("아빠 캡쳐")
    }

    const handleClickBubble = () => {
        console.log("할아버지 버블")
    }

    const handleClickBubble2 = () => {
        console.log("아빠 버블")
    }

    const handleBtnClick = () => {
        console.log("아들클릭!")
    }

        <div className="할아버지" onClickCapture={handleClickCapture} onClick={handleClickBubble}>
            <div className="아빠" onClickCapture={handleClickCapture2} onClick={handleClickBubble2}>
                <button className="아들" onClick={handleBtnClick}>Button</button>
            </div>
        </div>
    );
};

버튼을 만들었다.

평범해 보이지만 평범하지 않다. 무려 부모님과 조부모님도 있다.

편의를 위해 클래스네임을 할아버지 아빠 아들로 지었다.

할아버지에게는 클릭이벤트와 캡처 이벤트를 걸었다.

아빠에게도 클릭이벤트와 캡처 이벤트를 걸었다.

그럼, 아들놈을 어디 한 번 클릭해보자!

콘솔이 이렇게 찍혔다.

  1. 할아버지 캡쳐
  2. 아빠 캡쳐
  3. 아들 클릭
  4. 아빠 버블
  5. 할아버지 버블

캡처링이 먼저 일어나고, 타깃 이벤트가 일어나고 이후에 버블이 일어난다.

굉장히 흥미롭다. 줌인을 하고 타깃을 찍고 줌아웃으로 빠지는 그런 느낌적인 느낌?

그렇다면 캡처는 이런식으로 쓸 수 있겠지?

아들이 빵을 사야하는데 돈이없다. 아들은 빵을 사는 이벤트인데,

돈이 없으니까, 아빠 캡처로 먼저 돈주기 이벤트를 넣으면?

아들이 빵을 사러 가기 전에 이미 돈을 받았으니까 잘 되겠지?ㅎㅎ

사실 캡처이벤트는 많이 사용하지 않는다고 한다.

그래도 언젠가 이런게 필요한 날이 올테니 잘 기억해두자!

참고문서

https://ko.javascript.info/bubbling-and-capturing

profile
함께 만들어낸 근사한 것들을 기억하자

0개의 댓글