컴포넌트(Component)란 ...?
Vue의 강력한 기능중 하나로, 중복되어 복잡한 코드를 해결할 수 있는 최선의 방안.
컴포넌트는 쉽게 말해 '나누는 것' 이다. 단적인 예로 홈페이지의 네비게이션 바는 모든 페이지에서 필요하다. 각 페이지에서 중복이 되니 따로 분리해서 컴포넌트의 이름만 명시 하는 것으로 추가 시킬 수 있다.
(HTML로 웹을 제작할때 파일을 분리해서 제작하는 것과 비슷한 느낌을 받는다.)
분리된 컴포넌트는 또 다른 컴포넌트에 삽입되거나, main 파일에 사용될 것이다. 그 경우 삽입된 컴포넌트와 사용하는 파일 사이에는 부모-자식 관계가 성립된다.
Props는 컴포넌트에서 사용되는 기능이다
앞서 컴포넌트가 사용되면 부모-자식 관계가 성립된다고 말했는데, 부모의 데이터를 컴포넌트에서 사용하고 싶을때 사용하는 것이 props 이다. 데이터 뿐만 아니라 methods를 부모->자식으로 넘겨줘서 자식(컴포넌트)은 이를 이용할 수 있게 된다.
컴포넌트의 사용법
컴포넌트를 사용하기 위해선 크게
1. 컴포넌트 파일(.vue)을 만든다
2. 컴포넌트를 import 한다
3. 컴포넌트를 components에 등록한다
4. 컴포넌트를 사용한다
네 가지 단계를 거쳐 사용한다. 복잡해 보이지만 문법적으로 어려운 것 하나없이 손쉽게 사용할 수 있다.
다음에서 예제를 살펴보자.
<template>
<Nav/> <!-- 4. Nav 컴포넌트 사용 -->
</template>
<script>
import Nav from '/Nav.vue파일 경로' <!-- 2. Nav 컴포넌트 import -->
export default{
name: "App",
data() {
return{
menu: ['Home', 'Shop', 'Main'],
<!-- Nav에 들어가는 데이터 -->
}
},
components: {
Nav: Nav, <!-- 3. Nav 컴포넌트 등록 -->
}
</script>
위와 같이 작성을 한다면, 기존에 사용된 menu 데이터는 Nav 컴포넌트에서 사용할 수 없게 된다.
왜냐하면 기존에는 하나의 파일 안에서 동작했지만, 컴포넌트로 분리된 순간 엄연히 다른 파일이기 때문에 App.vue에 등록한 데이터는 사용할 수 없다.
이를 해결하기 위해선 Nav.vue의 데이터를 똑같이 만들어 줘도 되지만, 중복된 데이터는 없앨 수 있으면 없애는 것이 개발자의 참된 모습이기 때문에 이 방법은 옳지 않다.
따라서 우리는 props를 활용해야 한다!
Props의 사용법
props는 컴포넌트를 사용할 때 같이 넘겨주면 되는데, 사용 방법은 다음과 같다.
1. 컴포넌트를 사용하는 곳에 명시해 props로 넘겨준다
※속성 바인딩과 같이 :(콜론) 사용
2. 자식 관계의 컴포넌트(예시에선 Nav.vue)파일에 props를 등록해 준다
3. 자식 관계의 컴포넌트 파일에서 데이터 바인딩 형식으로 사용한다
### App.vue ###
<template>
<Nav :menu="menu" /> <!-- 1. Nav 컴포넌트에 props로 데이터를 넘겨줌 -->
</template>
<script>
import Nav from '/Nav.vue파일 경로'
export default{
name: "App",
data() {
return{
menu: ['Home', 'Shop', 'Main'],
<!-- Nav에 들어가는 데이터 -->
}
},
components: {
Nav: Nav,
}
</script>
### Nav.vue ###
<template>
<div v-for="section in menu" :key="section"> <!-- 3. props로 받은 데이터 사용 -->
{{section}}
</div>
</template>
<script>
export default{
name: "nav",
data(){
return{
}
},
props: {
menu: Array, <!-- 2. props로 받은 데이터 등록 -->
}
}
</script>
컴포넌트를 잘 사용한다면 원하는 기능을 알아보기 쉽고, 수정 삭제가 용이하게 제작할 수 있다.
'Web > Vue.js' 카테고리의 다른 글
[Vue.js] Vue 문법 -2 (v-for, v-if) (0) | 2022.01.14 |
---|---|
[Vue.js] Vue 문법 -1 (구성, 데이터바인딩) (0) | 2022.01.07 |
[Vue.js] Vue의 시작 (0) | 2022.01.06 |