BootstrapVue の b-table を用いて特定の行を選択し、選択した行データの内容を取得し、画面に表示する サンプル コード を説明します。
使用する データ
出発地点は、以下の コード とします。
<template> <div> <b-table class="text-left" :items="items" ></b-table> </div> </template>
<script> export default { data() { return { items: null, } }, created() { this.items = DATA } } const DATA = [ { year: 2019, month: 2, sports_event: '2019 AFC Asian Cup Final', url: 'https://en.wikipedia.org/wiki/2019_AFC_Asian_Cup' }, { year: 2019, month: 7, sports_event: '2019 FIFA Women\'s World Cup Final', url: 'https://en.wikipedia.org/wiki/2019_FIFA_Women%27s_World_Cup' }, { year: 2021, month: 1, sports_event: '2020 African Nations Championship Final', url: 'https://en.wikipedia.org/wiki/2020_African_Nations_Championship' }, { year: 2021, month: 2, sports_event: '2020 FIFA Club World Cup Final', url: 'https://en.wikipedia.org/wiki/2020_FIFA_Club_World_Cup' }, { year: 2021, month: 7, sports_event: 'UEFA Euro 2020 Final', url: 'https://en.wikipedia.org/wiki/UEFA_Euro_2020' }, { year: 2022, month: 12, sports_event: '2022 FIFA World Cup Final', url: 'https://en.wikipedia.org/wiki/2022_FIFA_World_Cup' }, ] </script>
この状態では、表の行を クリック しても選択された状態にはなりませんので、行を選択可能な状態にしていきます。
行を選択可能に
select-mode プロパティ
ここでは、 select-mode prop を活用します。 select-mode プロパティには以下の3つの値が指定できます。今回は single を使っていきます。
- multi: クリック の度に選択、解除。(デフォルト)
- single: 1 行のみ選択可能
- range: shift + クリック や Ctrl (Cmd) + クリック で複数行の選択も可能になる
selectable プロパティ
select-mode プロパティを使うためには、 兎にも角にも行を選択可能にしなければいけません。行を選択可能にするためには selectable プロパティ を使います。
<template> <div> <b-table class="text-left" :items="items" selectable ></b-table> </div> </template>
これで以下のとおり、 デフォルト 動作である multi の動作になります。 試しに shift + クリック をしても、 複数行 は選択できません。
select-mode=”single”
次に、 select-mode に single を指定します。
<template> <div> <b-table class="text-left" :items="items" select-mode="single" selectable ></b-table> </div> </template>
同時に 1 行しか選択できないように、振る舞いが変化しました。
‘single’ not defined
当初、 ‘select-mode’ に ‘singel’ や ‘multi’ を指定しても、 ‘single’ is not defined というエラーが出ていました。 以下のサイトを参考に、 primary-key を追加してみたら、 エラー が消え、その後、 primary-key を削除しても意図通り動作するようになりました。 詳細は調査しきれてないですが、 もし同様のエラーが出たら参考にしていただければと思います。
<template> <div> <b-table class="text-left" :items="items" selectable select-mode="single" primary-key="url" ></b-table> </div> </template>
選択行の情報を取得
row-selected イベント
それでは、選択した 1 行の データ を取得していきます。 まずは、いまの状態での Vue の振る舞いを Chrome の Dev Tools でみていきます。
公式 サイト に以下の記載があるとおり、 row-selected イベントが発生しています。 具体的には、選択の度に、 row-clicked と row-selected の2つが発生していることがわかります。
When a table is selectable and the user clicks on a row, will emit the row-selected event, passing a single argument which is the complete list of selected items. Treat this argument as read-only.
https://bootstrap-vue.org/docs/components/table#row-select-support
BTable data.selectedRows
以下のとおり、 BTable の data 配下の selectedRows の選択した行と同じ Index に “true” が設定されることがわかります。
@row-select で イベント を拾う
それでは、最後に選択した行データを @row-selecteed を用いて、表示用の データプロパティ に格納し、画面に表示してみます。
<template> <div> <b-table class="text-left" :items="items" selectable select-mode="single" @row-selected="onRowSelected" ></b-table> {{ selected }} </div> </template>
export default { data() { return { items: null, selected: [], } }, methods: { onRowSelected(items) { this.selected = items }, }, created() { this.items = DATA } }
これで、選択した行のデータを取得し、画面に表示することができました。
まとめ
- b-table の select-mode プロパティ を使って、 単一選択、 複数選択 を切り替える
- @row-select で イベント を拾うことで、 選択行のデータを取得可能