Javascript 프레임워크 vue에 대해서 학습했다.
기존 Vanilla JS를 이용하여 여러 프로젝트를 만들면서 직접 구현해야 했던 내용들을 자체적으로 지원한다.
Vue.createApp({})
mount()
메소드를 이용해서 DOM에 마운트할 수 있으며, ViewModel을 반환한다. mount()
에는 자신이 마운트하고 싶은 html element의 선택자를 매개변수로 넣어 사용한다.// 옵션 객체
const App = {
data() {
return {
attr: "class",
};
},
};
// 어플리케이션 인스턴스
const app = Vue.createApp(App);
// ViewModel, id="app"인 html element에 마운트
const vm = app.mount("#app");
위의 Vue.createApp({})
의 입력인 옵션 객체는 이후 루트 컴포넌트 구성에 사용된다.
컴포넌트에서 사용할 데이터를 객체 리터럴로 선언한다. data안에 존재하는 값들은 반응형 데이터로 해당 값이 변경될 때 자동으로 DOM이 변경된다.
옵션 객체는 하나의 컴포넌트로 재사용이 가능하다. 만약 data를 일반 객체 리터럴로 작성한다면 객체는 참조형 데이터이기 때문에 다른 컴포넌트에서의 data값 변경이 영향을 미칠 수 있다. 따라서 객체를 return하는 함수로 작성해서 컴포넌트 생성시 서로 다른 주소를 가진 객체를 사용하도록 한다.
컴포넌트에서 사용할 함수를 객체 리터럴로 선언한다.
반응형 데이터가 변경되었을 때 수행할 동작들을 객체 리터럴로 선언한다.
// 아래 두 코드는 동일하게 동작함.
// key-value 쌍
name: {
handler() {
// data의 name이 변경시 실행되는 코드
}
}
// 함수로 대체
name() {
// data의 name이 변경시 실행되는 코드
}
// 아래와 같이 작성한다.
watch: {
name(newName, oldName) {
console.log('watch', newName, oldName);
},
fruits: {
handler() {
console.log(this.fruits);
},
deep: true,
immediate: true
}
},
반응형 데이터를 이용해 새로운 값을 만들어 사용해야 할 때, 이 값을 효율적으로 사용하기 위한 옵션이다. 새롭게 만들어진 값은 캐싱되어 재사용시에 여러 동작을 생략할 수 있으며, 반응형 데이터가 변경된 경우에도 캐싱된 값을 갱신한다.
getter와 setter로 구성되며, getter만 사용시 아래와 같이 하나의 함수로 선언이 가능하다.
computed: {
// 객체로 선언
computedValueName: {
get() {
// data값을 가공
return computedValue;
}
},
// 함수로 선언
computedValueName() {
//data값을 가공
return computedValue;
}
}
<!--문자열 보간-->
<h1>data: {{ data }}</h1>
<!--Javascript 표현식-->
<h2>{{ number * 2 }}</h2>
<!--Javascript 표현식: 삼항 연산자-->
<h3>{{ number % 2 === 1 ? 'yes' : 'no' }}</h3>
<h2 style="color: yellowgreen;"> Raw HTML</h2>
등과 같은 html 형식의 문자열은 v-html
디렉티브를 이용해서 html 요소로 출력시킬 수 있다. 하지만 XSS
공격에 취약하므로 v-html
을 사용하는 부분에서는 유저의 입력이 관여해서는 안된다. <div v-html="rawHTML"></div>
data() {
return {
rawHTML: '<h2 style="color: yellowgreen;"> Raw HTML</h2>'
}
}
v-show
display
스타일 속성을 조정한다.v-if
v-show
vsv-if
v-show
의 경우 무조건 렌더링 이루어지고display: none
과 같이 스타일로 표시 여부를 지정한다. 따라서 초기 렌더링 비용이v-if
보다 큰 대신 변경시에는 추가적인 렌더링이 필요하지 않다.
반대로v-if
의 경우는 표시하지 않는 요소는 렌더링하지 않아 초기 렌더링 비용이 적다. 하지만 변경시마다 렌더링이 필요하여 변경시 비용이 크다.
즉, 변경이 잦은 경우v-show
를, 변경이 없는 경우v-if
를 사용하는 것이 좋다.
v-bind
:
로 줄여서 사용이 가능하다. <!-- class attribute가 data의 className으로 적용된다. -->
<div v-bind:class="className"></div>
<!-- 약어로 ':'만 입력해도 동일하게 동작한다. -->
<div :class="className"></div>
<!-- attribute의 key값 또한 '[]'를 사용하여 동적으로 적용이 가능하다. -->
<div v-bind:[keyName]="keyValue"></div>
v-on
methods
에 있는 함수를 동작하게 한다. @
로 줄여서 사용이 가능하다. <!-- click 이벤트 발생 시, methods의 doSomething() 함수가 동작함. -->
<button v-on:click="doSomething" />
<!-- 약어인 '@'로 대체가 가능하며 위의 element와 동일하게 동작한다. -->
<button @click="doSomething" />