Do it Vue.js 입문 정리2
Vue 인스턴스
:Vue로 화면을 개발하기 위해 필수적으로 생성해야 하는 기본 단위
ex)Vue 인스턴스 예시
new Vue({
});
Vue 인스턴스 옵션 속성
-data
-el
-template(화면에서 표시할 HTML, CSS 등의 마크업 요소를 정의하는 속성. Vue의 데이터 및 기타 속성들도 함께 화면에 그릴 수 있음)
-methods(화면 로직 제어와 관계된 메소드를 정의하는 속성. 마우스 클릭 이벤트 처리와 같이 화면의 전반적인 이벤트와 화면동작과 관련된 로직을 추가할 수 있음)
-created(vue instance가 생성되자마자 실행할 로직을 정의할 수 있는 속성)
Vue 인스턴스의 유효범위
Vue 인스턴스를 생성하면 HTML의 특정 범위 안에서만 옵션 속성이 적용되어 나타남
인스턴스의 유효범위는 el 속성과 밀접한 관계가 있음
Vue 인스턴스 라이프 사이클
-생성
-화면에 부착
-내용 갱신
-소멸
<<<<<<<<<사진>>>>>>>>>>>>>
Vue 컴포넌트
:조합하여 화면을 구성할수 있는 블록(화면의 특정 영역)을 의미
컴포넌트를 활용하면 화면을 빠르게 구조화하여 일괄적인 패턴으로 개발 가능
Vue에서는 웹 화면을 구성할 때 흔히 사용하는 내비게이션 바, 테이블, 리스트, 인풋 박스 등과 같은 화면 구성 요스들을 잘게 쪼개어 컴포넌트로 관리합니다
ex) 웹 화면 예시
Header
Content -> Aside, List
Footer
컴포넌트 등록 방식
-전역
-지역
전역 컴포넌트 등록
Vue.component('컴포넌트이름',{
//컴포넌트 내용
//template
//data
//methods
});
컴포넌트이름은 케밥기법(변수가 단어의 조합으로 이루어져있을때, 단어와 단어 사이를 -로 잇는 변수 명명방식)으로 하게되며
컴포넌트 이름은 template속성에서 사용한 HTML 사용자 정의 태그 이름을 의미함
ex)
Vue.component('my-component', {
template: '<div>전역 컴포넌트가 등록되었습니다!</div>'
});
지역 컴포넌트 등록
new Vue({
components: {
'컴포넌트이름': 컴포넌트 내용
}
});
컴포넌트 이름은 전역 컴포넌트와 마찬가지로 HTML에 등록하 사용자 정의 태그를 의미하고,
컴포넌트 내용은 컴포넌트 태그가 실제 화면 요소로 변환될 때의 내용을 의미합니다
ex)
new Vue({
el: '#app',
components: {
'my-local-component': cmp
}
});
Vue 컴포넌트 통신
컴포넌트는 각각 고유한 유효 범위를 가지고 있기 때문에 직접 다른 컴포넌트의 값을 참조할 수 없음
따라서 Vue 프레임워크 자체에서 정의한 컴포넌트 데이터전달 방법을 따라야 함
상위 하위는 트리구조임
상위 컴포넌트->하위 컴포넌트 : props로 전달
하위 컴포넌트->상위 컴포넌트 : 이벤트 발생
이벤트 발생후 이벤트 수신을 하는 개념을 이용한다
//이벤트 발생
this.$emit('이벤트명');
//이벤트 수신
<child-component v-on:이벤트명="상위 컴포넌트의 메소드 명"></child-component>
ex)상위컴포넌트가 하위컴포넌트로 보낼때
<div id="app">
<!-- 팁 : 오른쪽에서 왼쪽으로 속성을 읽으면 더 수월합니다. -->
<child-component v-bind:propsdata="message"></child-component>
</div>
상위 컴포넌트는 div태그
하위 컴포넌트는 child-component임
Vue.component('child-component', {
props: ['propsdata'],
template: '<p>{{ propsdata }}</p>',
});
new Vue({
el: '#app',
data: {
message: 'Hello Vue! passed from Parent Component'
}
});
ex)하위컴포넌트가 상위 컴포넌트로 이벤트 발생후 수신되는 될때
<div id="app">
<child-component v-on:show-log="printText"></child-component>
</div>
Vue.component('child-component', {
template: '<button v-on:click="showLog">show</button>',
methods: {
showLog: function() {
this.$emit('show-log');
}
}
});
new Vue({
el: '#app',
data: {
message: 'Hello Vue! passed from Parent Component'
},
methods: {
printText: function() {
console.log("received an event");
}
}
});
관계없는 컴포넌트 간 통신 - 이벤트 버스
컴포넌트 통신은 항상 상위-하위 구조를 유지해야만 데이터를 주고 받을 수 있었지만 이벤트 버스는 상위 하위 구조를 가지지 않고도 데이터를 한 컴포넌트에서 다른 컴포넌트로 전달할 수 있음
이벤트 버스 형식
//이벤트 버스를 위한 추가 인스턴스 1개 생성
var eventBus = new Vue();
//이벤트를 보내는 컴포넌트
methods:{
메소드명 : function(){
eventBus.$emit('이벤트명',데이터);
}
}
//이벤트를 받는 컴포넌트
methods:{
created: function(){
eventBus.$on('이벤트명', function(데이터){
내용들
});
}
}
ex)
<div id="app">
<child-component></child-component>
</div>
var eventBus = new Vue();
Vue.component('child-component', {
template: '<div>하위 컴포넌트 영역입니다.<button v-on:click="showLog">show</button></div>',
methods: {
showLog: function() {
eventBus.$emit('triggerEventBus', 100);
}
}
});
var app = new Vue({
el: '#app',
created: function() {
eventBus.$on('triggerEventBus', function(value){
console.log("이벤트를 전달 받음. 전달 받은 값 : ", value);
});
}
});
이벤트 버스를 활용하면 props속성을 이용하지 않고도 원하는 컴포넌트 간에 직접적으로 데이터를 전달할 수 있어 편리하지만 컴포넌트가 많아지면 어디로 보냈는지 관리가 되지 않는 문제가 발생합니다
이 문제를 해결하려면 뷰엑스란느 상태관리도구가 필요합니다.
vuex : 컴포넌트간의 데이터 관리를 효율적으로 하는 라이브러리
'프론트엔드 > 자바스크립트' 카테고리의 다른 글
Do it Vue.js 입문 정리4 (1) | 2018.04.12 |
---|---|
Do it Vue.js 입문 정리3 (0) | 2018.04.04 |
Do it Vue.js 입문 정리 (0) | 2018.03.31 |
클린코드 자바 스크립트 (0) | 2018.03.01 |
앱)왜 프론트엔드 개발자를 뽑으며 프론트 개발할때 MVC모델이 필요할까? (0) | 2017.11.13 |