본문 바로가기

FE/vue

2. 인스턴스 & 컴포넌트

1. 뷰 인스턴스

- 뷰 인스턴스는 뷰로 화면을 개발하기 위해 필수적으로 생성되어야 하는 기본 단위이다.

 

뷰 인스턴스 생성

New Vue ({
	...
});

뷰 인스턴스 형식은 위와 같다.

[Hello Vue.js 출력하는 샘플 코드]

<!DOCTYPE html>
<html>
	<head>
		<title>Vue Sample</title>
	</head>
	<body>
		<div id="app">
			{{ message }}
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js" charset="utf-8"></script>
		<script type="text/javascript">
			new Vue({ // 인스턴스
					el: '#app', // el 속성
					data: { // data 속성
						message: 'Hello Vue.js!'
					}
				});
			Vue.config.devtools = true;
		</script>
	</body>
</html>


뷰 인스턴스 옵션 속성

인스턴스를 생성할 때 재정의할 data, el, template 등의 속성을 의미한다.

예를 들어 위 예제에서는 data라는 미리 정의되어있는 속성을 사용했고 그 안에 message라는 새로운 속성을 추가해 Hellovue.js! 라는 값을 주었다.

el 속성 역시 미리 정의되어 있으며 뷰로 만든 화면이 그려지는 시작점을 의미한다.

예제에서의 '#app'은 돔 요소 중 app 이라는 아이디를 가진 요소를 의미하고 #선택자는 css선택자 규칙과 같다.

  • 이외 미리 정의된 속성

    • Template : 화면에 표시할 HTML, CSS 등 마크업 요소를 정의하는 속성. 뷰의 데이터 및 기타 속성들도 함께 화면에 그릴 수 있음

    • Method : 화면 로직 제어와 관계된 메서드를 정의하는 속성. 마우스 클릭 이벤트 처리와 같이 화면의 전반적인 이벤트와 화면 동작과 관련된 로직을 추가할 수 있음

    • created : 뷰 인스턴스가 생성되자마자 실행할 로직을 정의할 수 있는 속성

뷰 인스턴스 옵션 속성

뷰 인스턴스를 생성하면 HTML의 특정 범위 안에서만 옵션 속성들의 적용되어 나타난다.

  • new Vue()로 인스턴스를 생성하고 나서 화면에 인스턴스 옵션 속성을 적용하는 과정

    1. 뷰 라이브러리 파일 로딩

    2. 인스턴스 객체 생성 (옵션 속성 포함) - el이 '#app', data에 {message:'Hello Vue.js!'} 옵션이 적용된 인스턴스가 생성됨

    3. 특정 화면 요소에 인스턴스를 붙임 - el 속성에 지정한 화면 요소 (<div id="app">{{message}}</div>)에 인스턴스가 부착됨

    4. 인스턴스 내용이 화면 요소로 변환 - 인스턴스에 정의한 옵션 객체의 내용 (data 속성)이 el 속성에 지정한 화면 요소와 그 이하 레벨의 화면 요소에 적용되어 값이 치환됨 ({{message}}와 data.message 가 치환됨) (<div id="app">Hello Vue.js!</div>)

    5. 변환된 화면 요소를 사용자가 최종 확인

=> 만약 예제 코드에서 {{message}}가 div id="app" 요소 바깥에 위치했다면 {{message}}는 치환되지 않고 화면에 그대로 출력되었을 것이다.

 

뷰 인스턴스 라이프 사이클

  • 라이프 사이클 속성 : 인스턴스 상태에 따라 호출할 수 있는 속성들 (ex. created: 인스턴스가 생성되었을 때 호출할 동작을 정의하는 속성)

  • 라이프 사이클 훅 : 라이프 사이클 속성에서 실행되는 커스텀 로직

  • - beforeCreate : 인스턴스 생성 후 가장 처음으로 실행되는 단계. data,methods 속성이 아직 인스턴스에 정의되어 있지 않고 돔과 같은 화면 요소에도 접근 불가

    - created : beforeCreate 다음 실행되는 단계. data, methods 속성이 정의되어 접근 가능함. 인스턴스가 화면에 부착되기 전이므로 template에 정의된 돔 요소로 접근 불가

    - beforeMount : create 이후 template 속성에 지정한 요소에 인스턴스를 부착하기 전에 호출되는 단계. render() 호출 이전 로직을 추가하기 좋음 (*render : dom을 그리는 함수)

    - mounted : 인스턴스 부착 후 호출되는 단계, template 속성에 정의한 화면 요소에 접근할 수 있어 화면 요소를 제어하는 로직을 수행하기 좋음. 

    - beforeUpdate : 관찰하고 있는 데이터가 변경되면 가상 돔으로 화면을 다시 그리기 전에 호출되는 단계, 변경 예정인 새 데이터에 접근할 수 있어 변경 예정 데이터의 값과 관련된 로직을 미리 넣을 수 있다. (뷰의 반응성을 제공하기 위해 $watch 속성으로 감시하고 있음)

    - Updated : 데이터가 변경되고 나서 가상 돔으로 다시 화면을 그리고 나면 실행되는 단계 (*이 단계에서 데이터 값을 변경하면 무한 루프에 빠질 수 있어 값 변경 시 computed, watch 속성을 사용해야 함. 값 변경은 되도록 beforeUpdate에 추가, 여기서는 돔과 관련된 로직을 추가하는 것이 좋음)

    - beforeDestroy : 뷰 인스턴스가 파괴되기 직전에 호출됨. 아직 인스턴스에 접근 가능

    - destroyed : 뷰 인스턴스 파괴 후 호출됨. 

 

