😐
Vue3のv-modelショートハンドにいまいち慣れない
Vue2時代のv-model
相当機能はVue3でこういう仕様に変化した。
コードは公式docより抜粋。
<ChildComponent v-model="pageTitle" />
<!-- would be shorthand for: -->
<ChildComponent
:modelValue="pageTitle"
@update:modelValue="pageTitle = $event"
/>
v-model
を使う親側の使用感は大きな変化なし。しかし子側の記法はそこそこ変わっている。
export default {
props: {
modelValue: String
},
emits: ['update:modelValue'],
methods: {
changePageTitle(title) {
this.$emit('update:modelValue', title)
}
}
}
modelValue
、長い。何度か書いてみたが毎回忘れてdocを読み直している。
思うにVue3のv-model
記法は、v-model
で書きたいからそういう風に用意しておくというよりは、使いたくなったらv-model
でも書ける風に考えておいたほうがいいかもしれない。
どういうことかというと、v-model
ショートハンドを使うためにmodelValue
という特殊なprops
を用意するのではなく、普通に用途に応じた名前で用意しておく。
export default {
props: {
text: String
},
emits: ['update:text'],
methods: {
changePageTitle(title) {
this.$emit('update:text', title)
}
}
}
親側は名前指定でv-model
を使う。
<ChildComponent v-model:text="pageTitle" />
<ChildComponent
:text="pageTitle"
@update:text="pageTitle = $event"
/>
名前こそv-model
を継承しているが、実質これはVue2時代のv-model
よりも、**.sync
記法の後継と考えたほうが実態に近い。
無理にv-model
ショートハンドを使おうとしなければmodelValue
という突然沸いてくる存在も意識しなくて済む。
ただしform系コンポーネントはv-model
ショートハンドで素のform系要素と同様な使い心地にしておきたいことが多いはず。なので完全に使わない方向に倒すのもそれはそれで不便そう。
Discussion