리액트로 개발을 시작해서 뷰를 접할 기회가 없었다. 사실 뷰를 쓸 일이 있을까..? 라는 생각을 했었던 것 같다. 하지만 이번 프로젝트에서 뷰를 사용하게 되었다! 그래서 뷰에 대해 정리해보려한다
//main.ts
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
createApp(App).use(router).mount('#app')
✭ 인스턴스란? 뷰의 시작이 되는것으로 vue앱을 만들 때 필수로 생성해야하는 코드. 인스턴스 안에는 미리 정의되어 있는 속성과 메소드들이 있기 때문에 이 기능들을 이용하여 효과적인 화면 구현이 가능.
정리해보면, npm run serve 명령어로 뷰를 실행시키는 순간 main.js 파일이 실행되는데, main.js 파일은 vue를 기반으로 createApp 함수를 실행합니다. 그리고 이때 가장 먼저 가지고 오는 것이 통합 컴포넌트인 App.vue파일이다.
이렇게 만들어진 인스턴스를 index.html의 id="app"에다가 mount 하게 되는 것.
✔️ 텍스트 보간법
<span> 메세지: {{ msg }} </span>
<span v-once> 메세지: {{ msg }} </span>
✔️ 원시 HTML
<p>텍스트 보간법 사용: {{ rawHtml }}</p>
<p>v-html 디렉티브 사용: <span v-html="rawHtml"></span></p>
//텍스트 보간법 사용: <span style="color: red">이것은 빨간색이어야 합니다.</span>
//v-html 디렉티브 사용: 이것은 빨간색이어야 합니다.
✔️ 속성
<div v-bind:id="dynamicId"></div>
<button v-bind:disabled="isButtonDisabled">Button</button>
✔️ 자바스크립트 표현식
<div>{{ count + 1 }}</div>
<div>{{ result ? 'SUCCESS' : 'FAIL' }}</div>
✔️ 지시어
v-bind 데이터를 바인딩하는 지시어
v-html HTML 코드를 렌더링하는 지시어
v-for 반복 렌더링을 수행하는 지시어
v-if / v-else / v-else-if 조건부 렌더링을 수행하는 지시어
v-on 이벤트 처리를 수행하는 지시어
v-model 양방향 데이터 바인딩을 수행하는 지시어
v-slot 자식컴포넌트에게 데이터나 로직을 전달할때 사용하는 지시어
v-pre 해당 엘리먼트의 텍스트 내용을 파싱하지 않도록 하는 지시어
v-once 해당 엘리먼트를 한번만 렌더링 하도록 하는 지시어
v-text 엘리먼트의 텍스트 콘텐츠를 렌더링하는 지시어. 위에서 설명한 텍스트 보간법과 동일한 결과이다.
v-cloak 인스턴스가 로드되기 전에 발생하는 깜빡임을 방지하는 지시어
✔️ 전달 인자(Arguments)
<div v-bind:name="userName"></div>
<div v-on:click="login"></div>
✔️ 동적전달 인자(Dynamic Arguments)
<div v-bind:[attrName]="attrValue"></div>
<div v-on:[eventName]="eventAction"></div>
<script>
export default {
// data: 반응형 상태를 정의
data () {
return {
count: 0
}
},
// methods 선언
methods: {
increment () {
this.count++
}
}
}
</script>
<template>
<button @click="increment">{{ count }}</button>
</template>
❗️ data () 함수에서는 항상 return {} 처럼 객체를 반환하는 함수가 되도록 선언하자. 그렇지 않으면 반응형이 동작하지 않는다.
✔️ ref
<script setup>
import { ref } from 'vue'
// 반응형 상태 정의
const count = ref(0)
function increment() {
count.value++
}
</script>
<template>
<button @click="increment">{{ count }}</button>
</template>
✔️ reactive
<script setup>
import { reactive } from 'vue'
// 반응형 상태 정의
const state = reactive({ count: 0 })
function increment() {
state.count++
}
</script>
<template>
<div>Counter Page</div>
<button @click="increment">{{ state.count }}</button>
</template>
<div id="demo">{{ fullName }}</div>
const vm = Vue.createApp({
data() {
return {
firstName: 'Foo',
lastName: 'Bar'
}
},
computed: {
fullName() {
return this.firstName + ' ' + this.lastName
}
}
}).mount('#demo')
const vm = Vue.createApp({
data() {
return {
firstName: 'Foo',
lastName: 'Bar',
fullName: 'Foo Bar'
}
},
watch: {
firstName(val) {
this.fullName = val + ' ' + this.lastName
},
lastName(val) {
this.fullName = this.firstName + ' ' + val
}
}
}).mount('#demo')