Vue3に慣れる練習がてらにフォームのinputのコンポーネントを作成して利用してみることにしました。qiitaなんかで調べてみるとinputのコンポーネントは以下のような感じです。
●OldInput.vue
<template>
<input
type="text"
:value="value"
@input="$emit('input', $event.target.value)"
/>
</template>
<script>
export default {
name: "OldInput",
props: {
value: String,
}
}
</script>
呼び出し元は以下のような感じです。
<OldInput v-model="sampletext"></OldInput>
で、これに沿って作ってみたのですが、どうも期待どおりに
動きません。(コンポーネントに値が渡らず、コンポーネントからも戻って来ない)
悩んだ挙げ句、英語版のvue3のドキュメントを読んでて、vue3では、v-modelのpropの値とemitのイベントが変更になったことがわかりました。orz
BREAKING: When used on custom components, v-model prop and event default names are changed:
prop: value -> modelValue;
event: input -> update:modelValue;
ということで、コンポーネントを以下のように修正すると期待通りの動作になりました。
●NewInput.vue
<template>
<input
type="text"
:value="modelValue"
@input="$emit('update:modelValue', $event.target.value)"
/>
</template>
<script>
export default {
name: "NewInput",
props: {
modelValue: String,
}
}
</script>
ちなみに呼び出し元は
<NewInput v-model="sampletext"></NewInput>
です。
ドキュメントが英語版しかなかったので、qiitaとかで調べたんですが、まずはドキュメントを読まないと駄目ですね。
※modelという名前を変更したい場合、v-modelに引数を与える方法があります。(以下ではtitle)
●呼び出し元
<NewInput v-model:title="sampletext"></NewInput>
●NewInput.vue
<template>
<input
type="text"
:value="title"
@input="$emit('update:title', $event.target.value)"
></template>
<script>export default {
name: "NewInput",
props: {
title: String
},
}
</script>