반응형
컴포넌트의 props로 v-model을 사용하는 방법을 알아봅니다.
Props은 readOnly reactive object임
즉 computed 등으로 반응성 체킹은 가능하지만 props를 직접 수정할 수는 없음
우회 방법 : modelValue
https://vuejs.org/guide/components/events.html#usage-with-v-model
놀랍게도 Vue3은 내부적으로 v-model의 양방향 바인딩을 단방향 바인딩으로 캐스팅하여 이를 해결함
즉 아래와 같은 소스코드는
<Comp v-model="first"/>
아래와 같이 컴파일러에 의해 변환됨.
<Comp
:modelValue="first"
@update:modelValue="newValue => first = newValue"
/>
자식 컴포넌트에서는 이를 대비한 구현을 해줘야 함
<script setup>
import {computed} from 'vue';
defineProps(['modelValue'])
defineEmits(['update:modelValue'])
</script>
<template>
<input
:value="modelValue"
@input="$emit('update:modelValue', $event.target.value)"
/>
</template>
참고 : 아래와 같이 구현하는 것도 가능함. 뭔가 리코일 같은 느낌
<!-- CustomInput.vue -->
<script setup>
import { computed } from 'vue'
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])
const value = computed({
get() {
return props.modelValue
},
set(value) {
emit('update:modelValue', value)
}
})
</script>
<template>
<input v-model="value" />
</template>
반응형
반응형
'FrontEnd' 카테고리의 다른 글
[React 디자인 패턴] Renderless Component 패턴 (0) | 2022.12.17 |
---|---|
Svelte 코드 컴파일러는 어떻게 동작할까? (0) | 2022.12.17 |
[Vue3] props와 컴포넌트 상태 동기화 (0) | 2022.12.16 |
Vue3가 DOM 업데이트를 비동기적으로 수행하는 방법 (0) | 2022.12.14 |
Vue3 반응성 완벽 이해 3편 : vue3 core 코드 직접 읽어보기 (0) | 2022.12.11 |