Event

μ΄λ²€νŠΈλž€ 단어 κ·ΈλŒ€λ‘œ "사건"을 λ§ν•˜λŠ”λ°, μ‚¬μš©μžμ˜ ν–‰λ™μœΌλ‘œ 인해 λ°œμƒν•˜λŠ” DOM μš”μ†Œμ˜ 변경이 μΌμ–΄λ‚˜λŠ” μΈν„°λž™μ…˜μ„ λ§ν•œλ‹€. μ‰½κ²Œ 말해 ν΄λ¦­μ΄λ‚˜ κ°’ μž…λ ₯ 처럼 기쑴의 DOM μš”μ†Œμ—μ„œ μ–΄λ– ν•œ 변경이 μΌμ–΄λ‚˜λŠ” 것을 λͺ¨λ‘ 이벀트라고 λ§ν•œλ‹€.

νŠΉμ • μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λ©΄ μ–΄λ–»κ²Œ μ²˜λ¦¬ν• κ²ƒμΈμ§€λ₯Ό κ°œλ°œμžκ°€ μ½”λ“œλ‘œ κ΅¬ν˜„ν•˜λ©°, 이 μ½”λ“œλ‘œ κ΅¬ν˜„ν•œ 처리 ν•¨μˆ˜λ₯Ό λ°”λ‘œ 이벀트 ν•Έλ“€λŸ¬ 라고 ν•˜κ³ , 이벀트 ν•Έλ“€λŸ¬ μ•ˆμ—μ„œ 이벀트의 정보λ₯Ό λ‹΄μ•„ μ‚¬μš© λ˜λŠ” 객체가 λ°”λ‘œ 이벀트 객체 e 이닀.

// μ‚¬μš©μžκ°€ μž…λ ₯ν• λ•Œ λ°œμƒν•˜λŠ” change 이벀트의 정보λ₯Ό 담은 이벀트객체 e λ₯Ό μ‚¬μš©ν•˜λŠ” 이벀트 ν•Έλ“€λŸ¬ ν•¨μˆ˜μ΄λ‹€.
const handleChange = (e:ChangeEvent<HTMLInputElement>) => {
    console.log(e.target.value);
}

Event Bubbling

λΈŒλΌμš°μ €μ—μ„œ μ΄λ²€νŠΈκ°€ λ°œμƒν•˜κ²Œ 되면, μ΄λ²€νŠΈκ°€ λ°œμƒν•œ μš”μ†Œμ˜ μ΅œμƒμœ„ μš”μ†ŒκΉŒμ§€ 이벀트λ₯Ό μ „νŒŒμ‹œν‚€λŠ”λ° 이것을 λ°”λ‘œ 이벀트 버블링이라고 ν•œλ‹€.

const Parent = () => {
    const handleClick = () => {
        console.log('λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈ 클릭')
    }
    return (
        <div onClick={handleClick}>
            <h1></h1>
            <Child />
        </div>
    )
}

const Child = () => {
    const handleClick = (e) => {
        // e.stopPropagation();
        console.log('μžμ‹ μ»΄ν¬λ„ŒνŠΈ 클릭')
    }
    return <button onClick={handleClick}>μžμ‹ μ»΄ν¬λ„ŒνŠΈ λ²„νŠΌ</button>
}

μœ„ μ½”λ“œλŠ” λ¦¬μ•‘νŠΈλ₯Ό μ‚¬μš©ν•΄ κ°„λ‹¨ν•œ 이벀트 버블링을 κ΅¬ν˜„ν•œ μ˜ˆμ‹œμ΄λ‹€. μžμ‹μ»΄ν¬λ„ŒνŠΈμΈ λ²„νŠΌμ„ ν΄λ¦­ν•˜κ²Œ 되면 "μžμ‹ μ»΄ν¬λ„ŒνŠΈ 클릭" μ΄λΌλŠ” λ‘œκ·Έμ™€ ν•¨κ»˜ λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈλ₯Ό ν΄λ¦­ν–ˆμ„λ•Œ λ°œμƒν•˜λŠ” 이벀트 ν•Έλ“€λŸ¬ ν•¨μˆ˜λ„ 같이 μ‹€ν–‰λœλ‹€. λ§Œμ•½ 이벀트 버블링을 λ§‰μœΌλ €λ©΄ μ£Όμ„μ²˜λ¦¬κ°€ λ˜μ–΄μžˆλŠ” e.stopPropagation() 을 μ‚¬μš©ν•˜μ—¬ μ „νŒŒλ₯Ό λ§‰μ„μˆ˜ μžˆλ‹€.

