각 버튼은 독립적인 count를 유지한다. 컴포넌트를 사용할 때마다 해당 컴포넌트의 새 인스턴스가 생성되기 때문이다.
Props 전달하기
props는 상위 컴포넌트에서 하위 컴포넌트로 데이터를 전달할 때 사용하는 속성이다. props 속성을 사용하려면 먼저 하위 컴포넌트의 속성에 정의해야 한다.
블로그 게시물 제목을 컴포넌트에 전달하려면 defineProps 메크로를 사용해야 한다.
<template>
<h4>{{ title }}</h4>
</template>
<scriptsetup>
defineProps(['title'])
</script>
defineProps는 컴포넌트에 전달된 모든 props를 객체로 반환하므로 필요한 경우 js에서 접근할 수 있다.
<scriptsetup>
constprops=defineProps(['title'])
console.log(props.title)
</script>
scsript setup을 사용하지 않는 경우 props 옵션을 선언해서 사용해야 하며 props 객체는 setup()에 첫 번째 인자로 전달된다.
<template>
<h4>{{ title }}</h4>
</template>
<script>
exportdefault {
props: ['title'],
setup(props) {
console.log(props.title);
}
}
</script>
컴포넌트는 원하는 만큼 props를 가질 수 있으며 모든 값을 모두 props에 전달할 수 있다.
props가 등록되면 다음과 같이 데이터를 사용자 정의 속성으로 전달할 수 있다.
App.vue
<template>
<BlogPosttitle="Vue와 함께한 나의 여행" />
<BlogPosttitle="Vue로 블로깅하기" />
<BlogPosttitle="Vue가 재밌는 이유" />
</template>
<scriptsetup>
importBlogPostfrom'./components/BlogPost.vue'
</script>
BlogPost.vue
<template>
<h4>{{ title }}</h4>
</template>
<script>
exportdefault {
props: ['title'],
setup(props) {
console.log(props.title)
}
}
</script>
<style>
h4 {
color: blue;
}
</style>
이는 다음과 같이 게시물 배열을 이용할 수도 있다.
App.vue
<scriptsetup>
import { ref } from'vue'
importBlogPostfrom'./components/BlogPost.vue'
constposts=ref([
{id:1, title:'Vue와 함께한 나의 여행'},
{id:2, title:'Vue로 블로깅하기'},
{id:3, title:'Vue가 재밌는 이유'}
])
</script>
그런 다음v-for를 사용하여 각각을 컴포넌트로 렌더링한다.
<template>
<BlogPost
v-for = "post in posts"
:key = "post.id"
:title = "post.title" />
</template>
이벤트 발생과 수신
하위 컴포넌트에서 이벤트를 발생시켜(event emit) 상위 컴포넌트에 신호를 보내 통신한다. 상위 컴포넌트에서 하위 컴포넌트의 특정 이벤트가 발생하기를 기다리고 있다가 하위 컴포넌트에서 특정 이벤트가 발생하면 상위 컴포넌트에서 해당 이벤트를 수신하여 상위 컴포넌트의 메서드를 호출하는 것이다.
BlogPost 컴포넌트를 개발할 때 일부 기능은 상위 항목과 다시 통신해야 할 수도 있다. 예를 들어 페이지의 나머지 부분은 기본 크기를 유지하면서 블로그 게시물의 텍스트를 확대하는 접근성 기능을 구현할 수 있다.
부모 컴포넌트에서 postFontSize ref를 추가하여 모든 블로그 게시물의 글꼴 크기를 제어할 수 있다.
이 버튼은 아직 아무 동작도 하지 않는다. 버튼을 클릭하여 모든 게시물의 텍스트를 확대한다고 부모에게 알려야 한다. 이 문제를 해결하기 위해 컴포넌트는 커스텀 이벤트 시스템을 제공한다. 부모 컴포넌트는 네이티브 DOM 이벤트와 마찬가지로 v-on 또는 @를 사용하여 자식 컴포넌트 인스턴스의 모든 이벤트를 수신하도록 선택할 수 있다.
<BlogPost
v-for="postinposts"
:key="post.id"
:title="post.title"
@enlarge-text="postFontSize+=0.1"
/>
그런 다음 자식 컴포넌트는 빌트인 $emit 메서드를 호출하고 이벤트 이름을 전달하여 자체적으로 이벤트를 생성할 수 있다.