Vue로 작성된 컴포넌트를 React로 바꾸기 위해 Vue 컴포넌트 파일을 처음 접해보고, 최상단에 있는
<template>
태그가 무엇을 의미하는 건지 알아보기 위해 html 태그들에 대해 다시 알아보게 되었다.
<template>
: 콘텐츠 템플릿 요소<template>
요소의 콘텐츠를 읽기는 하지만, 이는 유효성을 검증하기 위함이며 렌더링 하기 위함은 아님<!-- html 코드 -->
<template id = "will-be-rendered">
<span>I am template tag</span>
</template>
<div id = "target">I am div tag</div>
<script src="script.js"></script>
// JavaScript 코드
let target = document.querySelector('#target');
let template = document.querySelector('#will-be-rendered');
// will-be-rendered 안쪽 내용을 복사 (자식 노드 전부 포함해서)
let newContent = document.importNode(template.content, true);
target.innerHTML = '';
target.appendChild(newContent);
위의 html 파일을 로드 하면
will-be-rendered
의 id를 가진 template 태그의 내용이 문서에 출력된다.
- script에서 template태그를 활성화(importNode) 시켜주었기 때문.
- html코드만 로드한다면 template 태그의 내용은 화면에 보이지 않음.
importNode()
를 통해 숨겨진 html의 template 태그 내용을 화면 위로 끌어올린 것.
⌨️ Document.importNode(externalNode, deep)
: 현재 문서가 아닌 외부 문서의 노드를 복사하여 현재 문서에 넣을 수 있게 해주는 메소드
externalNode
는 다른 문서에서 가져오는 노드deep
은 boolean 타입을 가지는데, 노드의 자식 요소들을 포함하여 가져올 것인지 여부를 나타냄<script>
: 클라이언트 스크립트script 태그는 HTML에 클라이언트 스크립트(client-side script)를 추가하고 싶을 때 사용한다.
클라이언트-서버
구조의 클라이언트 쪽에서 행해지는 처리를 말한다.웹 브라우저의 동작을 제어하거나 데이터와 실행 가능한 코드를 HTML에 포함하고 싶을 때 사용하는 태그
💡
<script>
태그의 위치
script 태그는 어디에 위치해 있느냐에 따라 구동 방식이 바뀌는데, body 태그의 최하단에 위치하는 게 가장 좋다.
유저의 편의성을 위해서는 렌더링이 최대한 빨리 되는 게 좋은데, 렌더링 엔진이 HTML 문서를 파싱하는 도중 script 태그를 만나게 되면 중간에 파싱을 멈추게 되기 때문에 그만큼 브라우저 화면에 표시되는 시간이 길어지게 된다.
이와 같은 상황을 막기 위해 script 태그는 body 태그의 최하단에 위치하는 게 가장 좋은 것.
(자세한 건 다음 블로그의 '브라우저 구조' 그림 참고)
<slot>
: vue에서 사용하는 컴포넌트 재사용 태그슬롯(slot)은 컴포넌트의 재사용성을 높여주는 기능으로, 특정 컴포넌트에 등록한 하위 컴포넌트의 마크업을 확장하거나 재정의할 수 있음.
<!-- ButtonTab.vue -->
<template>
<div class="tab panel">
<!-- 탭 헤더 -->
<slot></slot>
<!-- 탭 본문 -->
<div class="content">
Tab Contents
</div>
</div>
</template>
ButtonTab
컴포넌트의 코드를 나타냄ButtonTab
컴포넌트를 등록한 상위 컴포넌트에서 <slot>
태그 영역을 구현하지 않으면 해당 영역은 공백으로 표시된다.<!-- TabContainer.vue -->
<template>
<button-tab>
<!-- slot 영역 -->
<h1>First Header</h1>
</button-tab>
<button-tab>
<!-- slot 영역 -->
<h1>Second Header</h1>
</button-tab>
<button-tab>
<!-- slot 영역 -->
<h1>Third Header</h1>
</button-tab>
</template>
<script>
export default {
components: {
ButtonTab
}
}
</script>
TabContainer
컴포넌트에 ButtonTab
컴포넌트를 등록하고 세 곳에 표시했음.<button-tab>
컴포넌트 태그의 안에 각기 다른 헤더의 내용을 정의함.슬롯은 name 속성을 지정하여 여러 개 사용할 수도 있다.
<!-- ButtonTab.vue -->
<template>
<div class="tab panel">
<!-- 탭 헤더 -->
<slot name="header"></slot>
<!-- 탭 본문 -->
<slot name="content"></slot>
</div>
</template>
<!-- TabContainer.vue -->
<template>
<button-tab>
<!-- slot 영역 -->
<h1 slot="header">First Header</h1>
<div slot="content" class="content">Tab Contents #1</div>
</button-tab>
<button-tab>
<!-- slot 영역 -->
<h1 slot="header">Second Header</h1>
<div slot="content" class="content">Tab Contents #2</div>
</button-tab>
<button-tab>
<!-- slot 영역 -->
<h1 slot="header">Third Header</h1>
<div slot="content" class="content">Tab Contents #3</div>
</button-tab>
</template>
..
TabContainer
컴포넌트에 세번씩 등록한 모습<button-tab>
<!-- slot 영역 -->
<template slot="header">
<h1>First Header</h1>
</template>
<template slot="content">
<div class="content">Tab Contents #1</div>
</template>
</button-tab>
<template>
태그를 이용하여 사용하는 방법도 있음.참고 |
Vue.js 2.6버전부터 Named Slots 문법이 바뀌었다<!-- 기존(2.5 이하) --> <template slot="header"> <h1>First Header</h1> </template> <!-- 이후(2.6 이상) --> <template v-slot:header> <h1>First Header</h1> </template>
<mark>
: 특정 영역 강조mark 태그는 문장에서 특정 영역을 강조할 때 사용함.
마치 형광펜으로 칠한 것과 같이 나타난다.
<mark>강조할 내용</mark>
화면에 나타나는 모습: