studyHard
const Section = () => {
  const [modalOpen, setModalOpen] = useState(false);

  const imagesArr = [
    "/img/1.png",
    "/img/2.png",
    "/img/3.png",
    "/img/4.png",
    "/img/5.png",
    "/img/6.png",
    "/img/7.png",
    "/img/8.png",
  ];

  const showModal = () => {
    setModalOpen(true);
  };

  return (
    <>
      <section className="main-section">
        {imagesArr.map((image, index) => (
          <div key={index} className="image-wrapper" onClick={showModal}>
            <img src={image} alt={`image${index}`} />
            {modalOpen && <Modal setModalOpen={setModalOpen} />}
          </div>
        ))}
      </section>
    </>
  );
};
function Modal({ setModalOpen, id, title, content, writer }) {
  const closeModal = () => {
    setModalOpen(false);
  };

  return (
    <div className={styles.container}>
      <button
        className={styles.close}
        onClick={e => {
          e.stopPropagation(); // 이벤트 버블링을 막아줌
          closeModal();
        }}
      >
        <span>X</span>
      </button>
    </div>
  );
}

 

modal을 닫으려고 x를 눌렀을때 modal이 닫히지 않아서 당황했다..  🫠🫠🫠

이유를 찾아보니까  x를 눌렀을때 closeModal 함수가 실행되면서 modalOpen의 값이 false로 바뀌게 되는데

이때 부모요소인

<div key={index} className="image-wrapper" onClick={showModal}>

이 div의 onClick showModal 함수가 실행되면서 modalOpen의 값이 true가 되어버려서 닫히지 않던 것이다..

이를 e.stopPropagation()로 해결할 수 있었다.

 

 


 

e.stopPropagation() 메서드는 Event 및 버블링 단계에서 현재 이벤트의 추가 전파를 방지합니다.

e.stopPropagation() 메서드는 이벤트 전파를 중지시켜 상위요소로 전파되지 않도록 합니다.

 

 

<div onClick={() => console.log('div clicked')}>
  <button onClick={() => console.log('button clicked')}>Click me</button>
</div>

 

위 코드는 button을 클릭하면 'button clicked' 메시지와 함께 div요소의 클릭 이벤트도 함께 발생한다.

이는 버블링 방식으로 이벤트가 전파되기 때문이다.

 

 

<div onClick={() => console.log('div clicked')}>
  <button onClick={(event) => {
    event.stopPropagation();
    console.log('button clicked');
  }}>Click me</button>
</div>

 

위 코드는 button을 클릭하면 'button clicked' 메시지만 출력되고 div요소의 클릭 이벤트는 발생하지 않는다.

profile

studyHard

@언젠간코딩잘함

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!