/// DOM 쪽에 가까움 Vue.component('todo-item', { // 이제 todo-item 컴포넌트는 "prop" 이라고 하는 // 사용자 정의 속성 같은 것을 입력받을 수 있습니다. // 이 prop은 todo라는 이름으로 정의했습니다. props: ['todo'], template: '<li>{{ todo.text }}</li>' })
DOM에서 컴포넌트를 생성해주고, todo prop에 Vue app의 변수들을 바인딩해서 넣어준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
<divid="app-7"> <ol> <!-- 이제 각 todo-item 에 todo 객체를 제공합니다. 화면에 나오므로, 각 항목의 컨텐츠는 동적으로 바뀔 수 있습니다. 또한 각 구성 요소에 "키"를 제공해야합니다 (나중에 설명 됨). --> <todo-item v-for="item in groceryList" v-bind:todo="item" v-bind:key="item.id"> </todo-item> </ol> </div>
Vue 인스턴스 생성
(약간 복잡함~! 마음의 준비를 하자) Vue 인스턴스를 인스턴스화 할 때는 데이터, 템플릿, 마운트할 엘리먼트, 메소드, 라이프사이클 콜백 등의 옵션을 포함 할 수있는 options 객체를 전달 해야함
각 Vue 인스턴스는 data 객체에 있는 모든 속성을 프록시 처리 함 (프록시 처리??)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// 데이터 객체 var data = { a: 1 }
// Vue인스턴스에 데이터 객체를 추가합니다. var vm = newVue({ data: data })
각 Vue 인스턴스는 데이터 관찰을 설정하고, 템플릿을 컴파일하고, 인스턴스를 DOM에 마운트하고, 데이터가 변경 될 때 DOM을 업데이트해야 할 때 일련의 초기화 단계!!! 를 거침. 그 과정에서 사용자 정의 로직을 실행할 수있는 라이프사이클 훅 도 호출됨. 예를 들어, created 훅은 인스턴스가 생성된 후에 호출됨. 예:
1 2 3 4 5 6 7 8 9 10
newVue({ data: { a: 1 }, created: function () { // `this` 는 vm 인스턴스를 가리킵니다. console.log('a is: ' + this.a) } }) // => "a is: 1"
인스턴스 라이프사이클의 여러 단계에서 호출될 다른 훅도 있음. 그 예로 mounted, updated 및 destroyed가 있음. 모든 라이프사이클 훅은 this 컨텍스트가 호출하는 Vue 인스턴스를 가리키며 호출됨. Vue 세계에서 “컨트롤러”의 컨셉이 어디에 있는지 궁금할 수 있음. 답은 컨트롤러가 없다! 컴포넌트의 사용자 지정 로직은 이러한 라이프사이클 훅으로 분할됨.
Life cycle Diagram of Vue {: height=”50%” width=”50%”}
템플릿 문법
여러가지 문법들이 있지만, 지금 당장에 필요한 것 위주로 일단 기록해둔다.
약어
v- 접두사는 템플릿의 Vue 특정 속성을 식별하기 위한 시각적인 신호 역할을 함. 이 기능은 Vue.js를 사용하여 기존의 마크업에 동적인 동작을 적용할 때 유용하지만 일부 자주 사용되는 디렉티브에 대해 너무 장황하다고 느껴질 수 있음. 동시에 Vue.js가 모든 템플릿을 관리하는 SPA를 만들 때 v- 접두어의 필요성이 떨어짐. 따라서 가장 자주 사용되는 두개의 디렉티브인 v-bind와 v-on에 대해 특별한 약어를 제공.
v-bind 약어
1 2 3 4 5
<!-- 전체 문법 --> <av-bind:href="url"> ... </a>
<!-- 약어 --> <a:href="url"> ... </a>
v-on 약어
1 2 3 4 5
<!-- 전체 문법 --> <av-on:click="doSomething"> ... </a>
<!-- 약어 --> <a @click="doSomething"> ... </a>
이들은 일반적인 HTML과 조금 다르게 보일 수 있음. 하지만 :와 @는 속성 이름에 유효한 문자이며 Vue.js를 지원하는 모든 브라우저는 올바르게 구문 분석을 할 수 있음. 또한 최종 렌더링 된 마크업에는 나타나지 않음. 약어는 완전히 선택사항이지만 나중에 익숙해지면 편할 것
계산된 속성(Computed prop)
템플릿 내에서 사용하는 표현식은 매우 편리하지만 단순한 연산에만 사용해야 함. 너무 많은 로직을 템플릿에 넣으면 유지보수가 어려움!
일반 속성처럼 템플릿의 계산된 속성에 데이터 바인딩 할 수 있음. Vue는 vm.reversedMessage가 vm.message에 의존하는 것을 알고 있기 때문에 vm.message가 바뀔 때 vm.reversedMessage에 의존하는 바인딩을 모두 업데이트할 것. 그리고 가장 중요한 것은 우리가 선언적으로 의존 관계를 만들었다는 것. 계산된 getter 함수는 사이드 이펙트가 없어 테스트와 추론하기에 쉬워짐.