VueJS - 컴포넌트: 현대 웹 애플리케이션의 건축 블록

안녕하세요, 미래의 Vue.js 마법사 여러분! Vue.js 컴포넌트의 세상으로 이끌어주는 여정에 함께할 수 있어 기쁩니다. 프로그래밍을 가르치고 있는 지 오래된 저로서는, 컴포넌트를 이해하는 것은 LEGO 블록을 사용하는 것과 같다고 말씀드릴 수 있습니다. 한 번 익혀보면 놀라운 것들을 만들 수 있습니다! 그럼 이제 즐겁게 시작해보겠습니다!

VueJS - Components

Vue.js 컴포넌트는 무엇인가요?

컴포넌트는 Vue.js 애플리케이션의 핵심입니다. HTML, CSS, 그리고 JavaScript 기능을 포함한 재사용 가능한 코드 조각으로 생각해보세요. LEGO 조각들을 사용하여 성을 짓는 것처럼, 다양한 컴포넌트를 사용하여 복잡한 웹 애플리케이션을 만들 수 있습니다.

이하에 Vue 컴포넌트의 간단한 예제를 보여드리겠습니다:

<template>
<div class="greeting">
<h1>{{ message }}</h1>
</div>
</template>

<script>
export default {
data() {
return {
message: "Hello, Vue Component!"
}
}
}
</script>

<style scoped>
.greeting {
color: blue;
}
</style>

이를 분해해보면:

  1. <template> 섹션은 컴포넌트의 HTML 구조를 포함합니다.
  2. <script> 섹션은 컴포넌트의 논리와 데이터를 정의합니다.
  3. <style> 섹션( scoped 속성 포함)은 이 컴포넌트에만 적용되는 CSS를 포함합니다.

컴포넌트 생성 및 사용

이제 컴포넌트의 모양을 알고 있으므로, 하나를 만들어 애플리케이션에서 사용해보겠습니다!

단계 1: 새로운 컴포넌트 생성

프로젝트의 components 폴더에 Greeting.vue 파일을 생성합니다:

<!-- Greeting.vue -->
<template>
<div class="greeting">
<h2>{{ greeting }}</h2>
</div>
</template>

<script>
export default {
data() {
return {
greeting: "Welcome to Vue.js!"
}
}
}
</script>

<style scoped>
.greeting {
font-style: italic;
color: green;
}
</style>

단계 2: 애플리케이션에서 컴포넌트 사용

이제 이 컴포넌트를 주 App.vue 파일에서 사용해보겠습니다:

<!-- App.vue -->
<template>
<div id="app">
<h1>My Vue.js App</h1>
<Greeting />
</div>
</template>

<script>
import Greeting from './components/Greeting.vue'

export default {
name: 'App',
components: {
Greeting
}
}
</script>

이렇게 되고 있습니다:

  1. Greeting 컴포넌트를 가져옵니다.
  2. App 컴포넌트의 components 옵션에 등록합니다.
  3. 템플릿에서 <Greeting /> 태그로 사용합니다.

그렇게 하면! 여러분이 첫 번째 Vue 컴포넌트를 생성하고 사용한 것입니다!

Props: 컴포넌트로 데이터 전달

Props는 부모 컴포넌트에서 자식 컴포넌트로 데이터를 보내는 마법의 파이프입니다. Greeting 컴포넌트를 개선하여 커스텀 메시지를 받을 수 있도록 합시다:

<!-- Greeting.vue -->
<template>
<div class="greeting">
<h2>{{ customGreeting }}</h2>
</div>
</template>

<script>
export default {
props: ['message'],
computed: {
customGreeting() {
return `${this.message} Welcome to Vue.js!`
}
}
}
</script>

이제 App.vue에서 다음과 같이 사용할 수 있습니다:

<!-- App.vue -->
<template>
<div id="app">
<h1>My Vue.js App</h1>
<Greeting message="Hello, dear student!" />
<Greeting message="Greetings, Vue enthusiast!" />
</div>
</template>

이Isn't that cool? We can reuse the same component with different messages!

이벤트 발생: 자식에서 부모로의 통신