2. 뷰 컴포넌트

컴포넌트란? 조합하여 화면을 구성할 수 있는 블록이다.

컴포넌트를 활용하면 화면을 빠르게 구조화하여 일괄적인 패턴으로 개발할 수 있다.

코드를 재사용하기 편리하고, 코드를 직관적으로 이해할 수 있다.

컴포넌트간의 관계는 뷰에서 화면을 구성하는 데 매우 중요하며 웹 페이지 화면을 설계할 때도 이와 같은 골격을 유지하며 설계해야 한다.

컴포넌트 등록하기

  • 지역(Local) 컴포넌트 : 특정 인스턴스에서만 유효한 범위를 갖는다.

  • 전역(Global) 컴포넌트 : 여러 인스턴스에서 공통으로 사용할 있다. (= 뷰로 접근 가능한 모든 범위에서 사용할 있다.)

전역 컴포넌트 등록

Vue.component('컴포넌트 이름', {
	// 컴포넌트 내용
});

[전역 컴포넌트 등록 형식]

  • 이름 : template 속성에서 사용할 HTML 이름

  • 내용 : 컴포넌트 태그가 실제 화면의 HTML 요소로 변환될 표시될 속성들을 작성. template, data, methods 인스턴스 옵션 속성을 정의할 있다.

<!DOCTYPE html> 
<html> 
	<head> 
		<title>Vue Sample</title> 
	</head>
	<body> 
		<div id="app"> 
			<button> 컴포넌트 등록 </button>
        	<my-component></my-component><!-- 전역 컴포넌트 표시 -->
    	</div>
    	<script src="https://cdn.jsdelivr.net/npm/vu<2.5.2/dist/vue.js" charset="utf-8
"></script>
		<script type="text/javascript"> 
			Vue.component('my-component' , { 
				template: '<div> 전역 컴포넌트가 등록되었습니다. </div>' // 전역 컴포넌트 등록
    	    });
        	new Vue({
        		el:'#app'
           	});
		</script> 
	</body>
</html> 

 

전역 컴포넌트가 화면에 나타나기까지의 처리 과정

  1. 뷰 라이브러리 파일 로딩

  2. 뷰 생성자로 컴포넌트 등록 Vue.component()

  3. 인스턴스 객체 생성 (옵션 속성 포함)

  4. 특정 화면 요소에 인스턴스 부착

  5. 인스턴스 내용 변환 (등록된 컴포넌트 내용도 변환) [<my-component>가 <div>로 변환됨]

  6. 변환된 화면 요소를 사용자가 최종 확인

지역 컴포넌트 등록

new Vue({
	components: {
    	'컴포넌트 이름': 컴포넌트 내용
    }
});
  • 전역 컴포넌트 등록과 다르게 인스턴스에 components속성을 추가하고 등록할 컴포넌트 이름과 내용을 정의한다.

  • 컴포넌트 이름은 전역 컴포넌트와 마찬가지로 HTML 등록될 사용자 정의 태그, 내용은 컴포넌트 태그가 화면 요소로 변환될 내용을 의미한다.

 

전역 컴포넌트와 지역 컴포넌트는 유효 범위가 다르다.

>> 전역 컴포넌트는 인스턴스를 생성할 때마다 등록할 필요 없이 어느 인스턴스에서든지 사용할 있지만, 지역 컴포넌트는 새로 인스턴스를 생성할 때마다 등록해줘야 한다.

 

'FE > vue' 카테고리의 다른 글

vue project 를 Tomcat에 배포하기  (1) 2020.11.19
4. 라우터 & HTTP 통신  (0) 2019.07.10
3. 뷰 컴포넌트 통신  (0) 2019.07.04
1. vue 개발 환경 구축  (0) 2019.06.27