概要
以下、Vue.jsのUIライブラリであるVuetifyの話です。
v-data-table
にチェックボックスを表示しつつ、行のクリックをチェックボックスも連動させたかったときのメモです。
方法
<template>
<v-data-table
v-model="selected"
:headers="headers"
:items="items"
item-key="id"
show-select
>
<template v-slot:item="{ item, isSelected, select }">
<tr :class="[{'v-data-table__selected': isSelected}]" @click="select(!isSelected)">
<td>
<v-simple-checkbox :value="isSelected" @input="select($event)" />
</td>
<td v-for="header in headers" :key="header.value">
{{ item[header.value] }}
</td>
</tr>
</template>
</v-data-table>
</template>
v-data-table
のv-slot
のうち、テーブルのデータにクリックを仕込めそうなのはbody
, item
, item.<name>
あたりに見えると思います。
ただこのうち「行」の選択済み情報を持っているのは item
のみです。
item
の isSelected
がそれに該当します。
そしてitem
の select
という選択のためのファンクションも持っていますのでこれを使います。
<tr @click="select(!isSelected)" >
この部分が本稿の全てです。
trタグに@click
を書けばクリックイベントが仕込めることはVue.jsを勉強したらお分かりかと思います。
v-slot
のselect
は直感的でチェックをつけたければtrueを、外したければfalseを渡してあげればいい形です。
v-slot
には行が選択されているかの情報であるisSelected
がありますので、それを逆にして渡してあげればいいと、となります。
これで、行をクリックしたときにもチェックボックスにチェックがつきます。
蛇足
以下は失敗談です。
<v-simple-checkbox :value="isSelected" @input="select($event)" />
チェックボックスの部分の上記のソースですが、これは公式のslotのサンプルのitem.data-table-select
の部分でも記載されているものと同一です。
この部分を参考に、最初は@input
の右辺をそのまま
<tr @click="select($event)" >
ただこれは動きませんのでご注意ください・・・。