2. 인스턴스 & 컴포넌트
- 인스턴스 : 뷰로 화면을 개발하기 위한 기본 단위 ( new Vue() )
- 컴포넌트 : 독립적으로 존재할 수 있는 모듈
컴포넌트는 객체와 다르다. 독립적으로 존재할 수 있어야 하기에, 컴포넌트는 여러개의 객체로 이루어질 수 있다.
인스턴스
말 그대로 객체를 생성할 때 만드는 인스턴스를 뜻한다.
<script>
new Vue({
el: '#app',
data: {
message: 'Hello Vue.js!',
},
});
</script>
인스턴스 옵션
el : 적용된 DOM 요소를 지정해줌
data : vue 인스턴스에 해당 data를 추가해줌
Lifecycle hooks : 인스턴스 초기화 과정(Lifecycle) 중간에 사용자 정의 로직을 넣고 싶을때 사용함 (mounted, updated 등...)
(자세한건 [Vue LifeCycle.md](./Vue LifeCycle) 참고)methods : 메서드를 선언하며, 여기에 선언된 메서드들 중에서 update Lifecycle이 동작할 때(=아무 변수나 바뀔 때) 이 공간에 선언되어 있는 모든 메서드가 일괄적으로 실행된다.
computed : 값을 리턴하는 메서드, 단순히 값을 계산할 때 사용하는게 좋다.
methods는 값을 변경할 때 updated 라이프사이클이 실행된다. (예제)
watch : 특정 값이 변하면 지정해준 작업을 한다.
파라미터로 값을 받거나 데이터를 변경해줘야 한다면 methods를 사용해야겠지만, 그게 아니라면 computed를 사용하자.
컴포넌트
화면을 구성할 수 있는 블록(영역)을 의미한다.
컴포넌트간의 관계는 Tree구조와 유사하다.
컴포넌트 등록
- 전역 컴포넌트
Vue 인스턴스 바깥에서 Vue 생성자를 통해 .component()를 호출한다.
<html>
<head>
<!-- 중략... -->
</head>
<body>
<!-- 중략... -->
<div id="app">
<my-component></my-component>
</div>
<script src="vue CDN 호출..."></script>
<script>
Vue.Component('my-component', {
template: '<div>전역 컴포넌트가 등록되었습니다!</div>',
});
new Vue({
el: '#app',
});
</script>
</body>
</html>
- 지역 컴포넌트
전역 컴포넌트와 다르게 Vue 인스턴스 내부에 선언한다.
<!-- ... -->
<script>
new Vue({
el: '#app',
components: {
'my-component': '<div>지역 컴포넌트가 등록되었습니다</div>',
},
});
</script>
컴포넌트간 데이터 전달
부모 -> 자식
- props 속성
- 부모에서 전달할 때
<child-component v-bind:전달할key값="전달할 데이터"></child-component>
- 자식에서 받을 때
<script> export default { // ... props: { '사용할key값': '전달받은key값', // 상속받은 key를 그대로 사용한다면 아래처럼 표현 '전달받은key값', } // ... } </script>
자식 -> 부모
자식의 요소를 클릭하거나 할 때 부모의 이벤트를 실행시키고 싶거나 데이터를 전달할 때 사용한다.
- 자식 컴포넌트
// 이벤트 발생 this.$emit('상위 컴포넌트에 전달할 이벤트명');
- 부모 컴포넌트
<child-component v-on:이벤트명="실행할 부모의 메서드명"></child-component>
형제 컴포넌트 간 통신 (Event Bus 이용)
- 이벤트를 보내는 컴포넌트 : $emit() 메서드로 보낸다.
<script> var eventBus = new Vue(); // ... methods: { 메서드명: function() { eventBus.$emit('이벤트명', 데이터); } } </script>
- 이벤트를 받는 컴포넌트 : $on() 메서드로 받는다.
<script> // ... methods: { created: function() { eventBus.$on('이벤트명', (데이터) => {/*기능구현*/}) } } </script>