了解しました!
v-model="childValue"
@Prop('value')
+ @Emit('input')
で同期していた。v-model="childValue"
(これはそのまま使える)modelValue
をprops
で受け取り、update:modelValue
でemitする。// ファイル名: ParentComponent.vue
<template>
<ChildComponent v-model="childValue" />
</template>
<script lang="ts">
import { Vue, Component } from 'vue-property-decorator';
import ChildComponent from './ChildComponent.vue';
@Component({
components: { ChildComponent },
})
export default class ParentComponent extends Vue {
private childValue: string = '親から渡す値';
}
</script>
// ファイル名: ChildComponent.vue
<template>
<input :value="value" @input="onInput" />
</template>
<script lang="ts">
import { Vue, Component, Prop, Emit } from 'vue-property-decorator';
@Component
export default class ChildComponent extends Vue {
@Prop({ type: String, default: '' }) private value!: string;
@Emit('input')
onInput(event: Event) {
return (event.target as HTMLInputElement).value;
}
}
</script>
// ファイル名: ParentComponent.vue
<template>
<ChildComponent v-model="childValue" />
</template>
<script setup lang="ts">
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';
// 親側でchildValueを定義
const childValue = ref('親から渡す値');
</script>
// ファイル名: ChildComponent.vue
<template>
<input :value="props.modelValue" @input="onInput" />
</template>
<script setup lang="ts">
// modelValueをpropsで受け取り
const props = defineProps<{
modelValue: string;
}>();
// update:modelValueイベントをemitで親に通知
const emit = defineEmits<{
(e: 'update:modelValue', value: string): void;
}>();
// inputイベントハンドラー
function onInput(event: Event) {
emit('update:modelValue', (event.target as HTMLInputElement).value);
}
</script>
比較項目 | Before(クラスAPI) | After(Composition API) |
---|---|---|
子コンポーネントの受取名 | value |
modelValue |
子コンポーネントのemit名 | input |
update:modelValue |
親コンポーネントの記述 | v-model="変数" |
v-model="変数" (変わらない) |