Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

클릭 기능을 확장할 때 JSX 패턴을 사용하면 어떨까요? #1826

Open
giwan-dev opened this issue Jan 10, 2022 · 2 comments
Open
Labels
discussion In need of more discussion

Comments

@giwan-dev
Copy link
Contributor

giwan-dev commented Jan 10, 2022

실무에서 바로 쓰는 Frontend Clean Code / Slash 21 영상을 보고 영감을 받아 의견을 모아보려고 합니다.

문제점

클릭 핸들러에 기능을 확장할 때 명령형으로 작성하고 있기 때문에 일명 "handleXXXClick" 함수가 엄청나게 길어집니다. stopPropagation, 이벤트 로깅 등의 코드가 하나의 함수 안에 들어가게 됩니다. 나중에 기능을 수정할 때 구현을 계속 추가하기 때문에 점점 수정하기 어렵고 이해하기 힘든 코드가 됩니다.

<PromotionButton onClick={async (e) => {
  /* 하나의 함수에서 세 가지 기능을 수행 */
  e.stopPropagation()

  trackEvent({ /* ... */ })

  await submit()
}} />

해결책

JSX의 선언적 문법과 click 이벤트의 버블링을 활용하여 클릭 기능을 확장하는 패턴을 사용하면 어떨까요?

<StopPropagation>
  <LogEvent name="프로모션_버튼_선택">
    <Button 
      onClick={async () => {
        await submit()
      }}
    >
      이것은 프로모션 버튼입니다.
    </Button>
  </LogEvent>
</StopPropagation>

클릭 이벤트가 버블링되기 때문에 HTML 엘리먼트를 중첩시켜놓으면 클릭 이벤트 처리를 각 엘리먼트에 위임할 수 있습니다. 결국 기존의 코드를 수정하지 않으면서 새로운 기능을 추가할 수 있는 OCP를 만족하는 코드가 됩니다.

단점

HTML 엘리먼트 중첩에 의존하는 패턴이기 때문에 버튼 하나를 구현할 때 HTML 뎁스가 아주 깊어질 수 있습니다. 예를 들어 위 예시의 렌더링 결과는 다음과 같습니다.

<div onClick={stopPropagation}>
  <div onClick={logEvent}>
    <button>이것은 프로모션 버튼입니다.</button>
  </div>
</div>
@giwan-dev giwan-dev changed the title 클릭 기능을 확장할 때 선언적 JSX 패턴을 사용하면 어떨까요? 클릭 기능을 확장할 때 JSX 패턴을 사용하면 어떨까요? Jan 10, 2022
@giwan-dev giwan-dev added the discussion In need of more discussion label Jan 10, 2022
@zhsks528
Copy link
Contributor

zhsks528 commented Jan 10, 2022

아주 매력적인 제안이라고 생각합니다. 🥰

@pgs787
Copy link
Contributor

pgs787 commented Jan 10, 2022

이벤트로그 적용할때를 생각해보면 너무 좋은 것 같습니다!!
영상도 많은 도움이 됐네요!!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
discussion In need of more discussion
Projects
None yet
Development

No branches or pull requests

3 participants