Vuetify v-select でフォームを作る。-- 初期値のセットと関連する選択肢の非活性化切り替え
why
仕事で必要になったから。
最小限でフォームとして必要な機能が揃っているものを作る。
todo -- この記事でやること
Vuetify の セレクトボックス作成ツールである v-select の使い方の説明
初期のセット
関連する選択肢の無効化
v-selct
フォーム周りで一番よく使う。選択肢。
基本的に data に定義してある選択肢をとって、v-model で送る。
選択肢の items と v-model はこの記事でも扱った。
最も簡単な形
data: () => { return { items: [1,2,3,], } }
こうやって js 側の data に選択肢の元になる配列を定義する
<v-select :items=items> </v-select>
html 側で v-select を呼び出して、選択肢の元になる配列を読み込む
するとこれだけで セレクトボックス(プルダウン)が作成できる
しかし、これでは
- (だいたいはそうなるであろう)初期値がなく、手間
- まずい組み合わせを選んで送信できてしまう
などの不便な点があるので、そこを工夫して作る必要がある
outlined
outlined を付け足すだけで、周りが線で囲われたスタイルにできる。手軽すぎる。
選択肢の初期値を作る
data: () => { return { message : 'This is App data message', items: [1,2,3,], item_status: 0, } },
data に items とは別に現在の item の状態、item_status を書く。
created() { this.item_status = 1; }
そして最初に DOM の前の値周りが作成された時に、その値を 1 にする
<v-select v-model="item_status" :items=items outlined > </v-select>
そして html の v-select の v-model に item_status という状態をリンクさせる
これが双方向 binding というらしい。
これで最初に選択肢が入っているセレクトボックスを作ることができる。
紐づくものが変化した時の初期値はまた追加処理が必要
ただし、これが何かに基づいているフォームだった場合、その基づいているものが変わった時には created は走らないので、その基づいているものの変化時に動かす関数に、item_status を 1 にする処理を書く必要がある。
関連する選択肢の無効化
disabled をつけて無効化
diabled の引数を入れるとその v-select は使えなくなる。非活性化。
<v-select v-model="item_status" :items=items outlined > </v-select> <v-select v-model="sub_item_status" :items=sub_items outlined disabled > </v-select>
disabled の値を付け加えた方は無効化されている。
またこれは引数に単純に追加するだけではなく v-bind の :disabled で
<v-select v-model="sub_item_status" :items=sub_items :disabled=false > </v-select>
と、論理値を渡すことができる。無効化 disabled が ウソ false なので
この場合は select box が使える。これが true だと
クリックしても反応せず、使えない。
これを利用して v-model の値をwatch すれば
親要素の選択肢がなしなら関連する子要素は表示しないように..といったこともできる
data: () => { return { isSubItemStatusDisable: false, } },
data に sub item の状態が無効化されている、という変数を定義して
<v-select :disabled=isSubItemStatusDisable >
それを html 側の :disabled の値にセット
watch: { item_status: function(newValue) { console.log(newValue); if(this.item_status === 0) this.isSubItemStatusDisable = true; else this.isSubItemStatusDisable = false; } },
そして watcher を書く。
親要素の状態を監視。
親要素が 0 の時に、子供要素の無効化の状態を true にして
そうでない時は、無効化の状態を false にする。
これで 上の選択肢が 0 の時は 下が無効化されて
0 以外の時は普通に入力できる処理ができた。