반응형
1장: 템플릿과 컴포넌트 - Vue.js의 첫인상
Vue 개발의 가장 기본이 되는 두 가지 개념, 템플릿 문법과 컴포넌트에 대해 배웁니다. UI를 레고 블록처럼 조립 가능한 부품으로 만드는 방법을 이해합니다.
1. 핵심 개념
- 컴포넌트(Component): Vue는 UI를 "싱글 파일 컴포넌트(Single File Component, SFC)"라는 독립적이고 재사용 가능한
.vue파일 단위로 나누어 관리합니다. 각 컴포넌트는 자신만의 구조(HTML), 로직(JavaScript), 스타일(CSS)을 하나의 파일 안에 가집니다. - 템플릿 문법 (Template Syntax): Vue는 렌더링될 DOM을 선언적으로 설명하기 위해 HTML 기반의 템플릿 문법을 사용합니다. 데이터 바인딩, 디렉티브 등 강력한 기능을 제공합니다.
<script setup>: Vue 3의 Composition API를 SFC에서 더 간결하게 사용하기 위한 문법 설탕(syntactic sugar)입니다.<script setup>블록 안에 작성된 코드는 컴포넌트가 생성될 때마다 실행되며, 여기에 선언된 변수나 함수는 템플릿에서 바로 사용할 수 있습니다.
2. 템플릿의 주요 규칙
- 데이터 바인딩: 가장 기본적인 데이터 바인딩은 "Mustache" 문법(이중 중괄호)을 사용합니다:
{{ message }}. - 디렉티브(Directives):
v-접두사가 붙는 특별한 속성입니다. Vue가 렌더링된 DOM에 특정 동작을 적용하도록 지시합니다. (예:v-if,v-for,v-bind,v-on) - 속성 바인딩: HTML 속성에 동적인 값을 바인딩할 때는
v-bind디렉티브를 사용합니다. 단축 문법으로 콜론(:)을 사용합니다. (예:v-bind:href="url"또는:href="url") - 이벤트 리스닝: DOM 이벤트를 수신할 때는
v-on디렉티브를 사용합니다. 단축 문법으로 골뱅이(@)를 사용합니다. (예:v-on:click="doSomething"또는@click="doSomething")
3. 예제 코드
예제 1: 기본 컴포넌트 만들기
가장 기본적인 형태의 싱글 파일 컴포넌트입니다.
<!-- src/components/WelcomeMessage.vue -->
<script setup>
// <script setup> 블록 안에 로직을 작성합니다.
import { ref } from 'vue';
// ref()를 사용하여 반응형 데이터를 생성합니다.
const message = ref('Hello, Vue.js World!');
</script>
<template>
<!-- <template> 블록 안에 UI 구조를 정의합니다. -->
<h1>{{ message }}</h1>
</template>
<style scoped>
/* <style scoped> 블록은 이 컴포넌트 내에서만 적용되는 스타일을 정의합니다. */
h1 {
color: #42b883; /* Vue.js의 상징색 */
}
</style>
예제 2: 여러 컴포넌트 조립하기
작은 컴포넌트들을 조립하여 더 큰 컴포넌트나 페이지를 만듭니다.
<!-- src/App.vue -->
<script setup>
import WelcomeMessage from './components/WelcomeMessage.vue';
import MyProfile from './components/MyProfile.vue'; // 추가
</script>
<template>
<div>
<WelcomeMessage />
<MyProfile />
</div>
</template>
4. 연습 문제
문제 1: Header 컴포넌트 만들기
- 요구사항: 웹사이트의 헤더 부분을 담당하는
Header.vue컴포넌트를 만드세요. - 세부사항:
<h1>태그로 사이트 로고(예: "My Awesome Vue Site")를 표시합니다.<nav>태그 안에<ul>과<li>를 사용하여 "Home", "About", "Contact" 라는 세 개의 메뉴 항목을 만듭니다.
- 도전과제:
App.vue에서 이Header컴포넌트를 화면에 렌더링해보세요.
문제 1 정답 예시
<!-- src/components/Header.vue -->
<template>
<header>
<h1>My Awesome Vue Site</h1>
<nav>
<ul>
<li>Home</li>
<li>About</li>
<li>Contact</li>
</ul>
</nav>
</header>
</template>
<style scoped>
header {
background-color: #f2f2f2;
padding: 20px;
text-align: center;
}
ul {
list-style: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
</style>
<!-- src/App.vue -->
<script setup>
import Header from './components/Header.vue';
</script>
<template>
<Header />
<!-- 다른 컨텐츠 -->
</template>
문제 2: Footer 컴포넌트 만들기
- 요구사항: 웹사이트의 푸터 부분을 담당하는
Footer.vue컴포넌트를 만드세요. - 세부사항:
<p>태그를 사용하여 저작권 정보를 표시합니다. (예: "© 2024 My Awesome Vue Site. All rights reserved.")- 소셜 미디어 링크를 담을
div를 만들고, 그 안에 "Facebook", "Twitter", "Instagram" 텍스트를 넣습니다.
- 도전과제:
App.vue에서Header컴포넌트 아래에Footer컴포넌트를 렌더링해보세요.
문제 2 정답 예시
<!-- src/components/Footer.vue -->
<template>
<footer>
<p>© 2024 My Awesome Vue Site. All rights reserved.</p>
<div>
<span>Facebook</span> |
<span>Twitter</span> |
<span>Instagram</span>
</div>
</footer>
</template>
<style scoped>
footer {
border-top: 1px solid #ccc;
margin-top: 20px;
padding: 20px;
text-align: center;
}
</style>
<!-- src/App.vue -->
<script setup>
import Header from './components/Header.vue';
import Footer from './components/Footer.vue';
</script>
<template>
<Header />
<main>
<p>여기는 메인 컨텐츠입니다.</p>
</main>
<Footer />
</template>
반응형
'프론트엔드 > 뷰' 카테고리의 다른 글
| [Vue] 9장: 스타일링 - 컴포넌트에 옷 입히기 (0) | 2025.09.23 |
|---|---|
| [Vue] 8장: 컴포저블과 반응성 심화 - Vue 능력 끌어올리기 (0) | 2025.09.23 |
| [Vue] 7장: 폼과 `v-model` - 사용자의 입력 받기 (0) | 2025.09.23 |
| [Vue] 6장: 리스트 렌더링 - 동적인 목록 만들기 (0) | 2025.09.23 |
| [Vue] 5장: 조건부 렌더링 - 상황에 맞는 UI 보여주기 (0) | 2025.09.23 |
| [Vue] 4장: 이벤트 핸들링 - 사용자와의 상호작용 (0) | 2025.09.23 |
| [Vue] 3장: 반응성과 생명주기 - 살아 움직이는 컴포넌트 (0) | 2025.09.23 |
| [Vue] 2장: Props - 컴포넌트에 생명 불어넣기 (2) | 2025.09.23 |