특징
구체적 예시
FrameWork
Library
MVVM (Model-View-ViewModel)
컴포넌트 기반 프레임워크
React.js와 Angular.js의 장점을 가지고 있음
• React
• 단방향 데이터 흐름 : 컴포넌트 단방향 통신 구조화 (상위 컴포넌트 → 하위 컴포넌트)
• 가상 DOM 렌더링 방식 : 화면 전체를 다시 그리지 않고 Vue에서 정의한 방식에 따라 화면 갱신
Angular
• 양방향 데이터 바인딩 : 화면에 표시되는 값과 프레임워크 모델 데이터 값이 동기화 →
→ 한쪽이 변경되면 다른 한쪽도 자동으로 변경
공통점
차이점
// React
// && 연산자 방식
<div>
{isVisible && <button>조건에 따라 사라질 버튼</button>}
</div>
// 삼항 연산자 방식
<div>
{isVisible ? <button>조건에 따라 사라질 버튼</button> : null}
</div>
//Vue
// if
<div>
<button v-if="isVisible">조건에 따라 사라질 버튼</button>
<button v-if-else="Visible">조건에 따라 사라질 버튼</button>
<button v-else="isVisible">조건에 따라 사라질 버튼</button>
</div>
const MyItems = [
{ id: 1, name: 'kkk' },
{ id: 2, name: 'is' },
{ id: 3, name: 'free' }
]
// React
// map 1
const item = MyItems.map((list) => <li key=list.id}>{list.name}</li>)
return (
<ul>
{item}
</ul>
)
// map 2
return (
<ul>
{MyItems.map((list) => <li key=list.id}>{list.name}</li>)}
</ul>
)
//Vue
// for
<ul>
<li v-for="item in MyItems" key: item.id>{{ item.name }}</li>
</ul>
<template>
<h2> {{ count }} </h2>
<button @click="a">You clicked me</button>
</template>
<script setup>
import { ref } from 'vue'
const count = ref(0)
const a =() => count.value + 1
</script>
// 상위 컴포넌트
<template>
<h2>{{form.title}}</h2>
<h2>{{form.content}}</h2>
<PostForm
@submit.prevent="saveForm"
v-model:title="form.title"
v-model:content="form.content"
>
</PostForm>
<f>
</template>
<script setup>
import { ref } from 'vue'
const form = ref({
title: '',
content: '',
});
const saveForm = async () => {
const now = new Date();
useAxios({
...form.value,
createAt: `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}`,
});
};
</script>
// 하위 컴포넌트
<template>
<form @submit.prevent.stop="saveForm">
<div>
<label for="title">제목</label>
<input
type="text"
id="title"
:value="title"
@input="$emit('update:title', $event.target.value)"
/>
</div>
<div>
<label for="content">내용</label>
<textarea
id="content"
:value="content"
@input="$emit('update:content', $event.target.value)"
/>
</div>
</form>
</template>
<script setup>
cosnt porps = defineProps({
title: String,
content: String,
});
porps.title
defineEmits(['update:title', 'update:content']);
</script>
<style>