Event-Bubbling/Capturing | Event-Delegation

Park Bumsoo·2022년 3월 28일
0

Event-Bubbling/Capturing | Event-Delegation

Event-Bubbling/Capturing

Event-Bubbling은 자식에서 부모로 이벤트가 전파 시키는것이다.

반대로 부모에서 자식으로 전파되는것을 Event-Capturing 이라한다.

id를 통해 호출해올경우
event.target.id이 아닌 devent.currentTarget.id를 사용한다.
아래의 경우는 onClick={onClickAlert}이라는 alert을 띄워주는 온클릭 이벤트를 통해 영역 내에서 클릭시 id={el.writer}가 있는곳에 한해서 클릭시 이벤트를 띄워준다.
이 방법은 원하는 위치마다 id={el.writer}를 줘야하기 때문에 비 효율적이다.

	const onClickAlert = (event: any) => {
    alert(`${event.target.id}님이 작성한 댓글입니다.`);
  };

함수를 위처럼 작성시 많은 위치에 id를 준 모습이다.
아래 HTML 부분을 보면 다양한곳에 id가 보인다.

	{props.dataComment?.fetchBoardComments.map((el: any) => (
                <>
                  <S.CommentDetailBox key={el._id} onClick={onClickAlert}>
                    <S.CommentDetailPicture></S.CommentDetailPicture>
                    <S.CommentDetailInfo>
                      <S.CommentWriter>
                        <S.CWriter id={el.writer}>  
                          작성자 : {el.writer}
                        </S.CWriter>
                        <S.CStar id={el.writer}>평점: {el.rating}</S.CStar> 
                      </S.CommentWriter>
                      <S.CommentContents id={el.writer}>{el.contents}</S.CommentContents>
                      <S.CommentTime>
                        {String(el.createdAt).slice(0, 10)}
                      </S.CommentTime>
                    </S.CommentDetailInfo>
                    <S.CommentDetailEdit>
                      <S.CEdit onClick={props.DisplayOnOff}>수정하기</S.CEdit>
                      <S.CDelete onClick={props.deleteOneComment} id={el._id}>
                        삭제하기
                      </S.CDelete>
                      <S.CPw
                        placeholder="    비밀번호"
                        type={"password"}
                        onChange={props.onChangeCommentPw}
                      ></S.CPw>
                    </S.CommentDetailEdit>
                  </S.CommentDetailBox>

그러나 아래의 코드처럼 currentTarget을 이용하여 함수부분을 작성해주고

	const onClickAlert = (event: any) => {
    alert(`${event.currentTarget.id}님이 작성한 댓글입니다.`);
  };

<S.CommentDetailBox> 부분 즉 최상위 부모태그에만 id를 적어주면
모든 자식태그의 위치를 클릭해도 이벤트가 발생하여 alert이 나오게된다.

	{props.dataComment?.fetchBoardComments.map((el: any) => (
                <>
                  <S.CommentDetailBox
                    key={el._id}
                    id={el.writer}
                    onClick={onClickAlert}
                  >
                    <S.CommentDetailPicture></S.CommentDetailPicture>
                    <S.CommentDetailInfo>
                      <S.CommentWriter>
                        <S.CWriter>작성자 : {el.writer}</S.CWriter>
                        <S.CStar>평점: {el.rating}</S.CStar>
                      </S.CommentWriter>
                      <S.CommentContents>{el.contents}</S.CommentContents>
                      <S.CommentTime>
                        {String(el.createdAt).slice(0, 10)}
                      </S.CommentTime>
                    </S.CommentDetailInfo>
                    <S.CommentDetailEdit>
                      <S.CEdit onClick={props.DisplayOnOff}>수정하기</S.CEdit>
                      <S.CDelete onClick={props.deleteOneComment} id={el._id}>
                        삭제하기
                      </S.CDelete>
                      <S.CPw
                        placeholder="    비밀번호"
                        type={"password"}
                        onChange={props.onChangeCommentPw}
                      ></S.CPw>
                    </S.CommentDetailEdit>
                  </S.CommentDetailBox>

Library

사용이유

  • 이미 만들어지고 검증되었기 때문에 에러가 줄어든다.
  • 사용시 직접 작성하지 않기에 시간이 비약적으로 단축된다.

사이트
Ant Design/Material UI 을 주로 사용하며 이 외에도 다양한 사이트가 있다.
그 중 Ant Design은 react에 특화되어있다.

Ant Design : https://ant.design/
Material UI : https://mui.com/

사용법
import를 통해 간단히 가져올 수 있다.

우측 하단의 </> 를 누르게되면 import를 해야되는 코드가 나오게된다.(사진은 Ant Design)
antdisign이 설치 되어있지않나면 npm/yarn 등 본인에 맞게 설치하자
yarn add ~~~
npm install ~~

profile
프론트엔드 주니어 개발자(React, Next.js)

0개의 댓글