강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

코딩님의 프로필 이미지
코딩

작성한 질문수

한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지

Header 개발

콜백 함수 메서드 등록

해결된 질문

작성

·

24

·

수정됨

0

 

export default function CityList({ $app, intialState, handleLoadMore }) {
  this.state = intialState;
  this.$target = document.createElement("div");
  this.$target.className = "city-list";
  this.handleLoadMore = handleLoadMore;
  $app.appendChild(this.$target);
  this.template = () => {
    let temp = `<div class="city-items-container">`;
    if (this.state) {
      this.state.cities.forEach((elm) => {
        temp += `
        <div class="city-item" id=${elm.id}>
          <img src=${elm.image}></img>
          <div class="city-item-info">${elm.city},${elm.country}</div>
          <div class="city-item-score">❤️${elm.total}</div>
        </div>
        `;
      });
    }
    temp += `</div>`;
    return temp;
  };
  this.render = () => {
    this.$target.innerHTML = this.template();
    if (!this.state.isEnd) {
      const $loadMoreBtn = document.createElement("button");
      $loadMoreBtn.className = "add-items-btn";
      $loadMoreBtn.textContent = "더보기";

      this.$target.appendChild($loadMoreBtn);
      $loadMoreBtn.addEventListener("click", this.handleLoadMore);
    }
  };
  this.setState = (newState) => {
    this.state = newState;
    this.render();
  };
  this.render();
}

 

이 코드에서

this.handleLoadMore=handleLoadMore;

이부분이 왜 필요한지 이해가 되지 않아서 질문드립니다.
콜백 함수를 이벤트 리스너에 등록 해도 되지 않나요?

this로 메서드 등록해서 사용하는 이유가 궁금합니다.

추가적으로 바닐라 js 로 spa 구현하는 개념들이 매우 어렵고 복잡하게 느껴지는데
바닐라 js로 spa를 구현해보는 프로젝트를 해보고 프레임워크로 넘어가야 하는것일까요..

답변 2

0

효빈 Hyobin님의 프로필 이미지
효빈 Hyobin
지식공유자

안녕하세요 🙂 질문 감사합니다.

강의에서 제공되는 프로젝트 상으로는 꼭 필요한 것은 아닙니다.

다만, this.hanldeLoadMore로 저장하는 이유는 코드의 일관성과 프로젝트의 확장성 때문인데요,
추후에 이벤트 리스너를 제거하거나, 컴포넌트 내 다른 메서드에서도 재사용할 수 있기 때문입니다.


추가적으로 바닐라 JS로 SPA를 완벽하게 구현할 필요는 없습니다.

강의에서 다루는 내용 정도만 경험해보셨다면, 바로 React나 Next 등으로 넘어가서 학습을 해보시고,
이런 라이브러리와 프레임워크들이 바닐라로 구현했던 것을 쉽게 할 수 있게 도와주는구나!를 느끼시는게 오히려 학습에 더 도움이 되실 것 같습니다 🙂

코딩님의 프로필 이미지
코딩
질문자

감사합니다 ^^

0

안녕하세요, 인프런 AI 인턴입니다. 코딩님!

해당 코드는 컴포넌트 구조를 가지고 있는 JavaScript 패턴을 활용하여 CityList 객체를 만드는 과정입니다. 여기서, handleLoadMoreCityList 객체에 속성으로 전달된 콜백 함수로, 이 함수는 주로 데이터를 더 로드하는 버튼, 즉 “더보기” 버튼에 대한 클릭 이벤트를 처리하는 역할을 합니다.

this.handleLoadMore = handleLoadMore;의 필요성

  1. 컨텍스트 공유: this에 메서드로 등록해두면, 이후 이 콜백 함수가 실행될 때 CityList 객체의 다른 프로퍼티나 메서드로부터 정보나 메서드를 사용할 수 있게 됩니다. 만약 이벤트 리스너나 다른 함수 호출에서 handleLoadMore를 직접 설정하지 않으면 this 컨텍스트가 변경될 수 있습니다.

  2. 일관된 접근: 이처럼 this에 등록해두면, 객체 내 다른 메서드들이 콘텍스트 문제 없이 일관되게 접근하고 사용할 수 있습니다.

  3. 코드 유지보수성: 이 패턴을 사용하면, 객체가 자신의 속성이나 메서드를 통해서 콜백 함수들(conceptually part of the object)을 관리하기 때문에 코드의 유지보수가 용이해집니다.

handleLoadMore를 직접 이벤트 리스너에 넣어줄 수도 있지만, 객체지향적인 접근을 통한 유지보수를 쉽게 하고 확장성 있는 코드를 구성하기 위해 이 패턴이 사용됩니다.

아래 유사한 질문에 대한 링크에서 더 자세한 설명을 확인해 보실 수 있습니다:
- CityList개발-handleLoadMore함수질문
- citiList 의 더보기 버튼 함수

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

코딩님의 프로필 이미지
코딩

작성한 질문수

질문하기