Event Capturing

이벀트 μΊ‘μ²˜λ§μ€ 버블링과 λ°˜λŒ€λ‘œ μ΅œμƒμœ„ μš”μ†Œμ—μ„œ μ΄λ²€νŠΈκ°€ λ°œμƒν•œ μš”μ†Œλ₯Ό 탐색해 λ‚΄λ €κ°€λŠ” 것을 λ§ν•œλ‹€.

const Parent = () => {
  const handleCaptureClick = () => {
    console.log('λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ˜ 클릭 μ΄λ²€νŠΈκ°€ μΊ‘μ²˜λ§λ˜μ—ˆμŠ΅λ‹ˆλ‹€.');
  };

  return (
    <div onClickCapture={handleCaptureClick}>
      λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈ
      <Child />
    </div>
  );
};

const Child = () => {
  const handleClick = () => {
    console.log('μžμ‹ μ»΄ν¬λ„ŒνŠΈμ˜ 클릭 μ΄λ²€νŠΈκ°€ λ²„λΈ”λ§λ˜μ—ˆμŠ΅λ‹ˆλ‹€.');
  };

  return <button onClick={handleClick}>μžμ‹ μ»΄ν¬λ„ŒνŠΈ λ²„νŠΌ</button>;
};

λ²„λΈ”λ§μ˜ μ˜ˆμ‹œμ™€λŠ” λ‹€λ₯΄κ²Œ λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ˜ div μš”μ†Œμ— onClickCapture λΌλŠ” 속성을 μ‚¬μš©ν•΄ 캑처링 이벀트 ν•Έλ“€λŸ¬λ₯Ό λ“±λ‘ν–ˆλ‹€. 이후 λ²„νŠΌμ„ ν΄λ¦­ν•˜κ²Œ 되면 μžμ‹ μš”μ†ŒκΉŒμ§€ 캑처링 된 ν›„ , λ‹€μ‹œ λ²„λΈ”λ§λ˜μ–΄ λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈκΉŒμ§€ μ΄λ²€νŠΈκ°€ μ „νŒŒλœλ‹€.

Event Delegation

이벀트 μœ„μž„μ€ μƒμœ„ μš”μ†Œμ—μ„œ ν•˜μœ„ μš”μ†Œμ˜ μ΄λ²€νŠΈλ“€μ„ μ œμ–΄ν•˜λŠ” 것을 λ§ν•œλ‹€. μ‰½κ²Œ 말해 κ³΅ν†΅μ˜ μƒμœ„ μš”μ†Œμ—μ„œ ν•˜μœ„ μš”μ†Œμ˜ 이벀트λ₯Ό λ‹€λ£¨λŠ” 것이닀.

const Parent = () => {
  const handleClick = (event) => {
    const target = event.target;
    if (target.classList.contains('child1')) {
      console.log('첫 번째 μžμ‹μ΄ ν΄λ¦­λ˜μ—ˆμŠ΅λ‹ˆλ‹€.');
    } else if (target.classList.contains('child2')) {
      console.log('두 번째 μžμ‹μ΄ ν΄λ¦­λ˜μ—ˆμŠ΅λ‹ˆλ‹€.');
    } else if (target.classList.contains('child3')) {
      console.log('μ„Έ 번째 μžμ‹μ΄ ν΄λ¦­λ˜μ—ˆμŠ΅λ‹ˆλ‹€.');
    }
  };

  return (
    <div onClick={handleClick}>
      λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈ
      <Child1 />
      <Child2 />
      <Child3 />
    </div>
  );
};

const Child1 = () => {
  return <button className="child1">첫 번째 μžμ‹ μ»΄ν¬λ„ŒνŠΈ λ²„νŠΌ</button>;
};

const Child2 = () => {
  return <button className="child2">두 번째 μžμ‹ μ»΄ν¬λ„ŒνŠΈ λ²„νŠΌ</button>;
};

const Child3 = () => {
  return <button className="child3">μ„Έ 번째 μžμ‹ μ»΄ν¬λ„ŒνŠΈ λ²„νŠΌ</button>;
};

μœ„ μ½”λ“œμ²˜λŸΌ μ—¬λŸ¬ μžμ‹μ„ κ°€μ§€κ³  μžˆμ„λ•Œ, μžμ‹λ“€μ˜ 클릭이벀트λ₯Ό κ³΅ν†΅λœ λΆ€λͺ¨μ—μ„œ κ΄€λ¦¬ν•˜λŠ” 것을 λ§ν•œλ‹€.

Last updated