간단한 Vue 튜토리얼을 마무리 지으면서 앞서 배웠었던 내용을 빠르게 다시한번 정리할 시간이 필요하다는것을 느꼈다. 이번에는 코드레벨이 아닌 좀 더 이론적인 부분을 살펴보도록 하자.
1. vue.js를 시작하기 앞서서
- 모델-뷰-뷰모델 패턴: 정제된 MVC모습인 MVVM 패턴의 가장 큰 차이점은 뷰 모델 도입과 데이터바인딩(바인더)에 있다.
- 뷰-모델에서 데이터가 변하면 데이터에 연결된 뷰는 자동으로 업데이터된다. 데이터바인더를 데이터에 노출시키고 데이터가 변할때마다 뷰에 반영될 수 있도록 보증한다
2. Vue 인스턴스
모든 Vue 애플리케이션에는 루트 Vue 인스턴스가 있다. 루트 Vue인스턴스는 뷰 생성자인 new Vue()로 생성할 수 있다.
* 생성자는 HTML서식을 컴파일하고, 인스턴스 데이터를 초기화하고, 데이터를 생성하고, 애플리케이션을 상호 작용형으로 만들어주는 이벤트들을 바인딩하면서 애플리케이션을 가동시킨다.
* el옵션: Vue가 애플리케이션을 적용할 DOM요소(element를 의미하는듯)를 지정한다. Vue는 HTML에서 해당 DOM요소를찾아 해당 element(DOM요소) 를 적용 지점으로 사용하한다.
* Vue debugging : vue-devtools를 설치하자. console에서 webstore를 입력하여 Vue객체의 속성값들을 확인할 수 있다.
Vue 생명주기
1. 인스턴스 생성: 데이터 관찰자를 생성하고 내부 이벤트 시스템에서 사용될 이벤트를 생성하여 초기화한다.
2. 템플릿과 가상 DOM생성: Vue가 템플릿 혹은 렌더링 함수를 찾아 템플릿을 컴파일한다. 가상 DOM 복사본을 만들고, 그 결과를 HTML DOM에 마운트한다.
3. 이벤트 루프: 관찰자는 뷰-모델의 데이터를 감시한다. 변화가 있으면 가상 DOM이 다시 렌더링되어 HTML DOM에 적용된다.
4. 인스턴스 소멸: 앱이 소멸되기 시작하면 완전히 소멸되기 전에 모든 관찰자, 이벤트 리스너, 자식 컴포넌트들이 삭제된다.
Vue 생명주기 hook 살펴보기
애플리케이션 인스턴스가 생명 주기의 각 과정을 거치는 것을 보려면 Vue 생명 주기 훅에 콜백 함수를 작성한다.
생명 주기 훅은 애프리케이션이 실행되면서 일어나는 일들을 살펴보기에 좋은 방법을 제공한다. 디버깅할때 사용하자.
지시문
text 노드에 데이터 맵핑. v-text 혹은 {{ }}
var app = new Vue({ el: '#vue-app', data: { contents: 'hello world!' } }) <div id="vue-app"> <h1 v-text="contents"> </h1> <h1>{{ contents }} </h1> </div>
결과:
hello world
hello world
출력 필터 적용
출력필터는 값을받아 형식화를 수행하고 형식화된 값을 출력하는 함수이다
모든 출력 필터는 Vue 인스턴스 > filters객체에 존재한다.<div id="vue-app"> <h1 v-for="member in members">{{ member | memberFilter }} </h1> </div> var app = new Vue({ el: '#vue-app', data: { members: [ 'sohee', 'sohyun', '소희', '소현'] }, filters: { memberFilter(name){ if(name && /^[a-z]*$/.test(name)){ return "Welcome! " + name; }else if(name && /^[가-힣]*$/.test(name)){ return "반가워요! " + name; }else{ return "hello stranger" + "name"; } } } })
결과:
Welcome! sohee
Welcome! sohyun
반가워요! 소희
반가워요! 소현
3.상호작용성
DOM 이벤트에 바인딩
이벤트 바인딩 기초 : 이벤트 바인딩은 v-on지시자를 사용해서 자바스크립트 코드나 함수를 DOM요소에 연결합니다.
해당 코드나 함수는 DOM 이벤트가 트리거 될 때 실행됩니다.
<p v-on:eventname="some javascript"</p>
v-on지시자를 간략하게 사용하는 방법은 v-on을 @로 대체하면 된다. 예를들어 v-on:click이라면, @click으로 쓰면 된다.
1. Vue 인스턴스 옵션에 method 객체를 추가하세요.
2. element 안에 v-on 지시자 (혹은 @): eventname="method or javascript code"를 입력하세요
vue.js를 MVVM 모델과 연관지어 생각해보자.
데이터베이스(모델)
firstName = Summer
lastName = river
뷰 인스턴스(뷰-모델)
data: {
firstName: 'summer',
lastName = river
}
computed: {
fullName(){
return[
this.firstName,
this.lastName
].join(' ')
}
}
HTML 마크업(뷰)
<p>{{ fullName }}</p>
계산된 속성
계산된 속성은 보통 인스턴스 데이터를 사용해서 계산되므로 기본 데이터가 변경되면 값이 자동으로 업데이트 된다. 업데이트 주기. 업데이트 주기를 기억하십시오
아래에 억지로 짜낸 예제를 한번 살펴봅시다.
<div id="vue-app">
<h3 v-text="favorite"></h3>
</div>
var app = new Vue({
el: '#vue-app',
data: {
fav: {
friend:'토끼',
hubby:'산책'
}
},
computed: {
favorite (){
return '나는' + this.fav.friend + "랑 " + this.fav.hubby + "하는게 제일 좋아"
}
}
})
이 예제에서 fav객체는 friend로 토끼를, hubby로 산책을 초기값으로 바뀐다. 이후에 아래와 같은 상황에서만 업데이트 된다.
1) 좋아하는 친구나 취미가 변경되었을때(fav 객체)
2) favorite 함수가 변경되었을때
3) 이 속성에 연결된 마크업이 업데이트 되었을때
인스턴스 데이터 변화에 따른 애플리케이션 업데이트 주기
인스턴스 데이터 -> 데이터 변경 -> 계산된 속성 재계산 -> 가상 DOM 업데이트 -> 웹 브라우저 DOM 패치
4.폼과 입력
v-model 지시자는 폼 혹은 텍스트 영역 입력과 템플릿에 양방향 데이터 바인딩을 생성한다. 이를통해 애플리케이션 모델의 데이터가 UI와 항상 동기화 할 수있다.
예를들어서. 인스턴스의 data를 DOM에 반영할수도 있지만, 사용자가 DOM의 데이터를 변경할 수도 있다 이때 v-model을 사용하여 사용자가 입력한 data를 인스턴스의
data에 반영할 수 있다.
v-once 지시자는 하나의 요소나 컴포넌트를 딱 한번 렌더링 한다. 추가적으로 렌더링 할 때는 이미 만든 요소나 컴포넌트를 정적인 콘텐츠로 인식하여 건너뛴다.
v-model 지시자는 텍스트 박스, 텍스트 영역, 체크 박스, 라디오 버튼, 셀렉트 드롭다운을 포함하는 여러 종류의 폼 입력을 위해 만들었다.
양방향 데이터 바인딩
뷰의 변화는 모델을 업데이트 한다.
모델의 변화는 뷰를 업데이트 한다.
v-model 바인딩 사용
v-model 지시자를 사용해서 폼 입력을 계속 주시해보자.
v-model은 주로 입력과 폼 바인딩에 사용된다. 반면 v-bind는 주로 HTML속성 바인딩에 사용된다.
v-model 지시자는 사실 <input v-bind:"sohething" v-on:input="something=$.event.target">의 약어임ㅇㅇ
v-model을 간단하게 써보자..
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="vue-app">
이름: <input v-model="memberInfo.name"/> <br>
나이: <input v-model="memberInfo.age"/> <br>
취미: <input v-model="memberInfo.hubby"/> <br>
주말엔 무엇을 하는게 좋아?
<input type="radio" id="rest" value="rest" v-model="memberInfo.weekend"/>
<label for="rest">집에서 쉰다.</label>
<input type="radio" id="friend" value="friend" v-model="memberInfo.weekend"/>
<label for="rest">친구를 만난다.</label> <br>
제출: <button type="submit" v-on:click="submit">보내기</button>
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.13/dist/vue.js"></script>
</html>
var app = new Vue({
el: '#vue-app',
data: {
memberInfo: {
name:'',
age:0,
hubby:'',
weekend:'',
}
},
computed: {
greet(){
return "안녕 " + this.memberInfo.name + "(" + this.memberInfo.age + ")" +
"너의 취미는 " + this.memberInfo.hubby + "구나. 만나서 반가워!" +
"주말엔 주로" + (this.memberInfo.weekend == 'home' ? "집에있는구나" : "친구를만나는구나");
}
},
methods: {
submit(){
alert(this.greet);
}
}
})
'Today I learned' 카테고리의 다른 글
vue.js 스터디 1주차 (0) | 2020.07.07 |
---|---|
[vue.js] vue.js 코딩공작소 책 요약(2) (0) | 2020.07.07 |
[vue.js] 본격 생존코딩! 밥벌이를 해보자! (4) 컴포넌트 (0) | 2020.07.02 |
[vue.js] 본격 생존코딩! 밥벌이를 해보자! (3) (0) | 2020.06.30 |
[vue.js] 본격 생존코딩! 밥벌이를 해보자! (2) (0) | 2020.06.30 |
댓글