vue (nuxt)チェックボックス関連の覚書です。
目次
vue.jsのcheckbox(チェックボックス)ですべて選択・非選択
リセットボタンで全解除のサンプル
<b-form-checkbox v-model="isCheckboxResetAll" class="checkboxs" name="" @change="clearCheckbox">
リセット
</b-form-checkbox>
<b-form-checkbox
v-for="checkbox in checkboxs"
:key="checkbox.name"
v-model="selectedCheckboxIds"
class="checkboxs"
:value="checkbox.id"
name=""
@change="unclearCheckbox()"
>
{{ checkbox.name }}
</b-form-checkbox>
最近はbootstrapを使わず、labelを作りinputにtype=”checkbox”を追加。divでv-forで回すことが多いです。
data() {
return {
checkboxs: [
{ id: 'checkboxs1', name: 'チェックボックス1' },
{ id: 'checkboxs2', name: 'チェックボックス2' },
{ id: 'checkboxs3', name: 'チェックボックス3' },
{ id: 'checkboxs4', name: 'チェックボックス4' },
{ id: 'checkboxs5', name: 'チェックボックス5' }
],
isCheckboxResetAll: false,
selectedCheckboxIds: [],
}
},
methods: {
clearCheckbox() {
this.selectedCheckboxIds = []
if (this.isCheckboxResetAll) {
this.isCheckboxResetAll = false
} else {
this.isCheckboxResetAll = true
}
},
unclearCheckbox() {
if (this.isCheckboxResetAll) {
this.isCheckboxResetAll = false
}
}
}
全選択などの参考文献のサンプル
こちらの記事がとても参考になりました。ありがとうございます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9VnVlLmpzJUUzJTgxJUE3JUUzJTgwJThDJUUzJTgxJTk5JUUzJTgxJUI5JUUzJTgxJUE2JUU5JTgxJUI4JUU2JThBJTlFJUUzJTgwJThEJUUzJTgyJTkyJUU1JUFFJTlGJUU4JUEzJTg1JUUzJTgxJTk5JUUzJTgyJThCJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz1mYzUwNWYwMGRhMzkxNjE0MTI2MzYyOGYzZjdhYzc3MQ&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBjaG9jb2xhdGluYSZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9MDRkMGU0ZTIxOTZlYTE0ODdmNDdjZjdhNTY5ZDg0MjQ&blend-x=142&blend-y=436&blend-mode=normal&txt64=aW4gR01P44Oa44OR44Oc5qCq5byP5Lya56S-&txt-width=770&txt-clip=end%2Cellipsis&txt-color=%23212121&txt-font=Hiragino%20Sans%20W6&txt-size=36&txt-x=156&txt-y=536&s=ac604f7fecfe7dbcb561625074640d17)
少しコードが違います。英語ですが。
![](https://makitweb.com/wp-content/uploads/2018/01/Check-uncheck-All-Checkboxes-with-Vue.js.jpg)
別のやり方もあるようです。
vuetifyjsやbootstrapvueを使う場合の注意事項
なお、vuetifyjsやbootstrapvueを使う場合は、@clickではなく@changeになるようです。@changeのあとの括弧はあってもなくてもよい。つまり、toggleAllでもtoggleAll()ても。
ただ、違いとしては、括弧なしの場合、Event
オブジェクトが渡されてメソッドが実行されるよう。基本括弧はつけるようにしています。
bootstrapを使わない場合はclickで困ったことは今のところありません。
下記はbootstrapvueの例。
<b-form-checkbox
v-model="allSelected"
:indeterminate="indeterminate"
aria-describedby="flavours"
aria-controls="flavours"
@change="toggleAll"
>
チェックボックスに応じて画像の表示・非表示を行う場合、v-ifの配列チェックはincludesを使うと簡単です。ES2015 でArray.some、ES2017でArray.includesが追加されました。indexOfは直感的ではありません。
<b-img
v-if="selectedIds.includes('line')"
class="connect"
src="~/assets/images/line.png"
></b-img>
v-forとv-modelの複数チェックボックス
<div v-for="(l, index) in list" :key="index">
<label :for="'a' + index">
<input
:id="'a' + index"
v-model="l.a"
:value="l.id"
type="checkbox"
name=""
@change="change()"
/>
</lavel>
</div>
v-modelはjavascriptのdataで参照しているものがそのまま入る場合もあります。作りによります。
また上記の場合、v-modelはlist[index].aでも動きます。
labelのforとinputのidは外しても動くようですが、紐ずけをわかりやすくするためにいれています。forとidは:(コロン)を外し、固定の文字列にした場合は動作がおかしくなります。
valueも省略可ですが、初期値としても使われ、MDNに次のように書かれていますので、入れています。
value 属性は常に省略可ですが、 checkbox, radio, hidden においては必須だと考えてください。
![](https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png)
nameも省略可で、シンプルにすると次のようになりますが、コードをわかりやすくするために入れておく派ですかね。
<div v-for="(l, index) in list" :key="index">
<label>
<input
v-model="l.a"
type="checkbox"
@change="change()"
/>
</lavel>
</div>
v-forのradioで入り込んだバグ
v-forで回し、valueに同じ値が2つあると2つ選択してしまう症状がありましたね。。
v-modelを使っているので両方に同期してしまうということでしょうか。CSSは後方のみ選択するため選択物と違ったものが色が変わりました。
診断アプリだったのでパラメーターの値割り振りにたまたま同じ値があったのですが、valueが固有の値ではないとラジオボタンになりません。今回はvalueをユニークな値にすることにより改善しました。
ユニークな値を渡し、診断時に文字列操作をするようにしました。
vue.jsでアイコンつきトグルボタンの作り方
トグルボタンはチェックボタンの一種です。
普通にCSSのみで作成でき、クリックしたときにJavascriptを呼べばOKです。
デザインはいろいろ工夫できるためコードの書き方がいろいろです。アイコンなしのコードはそこらじゅうに転がっているため、アイコンや文字が変わるパターンのものを探してみました。
個人的に好きなもの。この動画は2つのシンボルを切り替える形で、fontawesomeにも置き換えやすいですね。
作り方は文字で簡単に解説すると、relativeのlabelを背景とし、各要素をabsoluteしていく感じです。あとはアニメーションの初期値を各要素にもたせ、input[type=’checkbox’]:checkedでアニメーション後の指定をします。
他です。
vue.jsのcheckbox(チェックボックス)の上限
<div v-for="(item, index) in itemlist">
<label>
<input type="checkbox" :value="item.id" name="" v-model="selectedItems" :disabled="selectedItems.length >= max && selectedItems.indexOf(item.id) == -1" />
{{item}}
</label>
</div>
:value=”item.id”とselectedItems.indexOf(item.id)のitem.idはあわせる必要があります。
selectedItems.indexOf(item.id) == -1は定番の処理で見つからない場合、-1を返すためその処理です。
こちらのサンプルが参考になります。
vue.jsのcheckbox(チェックボックス)の豆知識
Vueのチェックボックスのチェック方法
マスタッシュ構文で表示もできますが、Chromeの拡張を使うと次の方法で確認できます。
Vue > Components > 画面左で該当の箇所を選ぶ 画面右で値の確認をする
vue (nuxt)やfirebaseの学習方法
参考になれば幸いです。
コメント