Vue
[Vue3] defineModel
M_master
2024. 8. 27. 00:27
소개
Vue에서는 데이터 흐름 관리를 위해 props와 emit를 이용한 방식이 널리 사용되어 왔습니다. 그러나 최근에 나온 Vue3.4에서는 defineModel 방식을 권장하고 있습니다.
- props
부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달할 때 사용
- emit
부모 컴포넌트로 데이터를 전달
defineModel 이전의 방식
<!-- 자식 컴포넌트 -->
<script setup>
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])
</script>
<template>
<input
:value="props.modelValue"
@input="emit('update:modelValue', $event.target.value)"
/>
</template>
<!-- 부모 컴포넌트 -->
<Child
:modelValue="foo"
@update:modelValue="$event => (foo = $event)"
/>
이러한 방식은 간단하고 직관적이지만, 데이터 흐름이 복잡해지거나 중첩된 컴포넌트 구조에서는 유지보수가 어려울 수 있습니다.
- defineModel 설명
- Vue 3.4부터는 권장하는 방식
- 반환되는 값은 ref이며, 다른 ref처럼 접근하고 변경할 수 있지만, 부모 값과 로컬 값 사이의 양방향 바인딩응로 작동 (즉, 작성에 의해 변경되면 부모 바인딩 값도 업데이트가 된다)
- defineModel 사용방법
<script setup>
import { defineModel } from "vue";
const title = defineModel('title');
</script>
<template>
<input type="text" v-model="title" />
</template>
- defineModel arguments
const [model, modifiers] = defineModel();
// v-model을 필수로 만들기
const model = defineModel({ required: true });
// 기본값 제공
const model = defineModel({ default: 0 });
// 타입 설정
const model = defineModel({ type: String });
// 로컬 변수로 설정하여 부모로부터 전달되지 않아도 사용할 수 있음.
const model = defineModel({ local: true });
// 첫 번째 매개변수에 이름, 두번째 매개변수에 설정값을 추가
const model = defineModel('model', { required: true });
- Multiple bindings
<script setup>
const firstName = defineModel('firstName')
const lastName = defineModel('lastName')
</script>
<template>
<input type="text" v-model="firstName" />
<input type="text" v-model="lastName" />
</template>
728x90