今回は、Vuetify3でダイアログコンポーネントのv-dialogが機能しないときの解決方法を記します。
v-dialogが機能しないとは具体的に、OpenDialogボタンを押した際に開かない・
初期表示時になぜか表示されてしまう/表示されないという事象です。
本記事については、公式ドキュメントのサンプルをコピペすると実装できるが
Vue3のComposition APIを使った際に機能しなくなる場合に解決できます。
v-dialogが表示されないコード
<template> <div class="text-center"> <v-dialog v-model="dialog" width="auto" > <template v-slot:activator="{ props }"> <v-btn color="primary" v-bind="props" > Open Dialog </v-btn> </template> <v-card> <v-card-text> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </v-card-text> <v-card-actions> <v-btn color="primary" block @click="dialog = false"> Close Dialog </v-btn> </v-card-actions> </v-card> </v-dialog> </div> </template>
エラー
下の警告がコンソールで上がっていました。
そのままの意味ですが、エラーではなく、警告で表示されていて
他のログに埋もれていました。。
Invalid prop: type check failed for prop "XX". Expected Boolean, got Object at...
解決
boolean型の変数のdialogに「.value」をつけました。
<v-dialog v-model="dialog.value" width="auto" >
<v-btn color="primary" block @click="dialog.value = false">
refを使用すると変数がリアクティブになります。
refで囲うと変数がオブジェクト内に存在する訳ですが、「value」を
省略できます。ただし、Booleanは例外だそうで明示的に「value」を付けなければいけません。
煩わしさがあるため、reactiveを推奨する声もあります。
reactiveだと一貫性があるので本記事のようなトラブルは避けられますね。
https://markus.oberlehner.net/blog/vue-3-composition-api-ref-vs-reactive/
初めからダイアログが表示され続ける/表示されない
これも同様の原因ですね。
Boolean
のプロパティは、値が指定されないとfalse
に変換されます。これはdefault
を設定すると変更できます。例えばdefault: undefined
とすると、非真偽値のプロパティとして振る舞います。Vue.jsVue.js - The Progressive JavaScript Framework
undefinedであると、falseとして処理されるということです。
つまり、非同期で値を入れる場合、初期値としてref(true / false )を設定する必要があります。
おわりに
単純なミスではあるものの、型によって記述が違うと混乱してしまいそうです。
コメント