Vue Instance는 생성과 관련된 data 및 method 정의 가능
method 안에서 data를 "this.데이터이름" 으로 접근가능
<body>
<div id="app">
<div>data : {{message}}</div>
<div>method kor : {{helloKor()}}</div>
<div>method eng : {{helloEng()}}</div>
</div>
<script>
new Vue({
el: '#app',
data: {
message: 'Hello 안녕하세요',
name: '홍길동',
},
methods: {
helloEng() {
return 'Hello ' + this.name;
},
helloKor() {
return '안녕 ' + this.name;
},
},
});
</script>
</body>
data : Hello 안녕하세요
method kor : 안녕 홍길동
method eng : Hello 홍길동
뷰의 필터는 화면에 표시되는 텍스트의 형식을 쉽게 변환해주는 기능
filter를 이용하여 표현식에 새로운 결과 형식을 적용
중괄호 보간법 [{{}}] 또는 v-bind 속성에서 사용이 가능
특정 데이터의 변경사항을 실시간으로 처리
캐싱을 이용하여 데이터의 변경이 없을 경우 캐싱된 데이터를 반환. >> 값
Setter와 Getter를 직접 지정할 수 있음
작성은 method 형태로 작성하면서 Vue에서 proxy 처리하여 property처럼 사용
<body>
<div id="app">
<input type="text" v-model="message" />
<p>원본 메시지: "{{ message }}"</p>
<p>역순으로 표시한 메시지1: "{{ reversedMsg }}"</p>
<p>역순으로 표시한 메시지2: "{{ reversedMsg }}"</p>
<p>역순으로 표시한 메시지3: "{{ reversedMsg }}"</p>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
message: '안녕하세요 여러분',
},
computed: {
reversedMsg: function () {
console.log('꺼꾸로 찍기');
return this.message.split('').reverse().join('');
},
},
});
</script>
</body>
안녕하세요 여러분
원본 메시지: "안녕하세요 여러분"
역순으로 표시한 메시지1: "분러여 요세하녕안"
역순으로 표시한 메시지2: "분러여 요세하녕안"
역순으로 표시한 메시지3: "분러여 요세하녕안"
----------------------------------------
거꾸로 찍기
test21.html:61 Live reload enabled.
<body>
<div id="app">
<input type="text" v-model="message" />
<p>원본 메시지: "{{ message }}"</p>
<p>역순으로 표시한 메시지1: "{{ reversedMsg() }}"</p>
<p>역순으로 표시한 메시지2: "{{ reversedMsg() }}"</p>
<p>역순으로 표시한 메시지3: "{{ reversedMsg() }}"</p>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
message: '안녕하세요 여러분',
},
methods: {
reversedMsg: function () {
console.log('꺼꾸로 찍기');
return this.message.split('').reverse().join('');
},
},
});
</script>
</body>
안녕하세요 여러분
원본 메시지: "안녕하세요 여러분"
역순으로 표시한 메시지1: "분러여 요세하녕안"
역순으로 표시한 메시지2: "분러여 요세하녕안"
역순으로 표시한 메시지3: "분러여 요세하녕안"
test21_1.html:27 거꾸로 찍기 3번 실행
test21_1.html:61 Live reload enabled.
원본 메시지: "Hello Everyone"
역순으로 표시한 메시지: "enoyrevE olleH"
Hello Everyone
Computed는 종속된 data가 변경되었을 경우 그 data를 다시 계산하여 캐싱한다
Watch의 경우는 data가 변경되었을 경우 다른 data를 변경하는 작업을 한다
DOM Event를 청취하기 위해 v-on directive 사용
inline event handling
method를 이용한 event handling
메소드 이름을 직접 바인딩 하는 대신 인라인 JavaScript 구문에 메소드를 사용할 수도 있다
원본 DOM 이벤트에 엑세스 해야 하는 경우 특별한 $event 변수를 사용해 메소드에 전달할 수도 있다
method 내에서 작업도 가능하지만 method는 DOM의 이벤트를 처리하는 것 보다 data 처리를 위한 로직만 작업하는 것이 좋다
이 문제를 해결하기 위해 Vue는 v-on 이벤트에 이벤트 수식어를 제공한다
수식어는 점으로 표시된 접미사이다
뷰에서는 $refs 속성을 이용해 DOM에 접근할 수 있다
단, 뷰의 가장 중요한 목적 중 하나는 개발자가 DOM을 다루지 않게 하는 것이므로, 되도록 ref를 사용하는 것을 피하는 것이 좋다
element의 class와 style을 변경
v-bind:class는 조건에 따라 class를 적용할 수 있다
select box일 경우 선택된 항목의 value 속성의 값을 관리
v-model 표현식의 초기 값이 어떤 옵션에도 없으면 <select>
element는 선택없음 상태로 렌더링 된다
Vue의 가장 강력한 기능 중 하나
HTML Element를 확장하여 재사용 가능한 코드를 캡슐화
Vue Component는 Vue Instance이기도 하기 때문에 모든 옵션 객체를 사용 가능
Life Cycle Hook 사용 가능
전역 컴포넌트와 지역 컴포넌트
전역 컴포넌트를 등록하려면 Vue.component(tagName, options)를 사용
권장하는 컴포넌트 이름: 케밥 표기법(전부 소문자 -)
상위(부모)-하위(자식) 컴포넌트 간의 data 전달 방법
부모에서 자식: props라는 특별한 속성을 전달 (Pass Props)
자식에서 부모: event로만 전달 가능 (Emit Event)
하위 컴포넌트는 상위 컴포넌트의 값을 직접 참조 불가능
data와 마찬가지로 props 속성의 값을 template에서 사용이 가능
v-bind를 사용하여 부모의 데이터에 props를 동적으로 바인딩 할 수 있다
데이터가 상위에서 업데이트 될 때 마다 하위 데이터로도 전달 된다
<div id="app">
<child-comp area="부산" v-bind:msg="msg[parseInt(Math.random() * 5)]"></child-comp>
<child-comp area="광주" v-bind:msg="msg[parseInt(Math.random() * 5)]"></child-comp>
<child-comp area="구미" v-bind:msg="msg[parseInt(Math.random() * 5)]"></child-comp>
<child-comp area="대전" v-bind:msg="msg[parseInt(Math.random() * 5)]"></child-comp>
<child-comp area="서울" v-bind:msg="msg[parseInt(Math.random() * 5)]"></child-comp>
</div>
<template id="childcomp">
<div>
<h2> {{area}} {{msg}}</h2>
</div>
</template>
<script>
Vue.component("child-comp", {
props: ["area", "msg"],
template: "#childcomp",
});
new Vue({
el: "#app",
data: {
msg: ["굿^^", "최고!!", "실화냐?", "좋아요*", "짱!!"],
},
});
</script>
<div id="app">
<child-comp v-for="(area, i) in areas" :key="i" :area="area"
v-bind:msg="msg[parseInt(Math.random() * 5)]">
</child-comp>
</div>
<template id="childcomp">
<div>
<h2> {{area}}지역 {{msg}}</h2>
</div>
</template>
<script>
Vue.component("child-comp", {
props: {
area: String,
msg: {
type: String,
require: true,
},
},
template: "#childcomp",
});
new Vue({
el: "#app",
data: {
areas: ["부산", "광주", "구미", "대전", "서울"],
msg: ["굿^^", "최고!!", "실화냐?", "좋아요*", "짱!!"],
},
});
</script>
하위 컴포넌트에서 상위 컴포넌트가 지정한 이벤트를 발생($emit)
상위 컴포넌트는 하위 컴포넌트가 발생한 이벤트를 수신(on)하여 data처리
비어 있는 Vue Instance 객체를 Event Bus로 사용
복잡해질 경우 상태관리 라이브러리인 Vuex 사용 권장