Props는 부모에서 자식으로의 통신을 가능하게 하지만, 이벤트는 자식에서 부모로의 통신을 가능하게 합니다. 자식이 부모에게 아이스크림을 달라고 하는 것과 같은 것입니다!

이제 클릭 시 이벤트를 발생시키는 Button 컴포넌트를 생성해보겠습니다:

<!-- Button.vue -->
<template>
<button @click="handleClick">{{ label }}</button>
</template>

<script>
export default {
props: ['label'],
methods: {
handleClick() {
this.$emit('button-clicked', 'The button was clicked!')
}
}
}
</script>

이제 이를 App.vue에서 사용해보겠습니다:

<!-- App.vue -->
<template>
<div id="app">
<h1>My Vue.js App</h1>
<Button label="Click me!" @button-clicked="handleButtonClick" />
<p>{{ message }}</p>
</div>
</template>

<script>
import Button from './components/Button.vue'

export default {
name: 'App',
components: {
Button
},
data() {
return {
message: ''
}
},
methods: {
handleButtonClick(msg) {
this.message = msg
}
}
}
</script>

버튼이 클릭될 때, 부모 컴포넌트가 이벤트를 듣고 응답합니다. 조화로운 가족 대화와 같습니다!

슬롯: 유연한 컴포넌트 콘텐츠

슬롯은 컴포넌트 내의 플레이스홀더로, 원하는 콘텐츠로 채울 수 있습니다. 유연하고 재사용 가능한 컴포넌트를 만드는 데 매우 유용합니다.

Card 컴포넌트에 슬롯을 추가해보겠습니다:

<!-- Card.vue -->
<template>
<div class="card">
<div class="card-header">
<h3>{{ title }}</h3>
</div>
<div class="card-body">
<slot></slot>
</div>
</div>
</template>

<script>
export default {
props: ['title']
}
</script>

<style scoped>
.card {
border: 1px solid #ccc;
border-radius: 4px;
padding: 10px;
margin-bottom: 10px;
}
.card-header {
background-color: #f1f1f1;
padding: 5px;
}
</style>

이제 Card 컴포넌트를 다양한 콘텐츠로 사용할 수 있습니다:

<!-- App.vue -->
<template>
<div id="app">
<Card title="Welcome">
<p>Welcome to our Vue.js tutorial!</p>
</Card>
<Card title="About Components">
<ul>
<li>Components are reusable</li>
<li>They can have props</li>
<li>They can emit events</li>
</ul>
</Card>
</div>
</template>

<script>
import Card from './components/Card.vue'

export default {
name: 'App',
components: {
Card
}
}
</script>

동적 컴포넌트

동적 컴포넌트는 다양한 컴포넌트를 동적으로 전환할 수 있습니다.瑞士軍刀의 컴포넌트와 같은 것입니다!

간단한 예제를 만들어보겠습니다:

<!-- App.vue -->
<template>
<div id="app">
<button @click="currentComponent = 'Greeting'">Show Greeting</button>
<button @click="currentComponent = 'Button'">Show Button</button>
<component :is="currentComponent"></component>
</div>
</template>

<script>
import Greeting from './components/Greeting.vue'
import Button from './components/Button.vue'

export default {
name: 'App',
components: {
Greeting,
Button
},
data() {
return {
currentComponent: 'Greeting'
}
}
}
</script>

이 예제에서, <component> 엘리먼트와 is 어트리뷰트를 사용하여 Greeting 또는 Button 컴포넌트를 클릭한 버튼에 따라 동적으로 렌더링합니다.

결론

축하합니다! Vue.js 컴포넌트의 fascinante 세상으로的第一步을踏み出しました。いかなるスキルでも、練習は完璧を生みます。実験を恐れず、自分自身のコンポーネントを作成してください。それでは、複雑でインタラクティブなウェブアプリケーションを簡単に作成するまでに、すぐに到達することでしょう!

ここでカバーしたコンポーネントの機能の簡単な参照表を示します:

機能 説明
基本構造 Template、Script、Styleセクション
Props 親から子へのデータ伝達
イベント 子から親への通信
スロット ゆるやかなコンテンツプレイスホルダー
动态组件 コンポーネント間の切换

コードを続け、学びを続け、最も重要なことは、Vue.jsを楽しむことです!

Credits: Image by storyset