Javascript

[js] mvc 패턴을 연습해보자 -3 탭(1)

popeyes 2023. 7. 20. 11:35

추천검색어와 최근 검색어가 있는 '탭'을 만들어보자.

이번 페이지의 요구사항은

● 추천 검색어, 최근 검색어 탭이 검색폼 아래 위치한다

 

index.html에 

<div class="content">
<div id="tab-view"></div>
<div id="search-result-view"></div>

<div id="tab-view"></div>

추가해주고,

 

TapView.js 파일을 만들고 초기 셋팅을 해준다.

 

const TabType = {
KEYWORD: 'KEYWORD',
HISTORY: 'HISTORY'
}

const TabLabel = {
[TabType.KEYWORD]: '추천 검색어',
[TabType.HISTORY]: '최근 검색어',
}

탭타입과 탭라벨을 만들어주고,

 

export default class TabView extends View {
constructor() {
super(qs("tab-view"));
this.template = new Template()
}

show() {
this.element.innerHTML = this.template.getTabList();

super.show()
}
}

super를 활용하여 index.html에 있는 <div id="tab-view"></div>

이 것을 elements로써 활용해준다.

(자세한건 View.js 파일에...)

 

그 후 템플릿이라는 클래스를 새로 만들어주고,

show메서드를 이용하여

View.js 안에 있는 show 메서드로 오버라이딩 해준다.

 

class Template {

getTabList() {
return `
<ul class="tabs">
${Object.values(TabType)
.map(tabType => ({ tabType, tabLabel: TabLabel[tabType]}))
.map(this._getTab)
.join('')
}
</ul>
`
}
 

여기서 Object.values란

특정 객체를 대상으로 value값만 뽑아서 배열로 반환하는 메서드이다.

콘솔창에 찍으면 다음과 같은 결과가 도출된다.

 

그 후 map을 돌려보겠다.

그 후에 다시 map을 돌릴건데,

그 전에 _getTab은 다음과 같다.

_getTab({tabType, tabLabel}) {
return `
<li data-tab="${tabType}">
${tabLabel}
</li>
`
}

이를 활용해 map을 돌려주면,

새로 생성된 객체 하나하나에 HTML코드를 생성할 수 있다.

 

그렇게 하면,

최종 결과물을 완성할 수 있고,

● 추천 검색어, 최근 검색어 탭이 검색폼 아래 위치한다

요구사항을 충족시킬 수 있다.

 

 

-참고 인프런 김정환 "만들고 비교하며 학습하는 리액트"