Vue.jsのバージョン3では、v-model
の仕様が結構変わっているのでそれのメモ。
サンプルコード
シンプルなパターン
modelValue
プロパティを使った値の受け渡しになっていて、値の変更は、update:modelValue
イベントを発火することで親コンポーネントに通知できるようになっています。
※バージョン2の頃の、value
プロパティとinput
イベントの発火からは変更になっています。
子供側コンポーネントのコード
export default { name: 'ChildComponent', props: { modelValue: String, }, data: () => { return { i: 1 } }, methods: { change: function () { const count = this.i++; this.$emit('update:modelValue', `${this.modelValue.replace(/:.+$/, '')}: ${count}`) } } }
親側のコンポーネント
<template> <child v-model="str" /> </template>
名前付きのv-modelを使うパターン
v-model
の引数に名前を指定することで、その名前のプロパティを使った受け渡しが可能になります。
子供のコンポーネントでは、任意の名前でプロパティを定義して、値の変更はupdate:プロパティ名
で発火することで親コンポーネントに通知できるようになっています。
子供側のコンポーネント
export default { name: 'ChildComponent', props: { name: String }, methods: { change() { this.$emit('update:name', '変更されたよ') } } }
親側のコンポーネント
<template> <child v-model:name="str" /> </template>