✅ 7.1 PropsとEmitの再設計(v-modelの移行対応)


■ 要点まとめ


■ Before(クラスコンポーネント版)

// ファイル名: 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>


■ After(Composition API版)

// ファイル名: 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

🎯 設計時の注意ポイント