뷰 인스턴스(instance)는 화면 개발에서 블록과 같은 어떤 '단위'라고 볼 수 있다.
뷰 인스턴스 형식은 아래와 같다.
new Vue({
...
});
지난 실습에서 루트(최상위) 컴포넌트 data 속성 얘기하면서 봤던 템플릿이다.
저게 인스턴스였고만,,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue Sample</title>
</head>
<body>
<div id="app"> <!-- view 인스턴스가 그려질 지점 -->
{{ message }} <!-- 데이터 속성에서 정의된 message 값이 연결됨 -->
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// 인스턴스 start
new Vue({
el: '#app', //el속성 : view 인스턴스가 그려질 지점 지정
data : { //데이터 속성 : message 값 정의 했음
message : 'Hello Vue.js!'
}
});
// 인스턴스 end
</script>
</body>
</html>
여기서 new Vue()로 인스턴스를 생성할 때, Vue는 생성자라고 한다. 이는 vue 라이브러리가 로딩되고 나면 접근 가능하다. (로딩 안되면 {{message}}로 출력됨)
생성자를 사용하는 이유는 생성자에 구현된 기능의 재사용성을 위함이다.
이외에도 아래와 같이, 여러가지 미리 정의되어 있는 속성들을 사용할 수 있다.
new Vue({
el: '#app', //el속성 : view 인스턴스가 그려질 지점 지정
data : { //데이터 속성 : message 값 정의 했음
message : 'Hello Vue.js!'
},
template: , // 화면에 표시할 HTML, CSS 등의 마크업 요소를 정의하는 속성
methods : , // 화면 로직제어 관련 속성
created : // 뷰 인스턴스 생성되자마자 실행할 로직을 정의할 수 있는 속성
});
만약 위 예시들과 같은 Vue 인스턴스 범위를 아래와 같이 벗어난다면 어떻게 될까?
<div id="app"> <!-- view 인스턴스가 그려질 지점 -->
</div>
{{ message }}
이렇게 실행한다면 인스턴스 유효 범위에 벗어났기 때문에, message 속성 값이 Hello Vue.js!로 바뀌지 않고 그대로 출력될 것이다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue Instance Lifecycle</title>
</head>
<body>
<div id="app">
{{ message }}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
new Vue({
el: '#app',
data : {
message: 'Hello Vue.js!'
},
beforeCreate : function() {
console.log("beforeCreate");
},
created : function() {
console.log("created");
},
mounted : function() {
console.log("mounted");
},
updated : function() {
console.log("updated");
}
});
</script>
</body>
</html>
위 코드를 Console로 확인하면 beforeCreate > created > mounted가 출력되어 있다. 만약 mounted 단계에서 데이터를 변경한다면?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue Instance Lifecycle</title>
</head>
<body>
<div id="app">
{{ message }}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
new Vue({
el: '#app',
data : {
message: 'Hello Vue.js!'
},
beforeCreate : function() {
console.log("beforeCreate");
},
created : function() {
console.log("created");
},
mounted : function() {
console.log("mounted");
this.message = 'Hello Vue!'; //message 값 변경
},
updated : function() {
console.log("updated");
}
});
</script>
</body>
</html>
아까는 보이지 않던 updated 로그가 출력된다.
컴포넌트(Component)란 조합하여 화면을 구성할 수 있는 블록을 의미한다.
Vue.component('컴포넌트 이름', {
//컴포넌트 내용
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue Component Registration</title>
</head>
<body>
<div id="app">
<button>컴포넌트 등록</button>
<my-component></my-component> <!--전역 컴포넌트 표시-->
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
Vue.component('my-component', {
template : '<div>전역 컴포넌트가 등록 되었습니다!</div>'
});
new Vue({
el : '#app'
});
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue Component Registration</title>
</head>
<body>
<div id="app">
<button>컴포넌트 등록</button>
<my-local-component></my-local-component> <!--지역 컴포넌트 표시-->
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var cmp = {
//컴포넌트 내용
template : '<div>지역 컴포넌트가 등록되었습니다!</div>'
};
new Vue({
el : '#app',
components: {
'my-local-component': cmp
}
});
</script>
</body>
</html>