Class APIの時
@Prop
と @Emit('input')
デコレータを使って、v-modelを実装していた。
Composition APIでは
defineProps
と defineEmits
を組み合わせて、より明示的に管理する。
v-modelの内部挙動も少し変わる
value
→ modelValue
input
イベント → update:modelValue
イベント へ変更が必要。// ファイル名: ChildComponent.vue
<script lang="ts">
import { Vue, Component, Prop, Emit } from 'vue-property-decorator';
@Component
export default class ChildComponent extends Vue {
// 親から渡されるv-modelの値
@Prop({ type: String, default: '' }) private value!: string;
// 入力イベントを親に伝える
@Emit('input')
onInput(event: Event) {
return (event.target as HTMLInputElement).value;
}
}
</script>
<template>
<input :value="value" @input="onInput" />
</template>
// ファイル名: ChildComponent.vue
<script setup lang="ts">
// 親から渡されるv-modelの値(Composition APIではmodelValue)
const props = defineProps<{
modelValue: string;
}>();
// 親に通知するイベント(update:modelValueイベントを発火)
const emit = defineEmits<{
(e: 'update:modelValue', value: string): void;
}>();
// inputイベントハンドラー
function onInput(event: Event) {
emit('update:modelValue', (event.target as HTMLInputElement).value);
}
</script>
<template>
<input :value="props.modelValue" @input="onInput" />
</template>
比較項目 | Before(クラスAPI) | After(Composition API) |
---|---|---|
v-model受け取り名 | value |
modelValue |
イベント名 | input |
update:modelValue |
Props定義方法 | @Prop デコレータ |
defineProps |
Emit定義方法 | @Emit('input') デコレータ |
defineEmits |
v-model
は必ず modelValue
と update:modelValue
に統一する。defineProps
, defineEmits
) を 明示的に型安全 に行うこと。