例:基本的な使用法
<template>
<div>
<b-table striped hover :items="items"></b-table>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
{ age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{ age: 89, first_name: 'Geneva', last_name: 'Wilson' },
{ age: 38, first_name: 'Jami', last_name: 'Carney' }
]
}
}
}
</script>
アイテム(レコードデータ)
items
は、配列形式のテーブルデータであり、各レコード(行)データはキー付きオブジェクトです。フォーマット例
const items = [
{ age: 32, first_name: 'Cyndi' },
{ age: 27, first_name: 'Havij' },
{ age: 42, first_name: 'Robert' }
]
<b-table>
は、最初の行を自動的にサンプルしてフィールド名(レコードデータのキー)を抽出します。フィールド名は、kebab-case
、snake_case
、および camelCase
を個々の単語に変換し、各単語を大文字にすることで自動的に「人間化」されます。変換例
first_name
は First Name
になります last-name
は Last Name
になります age
は Age
になります YEAR
は YEAR
のままです isActive
は Is Active
になります
これらのタイトルは、データ最初のレコードに表示される順序でテーブルヘッダーに表示されます。フィールド見出しの表示方法をカスタマイズするには、以下のフィールドセクションを参照してください。
注意: フィールドの順序は保証されていません。通常、フィールドは最初の行で定義された順序で表示されますが、使用中のブラウザのバージョンによってはそうでない場合があります。フィールドの順序を保証し、生成された見出しをオーバーライドする方法については、以下のフィールド(列定義)セクションを参照してください。
レコードデータには、行や個々のセル(バリアント)を色分けしたり、追加の行詳細をトリガーしたりするための特別な予約名キーを追加することもできます。サポートされているオプションのアイテムレコードモディファイアプロパティ(フィールドキーがこれらの名前と競合しないようにしてください)
プロパティ | 型 | 説明 |
_cellVariants | オブジェクト | 個々のセルに適用される Bootstrap コンテキスト状態。フィールドでキー付けされます(サポートされる値については、カラーバリアントを参照してください)。これらのバリアントは、クラスtable-${variant} または bg-${variant} にマッピングされます(dark プロパティが設定されている場合)。 |
_rowVariant | 文字列 | 行全体に適用される Bootstrap コンテキスト状態(サポートされる値については、カラーバリアントを参照してください)。これらのバリアントは、クラスtable-${variant} または bg-${variant} にマッピングされます(dark プロパティが設定されている場合)。 |
_showDetails | ブール値 | row-details スコープ付きスロットの表示をトリガーするために使用されます。詳細については、以下の行詳細のサポートセクションを参照してください |
例:テーブルセルにバリアントを使用する
<template>
<div>
<b-table hover :items="items"></b-table>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
{ age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{
age: 89,
first_name: 'Geneva',
last_name: 'Wilson',
_rowVariant: 'danger'
},
{
age: 40,
first_name: 'Thor',
last_name: 'MacDonald',
_cellVariants: { age: 'info', first_name: 'warning' }
},
{ age: 29, first_name: 'Dick', last_name: 'Dunlap' }
]
}
}
}
</script>
items
は、アイテムデータのArray
を返すプロバイダー関数への参照にすることもできます。プロバイダー関数は非同期にすることもできます
null
(またはundefined
)を返し、データが準備できたら、データ配列をコールバックへの唯一の引数としてコールバックを呼び出すことで、 - 配列に解決する
Promise
を返すことで。
詳細については、以下の「アイテムプロバイダー関数の使用」セクションを参照してください。
テーブルアイテムの注意事項と警告
- 基礎となるアイテムデータの変更によって、行またはテーブル全体が再レンダリングされるため、レコードデータをインプレースで操作することは避けてください。行のVueの再レンダリングを最小限に抑える方法については、以下のプライマリキーを参照してください。
items
配列レコードは単純なオブジェクトであり、行内の値に循環参照がある可能性のあるデータを配置することは避ける必要があります。<b-table>
は、ソートおよびフィルタリングのために行データを文字列にシリアル化し、循環参照はスタックオーバーフローを引き起こし、アプリがクラッシュします!
フィールド(列定義)
fields
プロパティは、テーブル列の見出しをカスタマイズしたり、データの列を表示する順序をカスタマイズしたりするために使用されます。フィールドオブジェクトキー(つまり、以下に示すようにage
またはfirst_name
)は、各アイテム(レコード)行から値を抽出したり、列のソートを有効にするなどの追加機能を提供したりするために使用されます。
フィールドは、単純な配列またはオブジェクトの配列として指定できます。内部では、フィールドデータはオブジェクトの配列形式に正規化されます。列field
データを含むイベントまたはスロットは、正規化されたフィールドオブジェクト形式になります(fields
の場合はオブジェクトの配列、個々のfield
の場合はオブジェクト)。
単純な配列としてのフィールド
フィールドは、列の順序と表示する列を定義するための単純な配列にすることができます。
例:array
フィールド定義の使用
<template>
<div>
<b-table striped hover :items="items" :fields="fields"></b-table>
</div>
</template>
<script>
export default {
data() {
return {
fields: ['first_name', 'last_name', 'age'],
items: [
{ isActive: true, age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
{ isActive: false, age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{ isActive: false, age: 89, first_name: 'Geneva', last_name: 'Wilson' },
{ isActive: true, age: 38, first_name: 'Jami', last_name: 'Carney' }
]
}
}
}
</script>
オブジェクトの配列としてのフィールド
フィールドはオブジェクトの配列にすることができ、フィールドの追加の制御(ソート、フォーマットなど)を提供します。フィールド配列に表示される列(キー)のみが表示されます
例:オブジェクトの配列フィールド定義の使用
<template>
<div>
<b-table striped hover :items="items" :fields="fields"></b-table>
</div>
</template>
<script>
export default {
data() {
return {
fields: [
{
key: 'last_name',
sortable: true
},
{
key: 'first_name',
sortable: false
},
{
key: 'age',
label: 'Person age',
sortable: true,
variant: 'danger'
}
],
items: [
{ isActive: true, age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
{ isActive: false, age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{ isActive: false, age: 89, first_name: 'Geneva', last_name: 'Wilson' },
{ isActive: true, age: 38, first_name: 'Jami', last_name: 'Carney' }
]
}
}
}
</script>
フィールド定義リファレンス
次のフィールドプロパティが認識されます
プロパティ | 型 | 説明 |
key | 文字列 | アイテム配列のレコードからデータを選択するためのキー。fields をオブジェクトの配列で設定する場合は必須です。key は、カスタムデータレンダリングおよびカスタムヘッダーとフッターのスロット名生成にも使用されます。 |
label | 文字列 | 列テーブルヘッダー(およびfoot-clone が設定されている場合はフッター)に表示されます。指定されていない場合は、フィールドのキー(人間化された形式)がデフォルトになります。空の文字列"" を割り当てることで空のラベルを使用できますが、非視覚ユーザーに列の内容に関するヒントを提供するために、必ずheaderTitle も設定してください。 |
headerTitle | 文字列 | フィールドヘッダーの<th> 属性title に配置するテキスト。デフォルトではtitle 属性はありません。 |
headerAbbr | 文字列 | フィールドヘッダーの<th> 属性abbr に配置するテキスト。ラベル(またはタイトル)が省略形の場合は、これにラベル(またはタイトル)の省略されていないバージョンを設定します。デフォルトではabbr 属性はありません。 |
class | 文字列または配列 | 列の<th> と<td> に追加するクラス名(またはクラス名の配列)。 |
formatter | 文字列または関数 | フォーマッターコールバック関数またはコンポーネントのメソッドの名前。スコープ付きフィールドスロットの代わりに(または組み合わせて)使用できます。フォーマッターは構文formatter(value, key, item) で呼び出されます。詳細については、カスタムデータレンダリングを参照してください。 |
sortable | ブール値 | この列のソートを有効にします。詳細については、ソートセクションを参照してください。 |
sortKey | 文字列 | v2.17.0+ no-local-sorting が true の場合、発行されるコンテキスト内の列の sortBy の値を設定します。 |
sortDirection | 文字列 | この列がソートされる際の初期ソート方向を設定します。詳しくは、初期ソート方向の変更のセクションを参照してください。 |
sortByFormatted | 真偽値または関数 | true に設定すると、フィールドの formatter コールバック関数の結果で列をソートします。デフォルトは false です。フィールドに formatter がない場合、真偽値は効果がありません。オプションで、ソート目的のみで値をフォーマットするためのフォーマッタ関数参照を受け入れます。詳しくは、ソートのセクションを参照してください。 |
filterByFormatted | 真偽値または関数 | true に設定すると、フィールドの formatter コールバック関数の結果で列をフィルタリングします。デフォルトは false です。フィールドに formatter がない場合、真偽値は効果がありません。オプションで、フィルタリング目的のみで値をフォーマットするためのフォーマッタ関数参照を受け入れます。詳しくは、フィルタリングのセクションを参照してください。 |
tdClass | 文字列、配列、または関数 | 列の <tbody> データ <td> セルに追加するクラス名(またはクラス名の配列)。セルごとにカスタムクラスが必要な場合は、代わりにコールバック関数を指定できます。この関数は tdClass(value, key, item) として呼び出され、Array または String を返す必要があります。 |
thClass | 文字列または配列 | このフィールドの <thead> /<tfoot> ヘッダー <th> セルに追加するクラス名(またはクラス名の配列)。 |
thStyle | オブジェクト | テーブルの <thead> /<tfoot> フィールド <th> に適用する CSS スタイルを表す JavaScript オブジェクト。 |
variant | 文字列 | 列のすべての <th> および <td> にコンテキストクラスを適用します - active 、success 、info 、warning 、danger 。これらのバリアントは、クラス thead-${variant} (ヘッダー内)、table-${variant} (本体内)、または bg-${variant} (prop dark が設定されている場合) にマッピングされます。 |
tdAttr | オブジェクトまたは関数 | <tbody> フィールド <td> セルに適用する追加の属性を表す JavaScript オブジェクト。セルごとにカスタム属性が必要な場合は、代わりにコールバック関数を指定できます。この関数は tdAttr(value, key, item) として呼び出され、Object を返す必要があります。 |
thAttr | オブジェクトまたは関数 | フィールドの <thead> /<tfoot> ヘッダー <th> セルに適用する追加の属性を表す JavaScript オブジェクト。フィールドの isRowHeader が true に設定されている場合、属性は <tbody> フィールド <th> セルにも適用されます。セルごとにカスタム属性が必要な場合は、代わりにコールバック関数を指定できます。この関数は thAttr(value, key, item, type) として呼び出され、Object を返す必要があります。 |
isRowHeader | ブール値 | true に設定すると、フィールドの項目データセルは、デフォルトの <td> ではなく、<th> でレンダリングされます。 |
stickyColumn | ブール値 | true に設定すると、レスポンシブモードのテーブルまたは固定ヘッダーがある場合、テーブルの水平スクロールバーがスクロールされると、列が左側に固定されます。詳しくは、固定列を参照してください。 |
注
- フィールドプロパティは、特に明記されていない限り、存在しない場合はデフォルトで
null
(falsey) になります。 class
、thClass
、tdClass
などは、VueLoader のディープセレクターを使用していない限り、スコープ付き CSS で定義されたクラスでは機能しません。 thStyle
でサポートされている構文については、Vue.js ガイドのクラスとスタイルのバインディングを参照してください。 - フィールド定義オブジェクトに追加された追加のプロパティはそのまま残ります。そのため、カスタムデータ、ヘッダー、およびフッターのレンダリング用の名前付きスコープ付きスロットからアクセスできます。
スコープ付きスロットとフォーマッタの使用方法については、以下のカスタムデータレンダリングのセクションを参照してください。
単純な配列とオブジェクト配列を自由に組み合わせてください
const fields = [
{ key: 'first_name', label: 'First' },
{ key: 'last_name', label: 'Last' },
'age',
'sex'
]
主キー
<b-table>
は、行を一意に識別するフィールドキーの名前を識別するために使用できる追加のプロップ primary-key
を提供します。
プライマリ列キーで指定された値は、string
または number
のいずれかでなければならず、テーブル内のすべての行で一意である必要があります。
プライマリキー列は、表示されるフィールドに表示する必要はありません。
テーブル行 ID の生成
指定すると、primary-key
は、各項目行の <tr>
要素に対して一意の ID を生成します。ID は {table-id}__row_{primary-key-value}
の形式になります。ここで、{table-id}
は <b-table>
の一意の ID であり、{primary-key-value}
は primary-key
で指定されたフィールドの項目のフィールド値の値です。
テーブルのレンダリングとトランジションの最適化
primary-key
は、Vue がテーブル行のレンダリングを最適化するのを支援するためにも <b-table>
によって使用されます。内部的には、primary-key
プロップで指定されたフィールドキーの値は、レンダリングされた各項目行の <tr>
要素の Vue の :key
値として使用されます。
レンダリングの問題 (つまり、項目データの変更時、またはデータがソート/フィルタリング/編集された際に、ツールチップが非表示になったり、予期しないサブコンポーネントの再利用が発生したりする場合) が発生している場合、またはテーブル行のトランジションが機能していない場合は、primary-key
プロップ (行ごとに一意の識別子がある場合) を設定すると、これらの問題を軽減できます。
primary-key
列の指定は、サードパーティのテーブルトランジションやドラッグアンドドロッププラグインを使用している場合に便利です。これらは、行ごとに一貫性のある一意の :key
値を持つことに依存しているためです。
primary-key
が指定されていない場合、<b-table>
は、表示される行のインデックス番号 (つまり、表示されたテーブル行での位置) に基づいてキーを自動生成します。これにより、以前の結果でレンダリングされているサブコンポーネント/要素 (つまり、Vue のレンダリングパッチ最適化ルーチンによって再利用されている) など、GUI の問題が発生する可能性があります。primary-key
列を指定すると、この問題を軽減できます (または、カスタムフォーマットされたフィールドスロットの要素/コンポーネントに一意の :key
を配置できます)。
詳細については、テーブル本体のトランジションのサポートのセクションを参照してください。
テーブルスタイルのオプション
テーブルのスタイリング
<b-table>
は、テーブルのスタイルを変更するためのいくつかのプロップを提供します
プロップ | 型 | 説明 |
striped | ブール値 | <tbody> 内のテーブル行にストライプを適用します |
bordered | ブール値 | テーブルとセルのすべての辺に境界線を適用します。 |
borderless | ブール値 | テーブルから内側の境界線を削除します。 |
outlined | ブール値 | テーブルのすべての辺に細い境界線を適用します。bordered が設定されている場合は効果がありません。 |
small | ブール値 | セルのパディングを半分にすることで、テーブルをよりコンパクトにします。 |
hover | ブール値 | <tbody> 内のテーブル行でホバー強調表示状態を有効にします |
dark | ブール値 | 色を反転します - 暗い背景に明るいテキストを使用します (Bootstrap v4 クラス .table-dark と同等) |
fixed | ブール値 | 等しい固定幅の列を持つテーブルを生成します (table-layout: fixed; ) |
responsive | 真偽値または文字列 | 水平方向にスクロールできるように、レスポンシブテーブルを生成します。常にレスポンシブテーブルにするには true に設定するか、'sm' 、'md' 、'lg' 、または 'xl' のいずれかのブレークポイントに設定して、テーブルをブレークポイントよりも小さい画面でのみレスポンシブ (水平方向にスクロール) にします。詳しくは、以下のレスポンシブテーブルを参照してください。 |
sticky-header | 真偽値または文字列 | 固定ヘッダー付きの垂直スクロール可能なテーブルを生成します。固定ヘッダーを有効にするには true に設定するか (デフォルトのテーブルの最大高さは 300px )、300px 以外の最大高さを指定するには、高さ (CSS ユニット付き) を含む文字列に設定します。詳しくは、以下の固定ヘッダーのセクションを参照してください。 |
stacked | 真偽値または文字列 | レスポンシブスタックテーブルを生成します。常にスタックテーブルにするには true に設定するか、'sm' 、'md' 、'lg' 、または 'xl' のいずれかのブレークポイントに設定して、テーブルをブレークポイントよりも小さい画面でのみ視覚的にスタックします。詳しくは、以下のスタックテーブルを参照してください。 |
caption-top | ブール値 | テーブルにキャプションがあり、このプロップが true に設定されている場合、キャプションはテーブルの上に視覚的に配置されます。false (デフォルト) の場合、キャプションはテーブルの下に視覚的に配置されます。 |
table-variant | 文字列 | テーブル全体にテーマカラーのバリアントを付与します。 |
head-variant | 文字列 | 'light' または 'dark' を使用して、テーブルヘッダーをそれぞれライトグレーまたはダークグレーで表示します |
foot-variant | 文字列 | 'light' または 'dark' を使用して、テーブルフッターをそれぞれライトグレーまたはダークグレーで表示します。設定しない場合、head-variant が使用されます。foot-clone が設定されていない場合は効果がありません |
foot-clone | ブール値 | テーブルフッターをオンにし、テーブルヘッダーと同じ内容をデフォルトとします |
no-footer-sorting | ブール値 | foot-clone が true でテーブルがソート可能な場合、フッターヘッダーセルでのソートアイコンとクリック動作を無効にします。詳しくは、以下のソートのセクションを参照してください。 |
no-border-collapse | ブール値 | テーブルの境界線のデフォルトの折り畳みを無効にします。主に固定ヘッダーや固定列で使用します。状況によっては二重の境界線のように見えることがあります。 |
注意: テーブルスタイルのオプションであるfixed
、stacked
、caption-top
、no-border-collapse
、固定ヘッダー、固定列、およびテーブルのソート機能は、すべてBootstrapVueのカスタムCSSが必要です。
例: 基本的なテーブルスタイル
<template>
<div>
<b-form-group label="Table Options" label-cols-lg="2" v-slot="{ ariaDescribedby }">
<b-form-checkbox v-model="striped" :aria-describedby="ariaDescribedby" inline>Striped</b-form-checkbox>
<b-form-checkbox v-model="bordered" :aria-describedby="ariaDescribedby" inline>Bordered</b-form-checkbox>
<b-form-checkbox v-model="borderless" :aria-describedby="ariaDescribedby" inline>Borderless</b-form-checkbox>
<b-form-checkbox v-model="outlined" :aria-describedby="ariaDescribedby" inline>Outlined</b-form-checkbox>
<b-form-checkbox v-model="small" :aria-describedby="ariaDescribedby" inline>Small</b-form-checkbox>
<b-form-checkbox v-model="hover" :aria-describedby="ariaDescribedby" inline>Hover</b-form-checkbox>
<b-form-checkbox v-model="dark" :aria-describedby="ariaDescribedby" inline>Dark</b-form-checkbox>
<b-form-checkbox v-model="fixed" :aria-describedby="ariaDescribedby" inline>Fixed</b-form-checkbox>
<b-form-checkbox v-model="footClone" :aria-describedby="ariaDescribedby" inline>Foot Clone</b-form-checkbox>
<b-form-checkbox v-model="noCollapse" :aria-describedby="ariaDescribedby" inline>No border collapse</b-form-checkbox>
</b-form-group>
<b-form-group label="Head Variant" label-cols-lg="2" v-slot="{ ariaDescribedby }">
<b-form-radio-group
v-model="headVariant"
:aria-describedby="ariaDescribedby"
class="mt-lg-2"
>
<b-form-radio :value="null" inline>None</b-form-radio>
<b-form-radio value="light" inline>Light</b-form-radio>
<b-form-radio value="dark" inline>Dark</b-form-radio>
</b-form-radio-group>
</b-form-group>
<b-form-group label="Table Variant" label-for="table-style-variant" label-cols-lg="2">
<b-form-select
id="table-style-variant"
v-model="tableVariant"
:options="tableVariants"
>
<template #first>
<option value="">-- None --</option>
</template>
</b-form-select>
</b-form-group>
<b-table
:striped="striped"
:bordered="bordered"
:borderless="borderless"
:outlined="outlined"
:small="small"
:hover="hover"
:dark="dark"
:fixed="fixed"
:foot-clone="footClone"
:no-border-collapse="noCollapse"
:items="items"
:fields="fields"
:head-variant="headVariant"
:table-variant="tableVariant"
></b-table>
</div>
</template>
<script>
export default {
data() {
return {
fields: ['first_name', 'last_name', 'age'],
items: [
{ age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
{ age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{ age: 89, first_name: 'Geneva', last_name: 'Wilson' }
],
tableVariants: [
'primary',
'secondary',
'info',
'danger',
'warning',
'success',
'light',
'dark'
],
striped: false,
bordered: false,
borderless: false,
outlined: false,
small: false,
hover: false,
dark: false,
fixed: false,
footClone: false,
headVariant: null,
tableVariant: '',
noCollapse: false
}
}
}
</script>
行のスタイリングと属性
また、tbody-tr-class
プロパティを使用してすべての行をスタイル設定したり、必要に応じてtbody-tr-attr
プロパティを介して追加の属性を指定したりできます。
プロパティ | 型 | 説明 |
tbody-tr-class | 文字列、配列、または関数 | テーブルのすべての行に適用されるクラス。関数が指定された場合、tbodyTrClass( item, type ) として呼び出され、Array 、Object 、またはString を返すことができます。 |
tbody-tr-attr | オブジェクトまたは関数 | テーブルのすべての行に適用される属性。関数が指定された場合、tbodyTrAttr( item, type ) として呼び出され、Object を返す必要があります。 |
tbody-tr-class
またはtbody-tr-attr
に関数参照を渡す場合、関数の引数は次のようになります。
item
- 行に関連付けられた項目レコードデータ。項目レコードに関連付けられていない行の場合、この値はnull
またはundefined
になります。 type
- レンダリングされる行のタイプ。項目行の場合は'row'
、項目詳細行の場合は'row-details'
、固定行トップ スロットの場合は'row-top'
、固定行ボトム スロットの場合は'row-bottom'
、テーブルビジー スロットの場合は'table-busy'
です。
例: 基本的な行スタイル
<template>
<div>
<b-table :items="items" :fields="fields" :tbody-tr-class="rowClass"></b-table>
</div>
</template>
<script>
export default {
data() {
return {
fields: ['first_name', 'last_name', 'age'],
items: [
{ age: 40, first_name: 'Dickerson', last_name: 'Macdonald', status: 'awesome' },
{ age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{ age: 89, first_name: 'Geneva', last_name: 'Wilson' }
]
}
},
methods: {
rowClass(item, type) {
if (!item || type !== 'row') return
if (item.status === 'awesome') return 'table-success'
}
}
}
</script>
レスポンシブテーブル
レスポンシブテーブルを使用すると、テーブルを簡単に水平方向にスクロールできます。responsive
プロパティをtrue
に設定することで、すべてのビューポートでテーブルをレスポンシブにできます。または、responsive
プロパティをブレークポイント値(sm
、md
、lg
、またはxl
)のいずれかに設定することで、レスポンシブテーブルにする最大ブレークポイントを選択します。
例: 常にレスポンシブなテーブル
<template>
<div>
<b-table responsive :items="items"></b-table>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{
heading1: 'table cell',
heading2: 'table cell',
heading3: 'table cell',
heading4: 'table cell',
heading5: 'table cell',
heading6: 'table cell',
heading7: 'table cell',
heading8: 'table cell',
heading9: 'table cell',
heading10: 'table cell',
heading11: 'table cell',
heading12: 'table cell'
},
{
heading1: 'table cell',
heading2: 'table cell',
heading3: 'table cell',
heading4: 'table cell',
heading5: 'table cell',
heading6: 'table cell',
heading7: 'table cell',
heading8: 'table cell',
heading9: 'table cell',
heading10: 'table cell',
heading11: 'table cell',
heading12: 'table cell'
},
{
heading1: 'table cell',
heading2: 'table cell',
heading3: 'table cell',
heading4: 'table cell',
heading5: 'table cell',
heading6: 'table cell',
heading7: 'table cell',
heading8: 'table cell',
heading9: 'table cell',
heading10: 'table cell',
heading11: 'table cell',
heading12: 'table cell'
}
]
}
}
}
</script>
レスポンシブテーブルの注意点
- 垂直方向のクリッピング/切り捨ての可能性。レスポンシブテーブルは
overflow-y: hidden
を使用しており、テーブルの下端または上端を超えるコンテンツは切り捨てられます。特に、ドロップダウンメニューやその他のサードパーティのウィジェットが切り取られる可能性があります。 responsive
とfixed
のプロパティを一緒に使用すると、期待どおりに動作しません。固定テーブルレイアウトは、最初の行(この場合はテーブルヘッダー)を使用して、各列(およびテーブル全体の幅)に必要な幅を計算し、親コンテナの幅内に収まるようにします。このとき、<tbody>
内のセルは考慮されないため、レスポンシブではないテーブルになる可能性があります。この制限を回避するには、次のいずれかの方法で列(または特定の列)の幅を指定する必要があります。
スタックテーブル
レスポンシブテーブルの代替として、BootstrapVueには、視覚的に積み重ねられた形式でテーブルをレンダリングできるスタックテーブルオプション(カスタムSCSS/CSSを使用)が含まれています。stacked
プロパティをtrue
に設定することで、すべてのビューポートでテーブルをスタック表示にできます。または、stacked
プロパティをブレークポイント値'sm'
、'md'
、'lg'
、または'xl'
のいずれかに設定することで、テーブルが通常のテーブル形式に戻るブレークポイントを設定することもできます。
列ヘッダーラベルは、CSS ::before
疑似要素を使用して、各フィールド値の左側に40%の幅でレンダリングされます。
stacked
プロパティは、sticky-header
プロパティと、stickyColumn
フィールド定義プロパティよりも優先されます。
例: 常にスタックされるテーブル
<template>
<div>
<b-table stacked :items="items"></b-table>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
{ age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{ age: 89, first_name: 'Geneva', last_name: 'Wilson' }
]
}
}
}
</script>
注意: テーブルが視覚的にスタックされている場合
- テーブルヘッダー(およびテーブルフッター)は非表示になります。
- カスタムレンダリングされたヘッダースロットは表示されず、代わりにフィールドの
label
が使用されます。 - テーブルは、レンダリングされたフィールドラベルをクリックしてソートすることはできません。ソートするフィールドとソート方向を選択するための外部コントロールを提供する必要があります。ソートコントロールの詳細については、以下のソートセクションを参照してください。また、フォームコントロールを使用したソートの制御例については、このページの下部にある完全な例を参照してください。
- スロット
top-row
とbottom-row
は、視覚的にスタックされている場合は非表示になります。 - テーブルキャプションが提供されている場合、視覚的にスタックされているときは常にテーブルの上部に表示されます。
- 常にスタックされたテーブルでは、テーブルヘッダーとフッター、および固定された上部と下部の行スロットはレンダリングされません。
スタックテーブルをサポートするには、BootstrapVueのカスタムCSSが必要です。
テーブルキャプション
プロパティcaption
または名前付きスロットtable-caption
を使用して、オプションのキャプションをテーブルに追加します(スロットはプロパティよりも優先されます)。デフォルトのBootstrap v4スタイルでは、キャプションはテーブルの下部に配置されます。
<template>
<div>
<b-table :items="items" :fields="fields">
<template #table-caption>This is a table caption.</template>
</b-table>
</div>
</template>
<script>
export default {
data() {
return {
fields: ['first_name', 'last_name', 'age'],
items: [
{ age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
{ age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{ age: 89, first_name: 'Geneva', last_name: 'Wilson' }
]
}
}
}
</script>
caption-top
プロパティをtrue
に設定することで、キャプションをテーブルの上部に配置できます。
<template>
<div>
<b-table :items="items" :fields="fields" caption-top>
<template #table-caption>This is a table caption at the top.</template>
</b-table>
</div>
</template>
<script>
export default {
data() {
return {
fields: ['first_name', 'last_name', 'age'],
items: [
{ age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
{ age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{ age: 89, first_name: 'Geneva', last_name: 'Wilson' }
]
}
}
}
</script>
また、カスタムCSSを使用して、キャプションの配置を制御することもできます。
テーブルcolgroup
名前付きスロットtable-colgroup
を使用して、テーブル列のオプションのグループ化とスタイリングのための<colgroup>
および<col>
要素を指定します。<col>
要素で利用可能なスタイルは制限されていることに注意してください。<colgroup>
の詳細と使用法については、MDNを参照してください。
スロットtable-colgroup
は、オプションでスコープされ、次のプロパティを持つオブジェクトを受け取ることができます。
プロパティ | 型 | 説明 |
columns | 数値 | レンダリングされたテーブルの列数 |
fields | 配列 | フィールド定義オブジェクトの配列(オブジェクトの配列形式に正規化) |
提供されている場合、table-colgroup
スロットの内容は、<colgroup>
要素内に配置されます。独自の外部<colgroup>
要素を提供する必要はありません。テーブル列のシリーズを支援技術上の理由でグループ化する必要がある場合(論理的な列の関連付けを伝えるため)、<col span="#">
要素(#
をグループ化された列の数に置き換えたもの)を使用して、列のシリーズをグループ化します。
ヒント: <col>
要素のstyle
またはclass
を介して列の幅を設定しようとする場合、テーブルをfixed
ヘッダー幅(テーブル固定レイアウトモード)モードにし、responsive
(水平スクロール)モードと組み合わせると役立つ場合があります。ただし、各列の<col>
要素に対応するスタイルまたはクラスを介して、明示的な幅または最小幅を設定する必要があります。例:
<b-table fixed responsive :items="items" :fields="fields" ... >
<template #table-colgroup="scope">
<col
v-for="field in scope.fields"
:key="field.key"
:style="{ width: field.key === 'foo' ? '120px' : '180px' }"
>
</template>
</b-table>
テーブルのビジー状態
<b-table>
は、テーブルがビジー状態であることを示す busy
プロパティを提供します。アイテムを更新する直前に true
に設定し、アイテムを取得したら false
に設定します。ビジー状態の場合、テーブルには属性 aria-busy="true"
が設定されます。
ビジー状態の間、テーブルは「ミュート」された外観(opacity: 0.6
)でレンダリングされ、次のカスタムCSSが使用されます。
table.b-table[aria-busy='true'] {
opacity: 0.6;
}
このスタイルは、独自のCSSを使用して上書きできます。
必要に応じて、テーブルのビジー状態が true
のときにカスタムのローディングメッセージまたはスピナーを表示するために、table-busy
スロットを提供できます。スロットは、クラス b-table-busy-slot
を持つ <tr>
要素に配置され、フィールド数に設定された colspan
を持つ単一の <td>
が含まれます。
table-busy
スロットの使用例
<template>
<div>
<b-button @click="toggleBusy">Toggle Busy State</b-button>
<b-table :items="items" :busy="isBusy" class="mt-3" outlined>
<template #table-busy>
<div class="text-center text-danger my-2">
<b-spinner class="align-middle"></b-spinner>
<strong>Loading...</strong>
</div>
</template>
</b-table>
</div>
</template>
<script>
export default {
data() {
return {
isBusy: false,
items: [
{ first_name: 'Dickerson', last_name: 'MacDonald', age: 40 },
{ first_name: 'Larsen', last_name: 'Shaw', age: 21 },
{ first_name: 'Geneva', last_name: 'Wilson', age: 89 },
{ first_name: 'Jami', last_name: 'Carney', age: 38 }
]
}
},
methods: {
toggleBusy() {
this.isBusy = !this.isBusy
}
}
}
</script>
また、アイテムプロバイダー関数の使用 で、busy
状態に関する追加情報も参照してください。
注
- テーブルが
busy
状態の場合、すべてのクリック関連イベント、ホバーイベント、およびソート変更イベントは発生しません。 - ビジースタイルとスロットは、
<b-table-lite>
コンポーネントでは使用できません。
カスタムデータレンダリング
行内の各データフィールドのカスタムレンダリングは、スコープ付きスロット、フォーマッターコールバック関数、または両方の組み合わせを使用して可能です。
スコープ付きフィールドスロット
スコープ付きフィールドスロットを使用すると、レコードデータの表示方法をより詳細に制御できます。スコープ付きスロットを使用して、特定のフィールドのカスタムレンダリングを提供できます。レコードに存在しない追加のフィールドを追加する場合は、fields
配列に追加し、スコープ付きスロットでフィールドを参照します。スコープ付きフィールドスロットは、次の命名構文を使用します。'cell(' + field key + ')'
。
明示的なスコープ付きスロットが提供されていないセルをフォーマットするために、デフォルトのフォールバックスコープ付きスロット 'cell()'
を使用できます。
例:スコープ付きスロットを使用したカスタムデータレンダリング
<template>
<div>
<b-table small :fields="fields" :items="items" responsive="sm">
<template #cell(index)="data">
{{ data.index + 1 }}
</template>
<template #cell(name)="data">
<b class="text-info">{{ data.value.last.toUpperCase() }}</b>, <b>{{ data.value.first }}</b>
</template>
<template #cell(nameage)="data">
{{ data.item.name.first }} is {{ data.item.age }} years old
</template>
<template #cell()="data">
<i>{{ data.value }}</i>
</template>
</b-table>
</div>
</template>
<script>
export default {
data() {
return {
fields: [
'index',
{ key: 'name', label: 'Full Name' },
'age',
'sex',
{ key: 'nameage', label: 'First name and age' }
],
items: [
{ name: { first: 'John', last: 'Doe' }, sex: 'Male', age: 42 },
{ name: { first: 'Jane', last: 'Doe' }, sex: 'Female', age: 36 },
{ name: { first: 'Rubin', last: 'Kincade' }, sex: 'Male', age: 73 },
{ name: { first: 'Shirley', last: 'Partridge' }, sex: 'Female', age: 62 }
]
}
}
}
</script>
スロットのスコープ変数(上記の例では data
)には、次のプロパティがあります。
プロパティ | 型 | 説明 |
index | 数値 | 表示されている行に対する行番号(0から始まるインデックス) |
item | オブジェクト | この行の生のレコードデータ全体(つまり、items[index] )(フォーマッターが適用される前) |
value | 任意 | レコード内のこのキーの値(仮想列の場合はnull またはundefined )、またはフィールドのformatter 関数の出力 |
unformatted | 任意 | アイテムレコード内のこのキーの生の値を(仮想列の場合はnull またはundefined )、フィールドのformatter 関数に渡される前 |
field | オブジェクト | フィールドの正規化されたフィールド定義オブジェクト |
detailsShowing | ブール値 | 行の row-details スコープ付きスロットが表示されている場合は true になります。詳細については、以下の 行の詳細サポート セクションを参照してください。 |
toggleDetails | 関数 | 行の row-details スコープ付きスロットの表示/非表示を切り替えるために呼び出すことができます。詳細については、以下の 行の詳細サポート セクションを参照してください。 |
rowSelected | ブール値 | 行が選択されている場合は true になります。詳細については、行の選択サポート セクションを参照してください。 |
selectRow | 関数 | 呼び出されると、現在の行を選択します。詳細については、行の選択サポート セクションを参照してください。 |
unselectRow | 関数 | 呼び出されると、現在の行の選択を解除します。詳細については、行の選択サポート セクションを参照してください。 |
注
index
は、フィルター処理、ソート、およびページネーションが元のテーブルデータに適用された後に計算されるため、常に実際の行のインデックス番号になるとは限りません。index
値は、表示されている行番号を参照します。この番号は、オプションのv-model
バインドされた変数のインデックスと一致します。 - 新しい Vue 2.6 の
v-slot
構文を使用する場合、スロット名にスペースを含めることはできません。また、ブラウザ内 DOM テンプレートを使用する場合、スロット名は常に小文字になります。これを回避するには、Vueの動的スロット名を使用してスロット名を渡すことができます。
生のHTMLの表示
デフォルトでは、b-table
はアイテムデータとフォーマッター関数の結果に含まれるHTMLタグをエスケープします。b-table
で生のHTMLコードを表示する必要がある場合は、スコープ付きフィールドスロット内の要素でv-html
ディレクティブを使用する必要があります。
<template>
<div>
<b-table :items="items">
<template #cell(html)="data">
<span v-html="data.value"></span>
</template>
</b-table>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{
text: 'This is <i>escaped</i> content',
html: 'This is <i>raw <strong>HTML</strong></i> <span style="color:red">content</span>'
}
]
}
}
}
</script>
警告: v-html
メソッドを使用してユーザーが提供したコンテンツを表示する場合は、アプリケーションがXSS攻撃に対して脆弱になる可能性があるため注意が必要です。最初にユーザーが提供した文字列をサニタイズしない場合。
オプションで、フォーマッターコールバック関数を使用してフィールド出力をカスタマイズできます。これを有効にするには、フィールドの formatter
プロパティを使用します。このプロパティの値は、文字列または関数参照にすることができます。文字列値の場合、関数は親コンポーネントのメソッドで定義する必要があります。formatter
を Function
として提供する場合は、this
コンテキストにバインドされていない限り、グローバルスコープ(ウィンドウ、またはVueでのグローバルミックスイン、または匿名関数として)で宣言する必要があります。
コールバック関数は、value
、key
、および item
の3つの引数を受け取り、フォーマットされた値を文字列として返す必要があります(HTML文字列はサポートされていません)。
例:フォーマッターコールバック関数を使用したカスタムデータレンダリング
<template>
<div>
<b-table :fields="fields" :items="items">
<template #cell(name)="data">
<a :href="`#${data.value.replace(/[^a-z]+/i,'-').toLowerCase()}`">{{ data.value }}</a>
</template>
</b-table>
</div>
</template>
<script>
export default {
data() {
return {
fields: [
{
key: 'name',
label: 'Full Name',
formatter: 'fullName'
},
'age',
{
key: 'sex',
formatter: value => {
return value.charAt(0).toUpperCase()
}
},
{
key: 'birthYear',
label: 'Calculated Birth Year',
formatter: (value, key, item) => {
return new Date().getFullYear() - item.age
}
}
],
items: [
{ name: { first: 'John', last: 'Doe' }, sex: 'Male', age: 42 },
{ name: { first: 'Jane', last: 'Doe' }, sex: 'Female', age: 36 },
{ name: { first: 'Rubin', last: 'Kincade' }, sex: 'male', age: 73 },
{ name: { first: 'Shirley', last: 'Partridge' }, sex: 'female', age: 62 }
]
}
},
methods: {
fullName(value) {
return `${value.first} ${value.last}`
}
}
}
</script>
テーブルの thead
および tfoot
要素のカスタムレンダリングを提供することも可能です。デフォルトでは、foot-clone
が true
に設定されていない限り、テーブルフッターはレンダリングされないことに注意してください。
ヘッダーおよびフッターセル用のスコープ付きスロットは、'head(<fieldkey>)'
および 'foot(<fieldkey>)'
の特別な命名規則を使用します。フィールドの 'foot(...)'
スロットが提供されていないが、'head(...)'
スロットが提供されている場合、フッターは 'head(...)'
スロットのコンテンツを使用します。
明示的なスコープ付きスロットが提供されていないヘッダーまたはフッターセルをフォーマットするために、デフォルトのフォールバックスコープ付きスロット 'head()'
または 'foot()'
を使用できます。
<template>
<div>
<b-table :fields="fields" :items="items" foot-clone>
<template #cell(name)="data">
{{ data.value.first }} {{ data.value.last }}
</template>
<template #head(name)="data">
<span class="text-info">{{ data.label.toUpperCase() }}</span>
</template>
<template #foot(name)="data">
<span class="text-danger">{{ data.label }}</span>
</template>
<template #foot()="data">
<i>{{ data.label }}</i>
</template>
</b-table>
</div>
</template>
<script>
export default {
data() {
return {
fields: [
{ key: 'name', label: 'Full Name' },
'age',
'sex'
],
items: [
{ name: { first: 'John', last: 'Doe' }, sex: 'Male', age: 42 },
{ name: { first: 'Jane', last: 'Doe' }, sex: 'Female', age: 36 },
{ name: { first: 'Rubin', last: 'Kincade' }, sex: 'Male', age: 73 },
{ name: { first: 'Shirley', last: 'Partridge' }, sex: 'Female', age: 62 }
]
}
}
}
</script>
スロットはオプションでスコープ設定可能であり(上記の例では data
)、次のプロパティを持ちます。
プロパティ | 型 | 説明 |
column | 文字列 | フィールドのkey 値 |
field | オブジェクト | フィールドのオブジェクト(fields プロパティから) |
label | 文字列 | フィールドのラベル値(data.field.label としても利用可能) |
selectAllRows | メソッド | selectable モードの場合、すべての行を選択します。 |
clearSelected | メソッド | selectable モードの場合、すべての行の選択を解除します。 |
head(...)
または foot(...)
スロット内に入力、ボタン、選択、またはリンクを配置する場合、入力、選択、テキストエリアがクリックされたときに(無効にされていない限り)head-clicked
イベントは発生しません。スコープ付きスロット内のリンクまたはボタンをクリックしても、head-clicked
は(無効になっている場合でも)発生しません。
注
- 新しい Vue 2.6 の
v-slot
構文を使用する場合、スロット名にスペースを含めることはできません。また、ブラウザ内 DOM テンプレートを使用する場合、スロット名は常に小文字になります。これを回避するには、Vueの動的スロット名を使用してスロット名を渡すことができます。
ヘッダーに行を追加する場合は、thead-top
スロットを使用します。このスロットはヘッダーセルの行の前に挿入され、<tr>..</tr>
タグで自動的にカプセル化されません。ネイティブブラウザのテーブル子要素ではなく、BootstrapVue テーブルヘルパーコンポーネントを使用することをお勧めします。
<template>
<div>
<b-table
:items="items"
:fields="fields"
responsive="sm"
>
<template #thead-top="data">
<b-tr>
<b-th colspan="2"><span class="sr-only">Name and ID</span></b-th>
<b-th variant="secondary">Type 1</b-th>
<b-th variant="primary" colspan="3">Type 2</b-th>
<b-th variant="danger">Type 3</b-th>
</b-tr>
</template>
</b-table>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ name: 'Stephen Hawking', id: 1, type1: false, type2a: true, type2b: false, type2c: false, type3: false },
{ name: 'Johnny Appleseed', id: 2, type1: false, type2a: true, type2b: true, type2c: false, type3: false },
{ name: 'George Washington', id: 3, type1: false, type2a: false, type2b: false, type2c: false, type3: true },
{ name: 'Albert Einstein', id: 4, type1: true, type2a: false, type2b: false, type2c: true, type3: false },
{ name: 'Isaac Newton', id: 5, type1: true, type2a: true, type2b: false, type2c: true, type3: false },
],
fields: [
'name',
{ key: 'id', label: 'ID' },
{ key: 'type1', label: 'Type 1' },
{ key: 'type2a', label: 'Type 2A' },
{ key: 'type2b', label: 'Type 2B' },
{ key: 'type2c', label: 'Type 2C' },
{ key: 'type3', label: 'Type 3' }
]
}
}
}
</script>
スロット thead-top
は、オプションでスコープ設定可能であり、次のプロパティを持つオブジェクトを受け取ります。
プロパティ | 型 | 説明 |
columns | 数値 | レンダリングされたテーブルの列数 |
fields | 配列 | フィールド定義オブジェクトの配列(オブジェクトの配列形式に正規化されています) |
selectAllRows | メソッド | selectable モードの場合、すべての行を選択します。 |
clearSelected | メソッド | selectable モードの場合、すべての行の選択を解除します。 |
<tfoot>
のコンテンツのレイアウトをより詳細に制御する必要がある場合は、オプションでスコープ設定可能なスロット custom-foot
を使用して、独自の行とセルを提供できます。BootstrapVue のテーブルヘルパーサブコンポーネント <b-tr>
、<b-th>
、および <b-td>
を使用して、カスタムフッターレイアウトを生成します。
スロット custom-foot
は、オプションでスコープ設定可能であり、次のプロパティを持つオブジェクトを受け取ります。
プロパティ | 型 | 説明 |
columns | 数値 | レンダリングされたテーブルの列数 |
fields | 配列 | フィールド定義オブジェクトの配列(オブジェクトの配列形式に正規化されています) |
items | 配列 | フィルタリング、ソート、ページネーション後の、現在表示されているアイテムレコードの配列 |
注
custom-foot
スロットは、foot-clone
プロパティが設定されている場合、レンダリングされません。 head-clicked
イベントは、custom-foot
セルをクリックしても発行されません。 - ソートとソートアイコンは、
custom-foot
スロットのセルでは利用できません。 - カスタムフッターは、テーブルが視覚的にスタックモードの場合には表示されません。
スロットによるカスタムの空とフィルタリングされた空のレンダリング
empty-text
、empty-filtered-text
、empty-html
、および empty-filtered-html
を使用する以外に、名前付きスロットを使用して、表示するデータがないテーブルのカスタムレンダリングを提供することも可能です。
これらのスロットを表示するには、show-empty
属性を設定する必要があり、items
は偽の値または長さ 0 の配列である必要があります。
<div>
<b-table :fields="fields" :items="items" show-empty>
<template #empty="scope">
<h4>{{ scope.emptyText }}</h4>
</template>
<template #emptyfiltered="scope">
<h4>{{ scope.emptyFilteredText }}</h4>
</template>
</b-table>
</div>
スロットはオプションでスコープ付きにできます。スロットのスコープ(上記の例の scope
)には、次のプロパティがあります。
プロパティ | 型 | 説明 |
emptyHtml | 文字列 | empty-html プロパティ |
emptyText | 文字列 | empty-text プロパティ |
emptyFilteredHtml | 文字列 | empty-filtered-html プロパティ |
emptyFilteredText | 文字列 | empty-filtered-text プロパティ |
fields | 配列 | fields プロパティ |
items | 配列 | items プロパティ。nullと[]をチェックするためにここに公開されています。 |
高度な機能
sticky-header
プロパティを使用して、テーブル本体がスクロールするときにヘッダーが固定されたままになる(スティッキー)垂直スクロールテーブルを有効にします。プロパティを true
(または明示的な値なし)に設定すると、最大高さが 300px
のテーブルが生成されます。300px
以外の最大高さを指定するには、sticky-header
プロパティを有効な CSS 高さ(単位を含む)、つまり sticky-header="200px"
に設定します。sticky-header
が有効になっているテーブルは、テーブルが利用可能な水平スペースよりも広い場合、responsive
プロパティ設定に関係なく、常に水平方向にレスポンシブになります。
<template>
<div>
<b-table sticky-header :items="items" head-variant="light"></b-table>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
{ heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
{ heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
{ heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
{ heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
{ heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
{ heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
{ heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
{ heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
{ heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
{ heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
{ heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' }
]
}
}
}
</script>
固定ヘッダーの注意事項
- テーブルに
stacked
プロパティが設定されている場合、sticky-header
プロパティは効果がありません。 - 固定ヘッダーテーブルは、最大高さが設定された垂直スクロール可能な
<div>
内にラップされます。 sticky-header
をサポートするには、BootstrapVue のカスタム CSS が必要です。 - Bootstrap v4 は、テーブル要素で CSS スタイル
border-collapse: collapsed
を使用します。これにより、固定ヘッダーの境界線がヘッダーに「くっつく」ことができなくなり、したがって、本体がスクロールすると境界線がスクロールします。この問題を回避するには、テーブルでプロパティ no-border-collapse
を設定します(これは、bordered
などの機能を使用すると、二重幅の境界線を引き起こす可能性があることに注意してください)。 - 固定ヘッダー機能は、見出しを配置するために CSS スタイル
position: sticky
を使用します。Internet Explorer は position: sticky
をサポートしていないため、IE 11 の場合、テーブルの見出しはテーブル本体と一緒にスクロールします。
固定列
列を固定にすることができます。テーブルに水平スクロールバーがある場合、テーブルの左側に固定されます。列を固定列にするには、フィールドのヘッダー定義で stickyColumn
プロパティを設定します。固定列は、テーブルに sticky-header
プロパティが設定されている場合、および/または responsive
プロパティが設定されている場合にのみ機能します。
例:固定列とヘッダー
<template>
<div>
<div class="mb-2">
<b-form-checkbox v-model="stickyHeader" inline>Sticky header</b-form-checkbox>
<b-form-checkbox v-model="noCollapse" inline>No border collapse</b-form-checkbox>
</div>
<b-table
:sticky-header="stickyHeader"
:no-border-collapse="noCollapse"
responsive
:items="items"
:fields="fields"
>
<template #head(id)="scope">
<div class="text-nowrap">Row ID</div>
</template>
<template #head()="scope">
<div class="text-nowrap">
Heading {{ scope.label }}
</div>
</template>
</b-table>
</div>
</template>
<script>
export default {
data() {
return {
stickyHeader: true,
noCollapse: false,
fields: [
{ key: 'id', stickyColumn: true, isRowHeader: true, variant: 'primary' },
'a',
'b',
{ key: 'c', stickyColumn: true, variant: 'info' },
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l'
],
items: [
{ id: 1, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
{ id: 2, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
{ id: 3, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
{ id: 4, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
{ id: 5, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
{ id: 6, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
{ id: 7, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
{ id: 8, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
{ id: 9, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
{ id: 10, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 }
]
}
}
}
</script>
固定列の注意事項
- テーブルに
stacked
プロパティが設定されている場合、固定列は効果がありません。 - 固定列テーブルには、
sticky-header
および/または responsive
モードのいずれかが必要で、水平スクロール可能な <div>
内にラップされます。 stickyColumn
として設定されている複数の列がある場合、列は視覚的に互いに積み重ねられ、左端の固定列は次の固定列の下から「のぞき見」する可能性があります。この動作を回避するには、後者の固定列が前の固定列と同じ幅またはそれよりも広いことを確認してください。 - Bootstrap v4 は、テーブル要素で CSS スタイル
border-collapse: collapsed
を使用します。これにより、固定列の境界線が列に「くっつく」ことができなくなり、したがって、本体がスクロールするとこれらの境界線がスクロールします。この問題を回避するには、テーブルでプロパティ no-border-collapse
を設定します(これは、bordered
などの機能を使用すると、二重幅の境界線を引き起こす可能性があることに注意してください)。 - 固定列をサポートするには、BootstrapVue のカスタム CSS が必要です。
- 固定列機能は、列セルを配置するために CSS スタイル
position: sticky
を使用します。Internet Explorer は position: sticky
をサポートしていないため、IE 11 の場合、固定列はテーブル本体と一緒にスクロールします。
行の詳細サポート
(フィールド定義配列で指定されていない列など)追加のレコード情報をオプションで表示したい場合は、特別なアイテムレコードのブール型プロパティ _showDetails
と組み合わせて、スコープ付きスロット row-details
を使用できます。
レコードの _showDetails
プロパティが true
に設定されており、かつ row-details
スコープ付きスロットが存在する場合、新しい行がアイテムのすぐ下に表示され、row-details
スコープ付きスロットのレンダリングされた内容が表示されます。
スコープ付きフィールドスロットで、フィールドのスコープ付きスロット変数に渡された toggleDetails
関数を呼び出すことで、行の row-details
スコープ付きスロットの表示/非表示を切り替えることができます。スコープ付きフィールドスロット変数 detailsShowing
を使用して、row-details
スロットの表示/非表示を判断できます。
注:アイテムデータで _showDetails
プロパティを直接操作する場合(つまり、toggleDetails
関数参照を使用しない場合)、_showDetails
は、その値の変更を適切にリアクティブに検出するために、アイテムデータに必ず存在している必要があります。詳細については、Vue のリアクティビティの制限を参照してください。
利用可能な row-details
スコープ付き変数プロパティ
プロパティ | 型 | 説明 |
item | オブジェクト | 行レコードデータオブジェクト全体 |
index | 数値 | 現在の表示行番号 |
fields | 配列 | 正規化されたフィールド定義配列(オブジェクトの配列形式) |
toggleDetails | 関数 | 行の詳細スロットの表示/非表示を切り替える関数 |
rowSelected | ブール値 | 行が選択されている場合は true になります。詳細については、行の選択サポート セクションを参照してください。 |
selectRow | 関数 | 呼び出されると、現在の行を選択します。詳細については、行の選択サポート セクションを参照してください。 |
unselectRow | 関数 | 呼び出されると、現在の行の選択を解除します。詳細については、行の選択サポート セクションを参照してください。 |
注:行選択に関連するスコーププロパティは、<b-table>
でのみ利用可能です。
次の例では、詳細の表示/非表示を切り替える2つの方法を示します。1つはボタンを使用し、もう1つはチェックボックスを使用します。また、3行目の詳細は、最初は詳細が表示されるようにデフォルト設定されています。
<template>
<div>
<b-table :items="items" :fields="fields" striped responsive="sm">
<template #cell(show_details)="row">
<b-button size="sm" @click="row.toggleDetails" class="mr-2">
{{ row.detailsShowing ? 'Hide' : 'Show'}} Details
</b-button>
<b-form-checkbox v-model="row.detailsShowing" @change="row.toggleDetails">
Details via check
</b-form-checkbox>
</template>
<template #row-details="row">
<b-card>
<b-row class="mb-2">
<b-col sm="3" class="text-sm-right"><b>Age:</b></b-col>
<b-col>{{ row.item.age }}</b-col>
</b-row>
<b-row class="mb-2">
<b-col sm="3" class="text-sm-right"><b>Is Active:</b></b-col>
<b-col>{{ row.item.isActive }}</b-col>
</b-row>
<b-button size="sm" @click="row.toggleDetails">Hide Details</b-button>
</b-card>
</template>
</b-table>
</div>
</template>
<script>
export default {
data() {
return {
fields: ['first_name', 'last_name', 'show_details'],
items: [
{ isActive: true, age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
{ isActive: false, age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{
isActive: false,
age: 89,
first_name: 'Geneva',
last_name: 'Wilson',
_showDetails: true
},
{ isActive: true, age: 38, first_name: 'Jami', last_name: 'Carney' }
]
}
}
}
</script>
行選択サポート
<b-table>
プロパティ selectable
を使用して、行を選択可能にすることができます。
ユーザーは、select-mode
プロパティを設定することにより、選択モードを簡単に変更できます。
'multi'
:クリックするたびに、行が選択/選択解除されます(デフォルトモード) 'single'
:一度に1つの行のみを選択できます 'range'
:クリックした行はすべて選択され、その他の行はすべて選択解除されます。Shift + クリックで行範囲を選択し、Ctrl(または Cmd)+ クリックで選択した行を切り替えます。
テーブルが selectable
で、ユーザーが行をクリックすると、<b-table>
は、選択された項目の完全なリストである単一の引数を渡して、row-selected
イベントを発行します。この引数は読み取り専用として扱ってください。
行は、<b-table>
インスタンスで公開されている次のメソッドを介して(つまり、this.$refs
を介してテーブルインスタンスへの参照を介して)プログラムで選択および選択解除することもできます。
メソッド | 説明 |
selectRow(index) | 指定された index 番号で行を選択します。 |
unselectRow(index) | 指定された index 番号で行の選択を解除します。 |
selectAllRows() | テーブルのすべての行を選択します。ただし、single モードでは、最初の行のみが選択されます。 |
clearSelected() | すべての行の選択を解除します。 |
isRowSelected(index) | 指定された index の行が選択されている場合は true を返し、それ以外の場合は false を返します。 |
プログラムによる行選択の注意事項
index
は、フィルタリング、ソート、およびページネーションが適用された後のテーブルの表示行のゼロベースのインデックスです。 single
モードでは、selectRow(index)
は以前に選択した行の選択を解除します。 - 存在しない行で
selectRow(index)
または unselectRow(index)
を試行しても無視されます。 - これらのメソッドを有効にするには、テーブルが
selectable
である必要があります。 no-select-on-click
プロパティを設定することで、クリックイベントによる行の選択を無効にできます。その後、行はプログラムによってのみ選択可能になります。
行選択に関する注意事項
- ソート、フィルタリング、またはページネーションを行うと、アクティブな選択がクリアされます。必要に応じて、
row-selected
イベントが空の配列([]
)とともに発行されます。 - テーブルが
selectable
モードの場合、すべてのデータアイテムの<tr>
要素は、アクセシビリティのために、ドキュメントのタブシーケンス(tabindex="0"
)に含まれ、行の選択状態に応じて、aria-selected
属性が'true'
または'false'
に設定されます。 - テーブルが
selectable
の場合、テーブルには、single
モードの場合は'false'
、multi
またはrange
モードの場合は'true'
のいずれかに設定されたaria-multiselect
属性が設定されます。
<b-table>
が選択可能な場合、b-table-selectable
クラスを持ち、使用されているモードに応じて、<table>
要素に次の3つのクラスのいずれかが設定されます。
b-table-select-single
b-table-select-multi
b-table-select-range
少なくとも1つの行が選択されている場合、b-table-selecting
クラスが<table>
要素でアクティブになります。選択された行には、<tr>
要素にb-table-row-selected
クラスが適用されます。
選択された行にBootstrapテーマの色を適用するには、prop selected-variant
を使用します。ただし、BootstrapのCSSでテーブルのバリアントが定義される順序により、row-variantはselected-variant
よりも優先される可能性があります。selected-variant
を空の文字列に設定すると、行が選択されていることを伝えるための他の手段(以下の例のようにスコープ付きフィールドスロットなど)を使用できます。
selected-variant
は、標準(またはカスタム)Bootstrapベースカラーバリアント、または特定の行やセルバリアントよりも優先される特別なテーブルのactive
バリアント(デフォルト)のいずれかです。
アクセシビリティ上の理由(特に色覚異常のユーザーや色のコントラストの問題があるユーザーの場合)、以下に示す例のように、仮想列など、行が選択されていることを示す他の視覚的な手段を常に提供することを強くお勧めします。
<template>
<div>
<b-form-group
label="Selection mode:"
label-for="table-select-mode-select"
label-cols-md="4"
>
<b-form-select
id="table-select-mode-select"
v-model="selectMode"
:options="modes"
class="mb-3"
></b-form-select>
</b-form-group>
<b-table
:items="items"
:fields="fields"
:select-mode="selectMode"
responsive="sm"
ref="selectableTable"
selectable
@row-selected="onRowSelected"
>
<template #cell(selected)="{ rowSelected }">
<template v-if="rowSelected">
<span aria-hidden="true">✓</span>
<span class="sr-only">Selected</span>
</template>
<template v-else>
<span aria-hidden="true"> </span>
<span class="sr-only">Not selected</span>
</template>
</template>
</b-table>
<p>
<b-button size="sm" @click="selectAllRows">Select all</b-button>
<b-button size="sm" @click="clearSelected">Clear selected</b-button>
<b-button size="sm" @click="selectThirdRow">Select 3rd row</b-button>
<b-button size="sm" @click="unselectThirdRow">Unselect 3rd row</b-button>
</p>
<p>
Selected Rows:<br>
{{ selected }}
</p>
</div>
</template>
<script>
export default {
data() {
return {
modes: ['multi', 'single', 'range'],
fields: ['selected', 'isActive', 'age', 'first_name', 'last_name'],
items: [
{ isActive: true, age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
{ isActive: false, age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{ isActive: false, age: 89, first_name: 'Geneva', last_name: 'Wilson' },
{ isActive: true, age: 38, first_name: 'Jami', last_name: 'Carney' }
],
selectMode: 'multi',
selected: []
}
},
methods: {
onRowSelected(items) {
this.selected = items
},
selectAllRows() {
this.$refs.selectableTable.selectAllRows()
},
clearSelected() {
this.$refs.selectableTable.clearSelected()
},
selectThirdRow() {
this.$refs.selectableTable.selectRow(2)
},
unselectThirdRow() {
this.$refs.selectableTable.unselectRow(2)
}
}
}
</script>
テーブル本体のトランジションサポート
Vueのトランジションとアニメーションは、内部でVueの<transition-group>
コンポーネントを使用することにより、オプションで<tbody>
要素でサポートされます。トランジションサポートには3つのpropsが利用可能です(すべてデフォルトは未定義です)。
Prop | 型 | 説明 |
tbody-transition-props | オブジェクト | transition-groupプロパティのオブジェクト |
tbody-transition-handlers | オブジェクト | transition-groupイベントハンドラーのオブジェクト |
primary-key | 文字列 | 一意の行キーとして使用するフィールドを指定する文字列(必須) |
トランジションを有効にするには、tbody-transition-props
および/またはtbody-transition-handlers
を指定する必要があり、primary-key
propを介して一意のキーとして使用するフィールドキーを指定する必要があります。トランジションを正常に機能させるには、データに、(primary-key
propをフィールドの名前に設定することで指定される)列が必須で、各行に一意の値が必要です。primary-key
フィールドの値は、一意の文字列または数値のいずれかになります。指定されたフィールドは、レンダリングされたテーブル出力に表示される必要はありませんが、アイテムデータの各行に必須で存在する必要があります。
プロジェクトで(CSSトランジションを使用する場合)トランジションを処理するためのCSSも提供する必要があります。
Vueのリストレンダリングトランジションの詳細については、Vue JS公式ドキュメントを参照してください。
以下の例では、次のカスタムCSSを使用しました。
table#table-transition-example .flip-list-move {
transition: transform 1s;
}
<template>
<div>
<b-table
id="table-transition-example"
:items="items"
:fields="fields"
striped
small
primary-key="a"
:tbody-transition-props="transProps"
></b-table>
</div>
</template>
<script>
export default {
data() {
return {
transProps: {
name: 'flip-list'
},
items: [
{ a: 2, b: 'Two', c: 'Moose' },
{ a: 1, b: 'Three', c: 'Dog' },
{ a: 3, b: 'Four', c: 'Cat' },
{ a: 4, b: 'One', c: 'Mouse' }
],
fields: [
{ key: 'a', sortable: true },
{ key: 'b', sortable: true },
{ key: 'c', sortable: true }
]
}
}
}
</script>
v-model
バインディング
変数をv-model
propにバインドすると、この変数の内容は、現在表示されているアイテムレコード(0ベースのインデックス、page-size
- 1まで)になります。この変数(value
prop)は通常、読み取り専用として扱う必要があります。
v-model
内のレコードは、items
のフィルタリング/ページネーションされた浅いコピーであるため、v-model
のレコードのプロパティに対する変更は、元のitems
配列に反映されます(ただし、items
がプロバイダー関数に設定されている場合を除きます)。v-model
配列からレコードを削除しても、元のアイテム配列からレコードが削除されたり、表示された行から削除されたりすることはありません。
注意: value
propに値を直接バインドしないでください。v-model
バインディングを使用してください。
ソート
上記のフィールドセクションで説明したように、<b-table>
で列をソート可能にすることができます。ソート可能な列ヘッダーをクリックすると、列が昇順(最小が最初)でソートされ、再度クリックすると、ソートの方向が降順(最大が最初)に切り替わります。ソート不可能な列をクリックすると、ソートがクリアされます(prop no-sort-reset
を使用すると、この機能を無効にできます)。
どの列が事前にソートされるか、およびソートの順序(昇順または降順)を制御できます。ソートする列を事前に指定するには、sort-by
propをフィールドのキーに設定します。ソートの方向を設定するには、sort-desc
をtrue
(降順の場合)またはfalse
(昇順、デフォルトの場合)に設定します。
- 昇順: アイテムは最小から最大にソートされます(つまり、
A
からZ
)。最初の行に最小値が表示され、次の行に徐々に高い値が表示されます。 - 降順: アイテムは最大から最小にソートされます(つまり、
Z
からA
)。最初の行に最大値が表示され、次の行に徐々に低い値が表示されます。
props sort-by
およびsort-desc
は、.sync
修飾子を追加することにより、双方向(同期可能)propsに変換できます。バインドされた変数は、現在のソート基準に基づいて適切に更新されます。.sync
prop修飾子の詳細については、Vueドキュメントを参照してください。
sort-by
を、フィールドでsortable
として定義されていない列に設定すると、テーブルがソートされなくなります。
prop foot-clone
が設定されている場合、フッターのヘッダーをクリックしてソートすることもできます。カスタム形式のフッターフィールドヘッダーがある場合でも同様です。フッターのヘッダークリックによるソートアイコンとソートを無効にするには、no-footer-sorting
propをtrueに設定します。
<template>
<div>
<b-table
:items="items"
:fields="fields"
:sort-by.sync="sortBy"
:sort-desc.sync="sortDesc"
responsive="sm"
></b-table>
<div>
Sorting By: <b>{{ sortBy }}</b>, Sort Direction:
<b>{{ sortDesc ? 'Descending' : 'Ascending' }}</b>
</div>
</div>
</template>
<script>
export default {
data() {
return {
sortBy: 'age',
sortDesc: false,
fields: [
{ key: 'last_name', sortable: true },
{ key: 'first_name', sortable: true },
{ key: 'age', sortable: true },
{ key: 'isActive', sortable: false }
],
items: [
{ isActive: true, age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
{ isActive: false, age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{ isActive: false, age: 89, first_name: 'Geneva', last_name: 'Wilson' },
{ isActive: true, age: 38, first_name: 'Jami', last_name: 'Carney' }
]
}
}
}
</script>
ソートアイコンの配置
デフォルトでは、ソートアイコンはヘッダーセルに右揃えで表示されます。<b-table>
でprop sort-icon-left
を設定することにより、アイコンを左揃えに変更できます。
<template>
<div>
<b-table
:items="items"
:fields="fields"
:sort-by.sync="sortBy"
:sort-desc.sync="sortDesc"
sort-icon-left
responsive="sm"
></b-table>
<div>
Sorting By: <b>{{ sortBy }}</b>, Sort Direction:
<b>{{ sortDesc ? 'Descending' : 'Ascending' }}</b>
</div>
</div>
</template>
<script>
export default {
data() {
return {
sortBy: 'age',
sortDesc: false,
fields: [
{ key: 'last_name', sortable: true },
{ key: 'first_name', sortable: true },
{ key: 'age', sortable: true },
{ key: 'isActive', sortable: false }
],
items: [
{ isActive: true, age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
{ isActive: false, age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{ isActive: false, age: 89, first_name: 'Geneva', last_name: 'Wilson' },
{ isActive: true, age: 38, first_name: 'Jami', last_name: 'Carney' }
]
}
}
}
</script>
ソートアイコンのカスタマイズ
ソートアイコンは、SVG背景画像を使用して生成されます。アイコンは、BootstrapVueのSASS/SCSS変数を更新し、SCSSソースコードを再コンパイルすることで変更できます。BootstrapおよびBootstrapVueで生成されたCSSのカスタマイズの詳細については、テーマセクションを参照してください。
ソート比較ルーチン
内部の組み込みデフォルトのsort-compare
関数は、基になるレコードオブジェクトのデータに基づいて、指定されたフィールドkey
をソートします(または、フィールドにフォーマッタ関数があり、フィールドのsortByFormatted
プロパティがtrue
に設定されている場合は、書式設定された値でソートします)。フィールド値がオブジェクトの場合は、最初に文字列化されてからソートされます。
注
- 組み込みの
sort-compare
ルーチンは、フィールドデータのカスタムレンダリングに基づいてソートすることはできません。スコープ付きスロットは表示のみに使用され、基になるデータには影響しません。 formatter
関数(仮想フィールドまたは通常のフィールド)を持つフィールドは、フィールドプロパティsortByFormatted
がtrue
に設定されている場合、フォーマッタ関数を介して返される値でソートできます。オプションで、ソート前に値をフォーマットするために、フォーマッタ関数参照をsortByFormatted
に渡すことができます。デフォルトはfalse
で、元のフィールド値でソートされます。これは、組み込みのソート比較ルーチンにのみ適用されます。 - デフォルトでは、内部ソートルーチンは
null
、undefined
、または空の文字列値を最初にソートします(他の値よりも小さい)。null
、undefined
、または空の文字列値が最後(他の値よりも大きい)に表示されるようにソートするには、sort-null-last
propをtrue
に設定します。
ソート比較処理のカスタマイズについては、以下のカスタムソート比較ルーチンセクションを参照してください。
内部ソートとロケール処理
内部のソート比較ルーチンは、文字列化された列値の比較にString.prototype.localeCompare()
を使用します(比較されている値が両方ともNumber
型または両方ともDate
型でない場合)。ブラウザネイティブのlocaleCompare()
メソッドは、文字列のソート方法を制御するためのlocale
文字列(またはロケール文字列の配列)とoptions
オブジェクトを受け入れます。デフォルトのオプションは{ numeric: true }
で、ロケールはundefined
です(ブラウザのデフォルトロケールを使用します)。
sort-compare-locale
propを介してロケール(またはロケール)を変更して、ソート用のロケールを設定したり、sort-compare-options
propを介してソートオプションを渡したりすることができます。
sort-compare-locale
プロップのデフォルト値は undefined
であり、ブラウザ(または Node.js ランタイム)のデフォルトロケールが使用されます。sort-compare-locale
プロップは、BCP 47 言語タグ文字列、またはそのようなタグの配列を受け入れることができます。ロケールの詳細については、MDN の ロケールの識別とネゴシエーションを参照してください。
sort-compare-options
プロップは、次のプロパティを含むオブジェクトを受け入れます。
localeMatcher
: 使用するロケールマッチングアルゴリズム。可能な値は 'lookup'
と 'best fit'
です。デフォルトは 'best fit'
です。このオプションの詳細については、MDN Intl ページを参照してください。 sensitivity
: 文字列のどの違いが 0 以外の比較結果値につながるべきか。可能な値は次のとおりです。 'base'
: 基本文字が異なる文字列のみが不等として比較されます。例: a ≠ b
, a = á
, a = A
。 'accent'
: 基本文字またはアクセント記号やその他の発音区別符号が異なる文字列のみが不等として比較されます。例: a ≠ b
, a ≠ á
, a = A
。 'case'
: 基本文字または大文字小文字が異なる文字列のみが不等として比較されます。例: a ≠ b
, a = á
, a ≠ A
。 'variant'
: (デフォルト) 基本文字、アクセント記号やその他の発音区別符号、または大文字小文字が異なる文字列が不等として比較されます。他の違いも考慮される可能性があります。例: a ≠ b
, a ≠ á
, a ≠ A
。
ignorePunctuation
: 句読点を無視するかどうか。可能な値は true
と false
です。デフォルトは false
です。 numeric
: 数値照合を使用するかどうか。'1' < '2' < '10'
のようになるべきです。可能な値は true
と false
です。デフォルトは false
です。実装(ブラウザ、ランタイム)はこのプロパティをサポートする必要はないため、無視される可能性があることに注意してください。 caseFirst
: 大文字または小文字のどちらを先にソートするか。可能な値は 'upper'
、'lower'
、または 'false'
(ロケールのデフォルトを使用)です。デフォルトは 'false'
です。実装はこのプロパティをサポートする必要はありません。 'usage'
: <b-table>
によって常に 'sort'
に設定されます
例 1: ドイツ語の単語をソートする場合は、sort-compare-locale="de"
を設定します(ドイツ語では、ä
は z
の前にソートされます)。スウェーデン語の場合は sort-compare-locale="sv"
を設定します(スウェーデン語では、ä
は z
の後にソートされます)。
例 2: 文字列である数値を数値的に比較し、大文字小文字とアクセント記号を無視するには
<b-table :sort-compare-options="{ numeric: true, sensitivity: 'base' }" ...>
注
カスタムソート比較ルーチン
sort-compare
プロップに関数参照を渡すことで、独自のカスタムソート比較ルーチンを提供できます。sort-compare
ルーチンには、7 つの引数が渡されます。最後の 4 つはオプションです。
- 最初の 2 つの引数 (
a
と b
) は、比較対象の行のレコードオブジェクトです。 - 3 番目の引数は、ソート対象のフィールド
key
(sortBy
) です。 - 4 番目の引数 (
sortDesc
) は、<b-table>
がレコードを表示する順序です (降順の場合は true
、昇順の場合は false
)。 - 5 番目の引数は、フィールドのformatter 関数への参照、または関数参照である場合はフィールドの
filterByFormatted
値です。formatter が見つからない場合、この値は undefined
になります。フォーマットされたフィールド値を取得するには、このメソッドを呼び出す必要があります。フォーマットされた値でソートする必要がある場合は、valA = formatter(a[key], key, a)
および valB = formatter(b[key], key, b)
とします。フィールドの sortByFormatted
プロパティが true
ではないか、formatter 関数参照ではないか、またはフィールドの formatter 関数が見つからない場合、これは undefined
になります。 - 6 番目の引数は、
sort-compare-options
プロップの値です (デフォルトは { numeric: true }
)。 - 7 番目の引数は、
sort-compare-locale
プロップの値です (デフォルトは undefined
)。
6 番目と 7 番目の引数は、String.prototype.localeCompare()
メソッドを使用して文字列を比較する場合に使用できます。
ほとんどの一般的な状況では、最初の 3 つの引数のみを使用する必要があります。4 番目の引数(ソート方向)は、通常は使用しないでください。b-table
が方向を処理するため、この値は通常、null
および/または undefined
値をソートする方法を特別に処理する場合(つまり、null
/undefined
を最初または最後にソートする場合)にのみ必要です。
ルーチンは、a[key] < b[key]
の場合は -1
(または負の値)、a[key] === b[key]
の場合は 0
、a[key] > b[key]
の場合は 1
(または正の値) のいずれかを返す必要があります。
カスタムソート比較ルーチンは、特定の key
の組み込みのソート比較ルーチンにフォールバックするために、null
または false
を返すこともできます。この機能(つまり、null
を返すことによって)を使用すると、カスタムソート比較ルーチンで仮想 (スコープ付きスロット) 列などの特定のフィールド (キー) のみ を処理し、内部 (組み込み) ソート比較ですべての他のフィールドを処理できます。
デフォルトのソート比較ルーチンは、次のように機能します。4 番目の引数(ソート方向)は、ソート比較では使用されないことに注意してください。
function sortCompare(aRow, bRow, key, sortDesc, formatter, compareOptions, compareLocale) {
const a = aRow[key]
const b = bRow[key]
if (
(typeof a === 'number' && typeof b === 'number') ||
(a instanceof Date && b instanceof Date)
) {
return a < b ? -1 : a > b ? 1 : 0
} else {
return toString(a).localeCompare(toString(b), compareLocale, compareOptions)
}
}
function toString(value) {
if (value === null || typeof value === 'undefined') {
return ''
} else if (value instanceof Object) {
return Object.keys(value)
.sort()
.map(key => toString(value[key]))
.join(' ')
} else {
return String(value)
}
}
ローカルソートの無効化
アプリでソートを完全に処理する場合は、no-local-sorting
プロップを true
に設定して、<b-table>
のローカルソートを無効にすることができます。これにより、ソート可能なヘッダー機能 (sort-changed
または context-changed
イベント、および同期可能なプロップ経由) は維持されます。
同期可能なプロップ sort-by.sync
および sort-desc.sync
を使用して、ソート列と方向の変更を検出できます。
また、ソート可能な列ヘッダー(またはフッター)がクリックされると、sort-changed
イベントが <b-table>
のコンテキストオブジェクトを含む単一の引数とともに発行されます。sort-changed イベントとコンテキストオブジェクトの詳細については、以下のソート変更の検出セクションを参照してください。
no-local-sorting
が true
の場合、sort-compare
プロップは効果がありません。
初期ソート方向の変更
ソート可能な列ヘッダーがクリックされたときに、昇順と降順のソートが適用される順序を、sort-direction
プロップを使用して制御します。デフォルト値の 'asc'
は、(列が現在ソートされていない場合)最初に昇順ソートを適用します。動作を反転して最初に降順にソートするには、'desc'
に設定します。
別のソート可能な列ヘッダーをクリックしたときに現在のソート方向を変更したくない場合は、sort-direction
を 'last'
に設定します。これにより、以前にソートされた列のソート方向が維持されます。
個々の列の初期ソート方向(列がソートされていない状態からソートされた状態に移行するときに適用される)の場合は、fields
でプロパティ sortDirection
を指定します。この機能の使用例については、以下の完全な例を参照してください。
フィルタリング
フィルタリングは、使用する場合、デフォルトで元の items 配列データに適用されます。b-table
は、データのフィルタリング方法に関するいくつかのオプションを提供します。
スコープ付きフィールドスロットによる書式設定の結果に基づいてフィルタリングすることは、現在できません。
組み込みフィルタリング
アイテムの行データ値は文字列化され(文字列化がどのように行われるかについては、上記のソートセクションを参照してください)、フィルターはその文字列化されたデータ(アンダースコア '_'
で始まる特別なプロパティを除く)を検索します。文字列化には、デフォルトで、表示されている列に表示されないデータも含まれます。
デフォルトの組み込みフィルター関数では、filter
プロップ値は、文字列または RegExp
オブジェクト(正規表現は、/g
グローバルフラグをセットするべきではありません)のいずれかになります。
文字列化された行に、指定された文字列値が含まれているか、RegExp 式と一致する場合は、表示される結果に含まれます。
現在のフィルターをクリアするには、filter
プロップを null
または空の文字列に設定します。
組み込みのフィルタリングオプション
フィルタを適用するデータを制御するためのいくつかのオプションがあります。
filter-ignored-fields
プロパティは、フィルタリング時に無視する必要があるトップレベル(行データの直接のプロパティ)のフィールドキーの配列を受け入れます。 filter-included-fields
プロパティは、フィルタリング時に使用する必要があるトップレベル(行データの直接のプロパティ)のフィールドキーの配列を受け入れます。この配列に含まれていない他のすべてのフィールドキーは無視されます。この機能は、特定の列でフィルタリングしたい場合に便利です。指定された配列が空の場合、filter-ignored-fields
プロパティで指定されたものを除き、すべてのフィールドが含まれます。フィールドキーが filter-ignored-fields
と filter-included-fields
の両方で指定されている場合、filter-included-fields
が優先されます。 - 通常、
<b-table>
は文字列化されたレコードデータに基づいてフィルタリングを行います。フィールドに formatter
関数が指定されている場合、フィールド定義プロパティ filterByFormatted
を true
に設定することで、フォーマッタの結果に基づいてフィルタリングすることもできます。フィールドにフォーマッタ関数がない場合、このオプションは無視されます。フィルタリングのみに使用するフォーマッタ関数の参照を、フィールド定義プロパティ filterByFormatted
に渡すこともできます。
filter-ignored-fields
および filter-included-fields
プロパティ、およびフィールド定義プロパティ filterByFormatted
は、カスタムフィルタ関数、またはアイテムプロバイダーベースのフィルタリングを使用する場合は効果がありません。
カスタムフィルタ関数
プロパティ filter-function
をカスタムフィルタテスト関数の参照に設定することで、カスタムフィルタ関数を使用することもできます。フィルタ関数には、2つの引数が渡されます。
- 元のアイテム行レコードデータオブジェクト。この引数は読み取り専用として扱ってください。
filter
プロパティの内容(文字列、RegExp、配列、またはオブジェクトのいずれかになります)
関数は、レコードが条件に一致する場合は true
を返し、レコードをフィルタリングする場合は false
を返す必要があります。
表示されるデータへの適切なリアクティブな更新のために、フィルタリングを行わない場合は、filter
プロパティを null
または空の文字列(空のオブジェクトや配列ではなく)に設定する必要があります。filter
プロパティが偽の値の場合、フィルタ関数は呼び出されません。
empty-filter-text
の表示は、filter
プロパティの真偽値に依存します。
フィルタイベント
ローカルフィルタリングが適用され、結果としてアイテムの数が変化すると、<b-table>
は2つの引数で filtered
イベントを発行します。
- フィルタルーチンを通過するアイテムの完全なリストである配列の参照。この引数は読み取り専用として扱ってください。
- フィルタテストを通過したレコードの数(最初の引数の長さ)
filter
プロパティを null または空の文字列に設定すると、ローカルアイテムのフィルタリングがクリアされます。
フィルタ条件の変更のデバウンス
v2.1.0 で非推奨 <b-form-input>
の debounce
機能を使用してください。
<b-table>
の filter
プロパティに紐付けられたテキスト入力がある場合、フィルタリングプロセスはユーザーが入力した文字ごとに実行されます。アイテムデータセットが大きい場合、このプロセスに時間がかかり、テキスト入力が遅く見えることがあります。
この種の状況を緩和するために、<b-table>
は filter-debounce
プロパティを介してデバウンスタイムアウト値(ミリ秒単位)を受け入れます。デフォルトは 0
(ミリ秒)です。0
より大きい値が提供されると、フィルタはテーブル結果を更新する前にその時間だけ待機します。filter
プロパティの値がこのタイムアウトの期限が切れる前に変化した場合、フィルタリングはデバウンスタイムアウトが期限切れになるまで再び遅延されます。
使用する場合、filter-debounce
の推奨値は 100
~ 200
ミリ秒の範囲ですが、ユースケースによっては他の値がより適切な場合があります。
このプロパティの使用は、アイテムプロバイダー関数でプロバイダーフィルタリングを使用する場合に、バックエンドAPIへの呼び出し回数を減らすのに役立ちます。
フィルタリングに関する注意
filter
機能の使用例については、以下の完全な例を参照してください。
<b-table>
は、アイテムデータの組み込みのページネーションをサポートしています。per-page
プロパティを表示したい最大行数に設定し、current-page
プロパティを使用して表示するページを指定(ページ 1
から開始)することで、一度に表示する行数を制御できます。current-page
を計算されたページ数よりも大きい値に設定すると、行は表示されません。
ページネーションを制御するために、<b-pagination>
コンポーネントを <b-table>
と組み合わせて使用できます。
per-page
を 0
(デフォルト)に設定すると、ローカルアイテムのページネーション機能が無効になります。
アイテムプロバイダー関数の使用
アイテムプロパティのセクションで説明したように、items
プロパティを介して関数参照を指定することにより、関数を使用して行データ(アイテム)を提供することができます。
プロバイダー関数は、次のシグネチャで呼び出されます。
provider(ctx, [callback])
ctx
はテーブル状態に関連付けられたコンテキストオブジェクトであり、次のプロパティが含まれています。
プロパティ | 型 | 説明 |
currentPage | 数値 | 現在のページ番号(1から始まり、current-page プロパティの値) |
perPage | 数値 | 表示するページあたりの最大行数(per-page プロパティの値) |
filter | 文字列またはRegExpまたはオブジェクト | filter プロパティの値 |
sortBy | 文字列 | ソートされている現在の列キー。ソートされていない場合は空の文字列。 |
sortDesc | ブール値 | 現在のソート方向(降順の場合は true 、昇順の場合は false ) |
apiUrl | 文字列 | api-url プロパティに提供された値。提供されていない場合は null 。 |
2番目の引数 callback
は、コールバック非同期メソッドを使用する場合のオプションのパラメータです。
例:データの配列を返す(同期)
function myProvider() {
let items = []
return items || []
}
例:コールバックを使用してデータを返す(非同期)
function myProvider(ctx, callback) {
const params = '?page=' + ctx.currentPage + '&size=' + ctx.perPage
this.fetchData('/some/url' + params)
.then(data => {
const items = data.items
callback(items)
})
.catch(() => {
callback([])
})
return null
}
例:Promiseを使用してデータを返す(非同期)
function myProvider(ctx) {
const promise = axios.get('/some/url?page=' + ctx.currentPage + '&size=' + ctx.perPage)
return promise.then(data => {
const items = data.items
return items || []
})
}
例:async関数を使用する(準同期)
アイテムの配列を返すためにasyncメソッドを使用できます
async function myProvider(ctx) {
try {
const response = await axios.get(`/some/url?page=${ctx.currentPage}&size=${ctx.perPage}`)
return response.items
} catch (error) {
return []
}
}
すべてのブラウザが async/await
をネイティブにサポートしているわけではないことに注意してください。async
メソッドをサポートしていないブラウザの場合、コードをトランスパイルする必要があります。
自動テーブルビジー状態
<b-table>
は、アイテムプロバイダー関数が使用されている場合、自動的に busy
状態を追跡/制御しますが、busy
プロパティも提供し、内部の busy
状態をオーバーライドするか、2方向の .sync
修飾子を使用してアプリケーション内の <b-pagination>
の現在のビジー状態を監視するために使用できます。
注:<b-table>
が busy
状態を完全に追跡できるようにするには、カスタムアイテムプロバイダー関数がデータソースからのエラーを処理し、空の配列を <b-table>
に返す必要があります。
例:ビジー状態の使用
<template>
<div>
<b-table
id="my-table"
:busy.sync="isBusy"
:items="myProvider"
:fields="fields"
...
></b-table>
</div>
</template>
<script>
export default {
data () {
return {
isBusy: false
}
}
methods: {
myProvider () {
let promise = axios.get('/some/url')
return promise.then((data) => {
const items = data.items
return(items)
}).catch(error => {
return []
})
}
}
}
</script>
async/await
プロバイダーを使用している場合
async function myProvider(ctx) {
this.isBusy = true
try {
const response = await axios.get(`/some/url?page=${ctx.currentPage}&size=${ctx.perPage}`)
this.isBusy = false
return response.items
} catch (error) {
this.isBusy = false
return []
}
}
注
- テーブルを手動で
busy
状態にした場合、busy
状態が false
に設定されるまで、アイテムプロバイダーは呼び出されたり、リフレッシュされたりしません。 - すべてのクリック関連およびホバーイベント、およびソート変更イベントは、
busy
状態(プロバイダーの更新中に自動的に設定されるか、手動で設定された場合)のときには発行されません。
プロバイダーのページング、フィルタリング、およびソート
デフォルトでは、アイテムプロバイダー関数は、データを表示するために b-table
に渡す前に、データのすべてのページング、フィルタリング、およびソートを担当します。
次の b-table
プロパティを true
に設定することで、プロバイダーのページング、フィルタリング、およびソート(個別に)を無効にすることができます。
Prop | 型 | デフォルト | 説明 |
no-provider-paging | ブール値 | false | true の場合、b-table ローカルデータページネーションの使用が有効になります |
no-provider-sorting | ブール値 | false | true の場合、b-table ローカルソートの使用が有効になります |
no-provider-filtering | ブール値 | false | true の場合、b-table ローカルフィルタリングの使用が有効になります |
no-provider-paging
が false
(デフォルト)の場合、最大で perPage
個のレコードのみを返す必要があります。
注
<b-table>
は、プロバイダー関数の呼び出しをトリガーするために、ページネーションおよびフィルタリングの値への参照を必要とします。したがって、プロバイダー更新関数呼び出しをトリガーするために、b-table
の per-page
、current-page
および filter
プロパティにバインドするようにしてください(それぞれの no-provider-*
プロパティが true
に設定されていない限り)。 items
がプロバイダー関数の場合、no-local-sorting
プロパティは効果がありません。 - プロバイダーフィルタリングを使用する場合、
<b-form-input>
の debounce
プロパティ を 100
ミリ秒より大きい値に設定すると、ユーザーが条件を入力するにつれて、バックエンドAPIへの呼び出し回数を最小限に抑えるのに役立つことがわかります。
テーブルデータの強制リフレッシュ
また、refresh::table
イベントを $root
上で発生させることで、プロバイダー関数のリフレッシュをトリガーできます。この際、単一の引数として、b-table
の id
を渡します。この機能を利用するには、テーブルに一意の ID が設定されている必要があります。
this.$root.$emit('bv::refresh::table', 'my-table')
または、テーブル参照の refresh()
メソッドを呼び出すことでも可能です。
<div>
<b-table ref="table" ... ></b-table>
</div>
this.$refs.table.refresh()
注: テーブルが busy
状態の場合(つまり、プロバイダーの更新が現在実行中の場合)、リフレッシュは現在の更新が完了するまで待機します。現在リフレッシュが保留中で、新しいリフレッシュが要求された場合、リフレッシュは1回のみ実行されます。
ソート変更の検出
<b-table>
の sort-changed
イベントをリッスンすることで、ソートキーと方向が変更されたタイミングを検出できます。
<div>
<b-table @sort-changed="sortingChanged" ... ></b-table>
</div>
sort-changed
イベントは、テーブルの現在の状態コンテキストオブジェクトの単一の引数を提供します。このコンテキストオブジェクトは、アイテムプロバイダー関数で使用されるものと同じ形式です。
export default {
methods: {
sortingChanged(ctx) {
}
}
}
また、:sort-by.sync
および :sort-desc.sync
の双方向プロパティをそれぞれ使用して、現在の sortBy および sortDesc の値を取得することもできます(詳細は、上記のソートセクションを参照してください)。
<div>
<b-table :sort-by.sync="mySortBy" :sort-desc.sync="mySortDesc" ... ></b-table>
</div>
サーバーサイドレンダリング
サーバーサイドレンダリング(SSR)と items
プロバイダー関数を使用する場合は、特別な注意が必要です。サーバー側でデータをフェッチする際に必要となる可能性のある特別な状況に対処してください!
<b-table>
がドキュメントにマウントされると、プロバイダーの更新呼び出しが自動的にトリガーされます。
軽量テーブル
単に表形式のデータを表示したいだけであれば、<b-table-lite>
は <b-table>
の優れた代替手段となります。<b-table-lite>
コンポーネントは、<b-table>
のすべてのスタイリングおよびフォーマット機能(行の詳細やスタックサポートを含む)を提供しますが、以下の機能は除外されています。
- フィルタリング
- ソート
- ページネーション
- アイテムプロバイダーのサポート
- 選択可能な行
- テーブルのビジー状態とスタイリング
- 固定された上部および下部の行
- 空の行のサポート
プラグインとしての Table Lite
TablePlugin
には <b-table-lite>
が含まれています。便宜上、BootstrapVue は <b-table-lite>
のみをインストールする TableLitePlugin
も提供しています。TableLitePlugin
は、トップレベルの名前付きエクスポートとして利用できます。
シンプルなテーブル
<b-table-simple>
コンポーネントを使用すると、ユーザーはテーブルコンテンツのレンダリングを完全に制御でき、基本的な Bootstrap v4 のテーブルスタイリングが提供されます。<b-table-simple>
は、<table>
要素をラップするコンポーネントです。コンポーネント内では、default
スロットを介して、BootstrapVue の テーブルヘルパーコンポーネント:<b-thead>
、<b-tfoot>
、<b-tbody>
、<b-tr>
、<b-th>
、<b-td>
、および HTML5 要素 <caption>
、<colgroup>
、<col>
のいずれかまたはすべてを使用できます。コンポーネントの名前とは異なり、<b-table-simple>
を使用すると、シンプルまたは複雑なテーブルレイアウトを作成できます。
<b-table-simple>
は、striped
、bordered
、borderless
、outlined
、small
、hover
、dark
、fixed
、responsive
、および sticky-header
というプロパティを通じて、基本的なスタイリングオプションを提供します。stacked
モードも使用できますが、下記のシンプルなテーブルとスタックモードのセクションで説明されているように、セルの見出しを生成するために追加のマークアップが必要です。固定列もサポートされていますが、どの列を固定するかを指定するために、追加のマークアップが少し必要になります。固定列の使用に関する詳細は、下記を参照してください。
b-table-simple
は単なるラッパーコンポーネントであり、内部にコンテンツをレンダリングする必要があるため、<b-table>
の高度な機能(つまり、行イベント、ヘッドイベント、ソート、ページネーション、フィルタリング、フットクローン、アイテム、フィールドなど)は提供されません。
<div>
<b-table-simple hover small caption-top responsive>
<caption>Items sold in August, grouped by Country and City:</caption>
<colgroup><col><col></colgroup>
<colgroup><col><col><col></colgroup>
<colgroup><col><col></colgroup>
<b-thead head-variant="dark">
<b-tr>
<b-th colspan="2">Region</b-th>
<b-th colspan="3">Clothes</b-th>
<b-th colspan="2">Accessories</b-th>
</b-tr>
<b-tr>
<b-th>Country</b-th>
<b-th>City</b-th>
<b-th>Trousers</b-th>
<b-th>Skirts</b-th>
<b-th>Dresses</b-th>
<b-th>Bracelets</b-th>
<b-th>Rings</b-th>
</b-tr>
</b-thead>
<b-tbody>
<b-tr>
<b-th rowspan="3">Belgium</b-th>
<b-th class="text-right">Antwerp</b-th>
<b-td>56</b-td>
<b-td>22</b-td>
<b-td>43</b-td>
<b-td variant="success">72</b-td>
<b-td>23</b-td>
</b-tr>
<b-tr>
<b-th class="text-right">Gent</b-th>
<b-td>46</b-td>
<b-td variant="warning">18</b-td>
<b-td>50</b-td>
<b-td>61</b-td>
<b-td variant="danger">15</b-td>
</b-tr>
<b-tr>
<b-th class="text-right">Brussels</b-th>
<b-td>51</b-td>
<b-td>27</b-td>
<b-td>38</b-td>
<b-td>69</b-td>
<b-td>28</b-td>
</b-tr>
<b-tr>
<b-th rowspan="2">The Netherlands</b-th>
<b-th class="text-right">Amsterdam</b-th>
<b-td variant="success">89</b-td>
<b-td>34</b-td>
<b-td>69</b-td>
<b-td>85</b-td>
<b-td>38</b-td>
</b-tr>
<b-tr>
<b-th class="text-right">Utrecht</b-th>
<b-td>80</b-td>
<b-td variant="danger">12</b-td>
<b-td>43</b-td>
<b-td>36</b-td>
<b-td variant="warning">19</b-td>
</b-tr>
</b-tbody>
<b-tfoot>
<b-tr>
<b-td colspan="7" variant="secondary" class="text-right">
Total Rows: <b>5</b>
</b-td>
</b-tr>
</b-tfoot>
</b-table-simple>
</div>
responsive
または sticky-header
モードの場合、<table>
要素は <div>
要素でラップされます。<table>
要素に追加のクラスを適用する必要がある場合は、table-class
プロパティを使用してください。
<b-table-simple>
に指定された追加の属性は、常に <table>
要素に適用されます。
シンプルなテーブルとスタックモード
テーブルがスタックモードの場合、<b-table-simple>
のボディセルには追加のマークアップが必要です。具体的には、BootstrapVue はセルの見出しを作成するために特別なデータ属性を使用します。この属性は、<b-td>
または <b-th>
に stacked-heading
プロパティを通じて指定できます。プレーンな文字列のみがサポートされています(HTMLマークアップは不可)。これは、疑似要素 ::before
と CSS の content
プロパティを使用しているためです。
上記と同じテーブルを常にスタック表示になるように設定し、スタックモードを処理するための追加のマークアップ(特にセルの見出しを生成するためのもの)を追加した例を示します。
<div>
<b-table-simple hover small caption-top stacked>
<caption>Items sold in August, grouped by Country and City:</caption>
<colgroup><col><col></colgroup>
<colgroup><col><col><col></colgroup>
<colgroup><col><col></colgroup>
<b-thead head-variant="dark">
<b-tr>
<b-th colspan="2">Region</b-th>
<b-th colspan="3">Clothes</b-th>
<b-th colspan="2">Accessories</b-th>
</b-tr>
<b-tr>
<b-th>Country</b-th>
<b-th>City</b-th>
<b-th>Trousers</b-th>
<b-th>Skirts</b-th>
<b-th>Dresses</b-th>
<b-th>Bracelets</b-th>
<b-th>Rings</b-th>
</b-tr>
</b-thead>
<b-tbody>
<b-tr>
<b-th rowspan="3" class="text-center">Belgium (3 Cities)</b-th>
<b-th stacked-heading="City" class="text-left">Antwerp</b-th>
<b-td stacked-heading="Clothes: Trousers">56</b-td>
<b-td stacked-heading="Clothes: Skirts">22</b-td>
<b-td stacked-heading="Clothes: Dresses">43</b-td>
<b-td stacked-heading="Accessories: Bracelets" variant="success">72</b-td>
<b-td stacked-heading="Accessories: Rings">23</b-td>
</b-tr>
<b-tr>
<b-th stacked-heading="City">Gent</b-th>
<b-td stacked-heading="Clothes: Trousers">46</b-td>
<b-td stacked-heading="Clothes: Skirts" variant="warning">18</b-td>
<b-td stacked-heading="Clothes: Dresses">50</b-td>
<b-td stacked-heading="Accessories: Bracelets">61</b-td>
<b-td stacked-heading="Accessories: Rings" variant="danger">15</b-td>
</b-tr>
<b-tr>
<b-th stacked-heading="City">Brussels</b-th>
<b-td stacked-heading="Clothes: Trousers">51</b-td>
<b-td stacked-heading="Clothes: Skirts">27</b-td>
<b-td stacked-heading="Clothes: Dresses">38</b-td>
<b-td stacked-heading="Accessories: Bracelets">69</b-td>
<b-td stacked-heading="Accessories: Rings">28</b-td>
</b-tr>
<b-tr>
<b-th rowspan="2" class="text-center">The Netherlands (2 Cities)</b-th>
<b-th stacked-heading="City">Amsterdam</b-th>
<b-td stacked-heading="Clothes: Trousers" variant="success">89</b-td>
<b-td stacked-heading="Clothes: Skirts">34</b-td>
<b-td stacked-heading="Clothes: Dresses">69</b-td>
<b-td stacked-heading="Accessories: Bracelets">85</b-td>
<b-td stacked-heading="Accessories: Rings">38</b-td>
</b-tr>
<b-tr>
<b-th stacked-heading="City">Utrecht</b-th>
<b-td stacked-heading="Clothes: Trousers">80</b-td>
<b-td stacked-heading="Clothes: Skirts" variant="danger">12</b-td>
<b-td stacked-heading="Clothes: Dresses">43</b-td>
<b-td stacked-heading="Accessories: Bracelets">36</b-td>
<b-td stacked-heading="Accessories: Rings" variant="warning">19</b-td>
</b-tr>
</b-tbody>
<b-tfoot>
<b-tr>
<b-td colspan="7" variant="secondary" class="text-right">
Total Rows: <b>5</b>
</b-td>
</b-tr>
</b-tfoot>
</b-table-simple>
</div>
<b-table>
および <b-table-lite>
と同様に、テーブルヘッダー(<thead>
)とフッター(<tfoot>
)は、テーブルが視覚的にスタックされている場合は視覚的に非表示になります。ヘッダーまたはフッターが必要な場合は、<b-tbody>
コンポーネント内(または2番目の <b-tbody>
コンポーネント内)に追加の <b-tr>
を作成し、子 <b-th>
セルに columnheader
のロールを設定し、Bootstrap v4 のレスポンシブ表示ユーティリティクラスを使用して、テーブルが視覚的にスタックされなくなった特定のブレークポイントより上の追加の行(または <b-tbody>
)を非表示にすることで実現できます(ブレークポイントは、設定したスタックテーブルのブレークポイントと一致する必要があります)。たとえば、<b-tr class="d-md-none">
は中規模以上の画面で行を非表示にし、<b-tbody class="d-md-none">
は中規模以上の画面で行グループを非表示にします。
注: <b-table-simple>
でのスタックモードでは、BootstrapVue のテーブルヘルパーコンポーネントを使用する必要があります。通常の <tbody>
、<tr>
、<td>
、および <th>
要素タグを使用しても、期待どおりに機能せず、必要なアクセシビリティ属性も自動的に適用されません。
シンプルなテーブルと固定列
固定列は <b-table-simple>
でサポートされていますが、固定する列の各テーブルセル(thead
、tbody
、および tfoot
行グループ内)に sticky-column
プロパティを設定する必要があります。たとえば、
<b-table-simple responsive>
<b-thead>
<b-tr>
<b-th sticky-column>Sticky Column Header</b-th>
<b-th>Heading 1</b-th>
<b-th>Heading 2</b-th>
<b-th>Heading 3</b-th>
<b-th>Heading 4</b-th>
</b-tr>
</b-thead>
<b-tbody>
<b-tr>
<b-th sticky-column>Sticky Column Row Header</b-th>
<b-td>Cell</b-td>
<b-td>Cell</b-td>
<b-td>Cell</b-td>
<b-td>Cell</b-td>
</b-tr>
<b-tr>
<b-th sticky-column>Sticky Column Row Header</b-th>
<b-td>Cell</b-td>
<b-td>Cell</b-td>
<b-td>Cell</b-td>
<b-td>Cell</b-td>
</b-tr>
</b-tbody>
<b-tfoot>
<b-tr>
<b-th sticky-column>Sticky Column Footer</b-th>
<b-th>Heading 1</b-th>
<b-th>Heading 2</b-th>
<b-th>Heading 3</b-th>
<b-th>Heading 4</b-th>
</b-tr>
</b-tfoot>
</b-table-simple>
<b-table>
および <b-table-lite>
と同様に、<b-table-simple>
で stacked
プロパティが設定されている場合、固定列はサポートされません。
プラグインとしての Table Simple
TablePlugin
には、<b-table-simple>
とすべてのヘルパーコンポーネントが含まれています。便宜上、BootstrapVue は <b-table-simple>
とすべてのヘルパーコンポーネントをインストールする TableSimplePlugin
も提供しています。TableSimplePlugin
は、トップレベルの名前付きエクスポートとして利用できます。
テーブルヘルパーコンポーネント
BootstrapVue は、<b-table-simple>
を使用する場合、または名前付きスロット top-row
、bottom-row
、thead-top
、および custom-foot
(すべてテーブルの子要素を受け入れる)を使用する場合に、追加のヘルパー子コンポーネントを提供します。ヘルパーコンポーネントは以下のとおりです。
b-tbody
(<b-table-simple>
のみ) b-thead
(<b-table-simple>
のみ) b-tfoot
(<b-table-simple>
のみ) b-tr
b-td
b-th
これらのコンポーネントは、バリアントを適切なクラスに変換する処理(テーブルのdark
モードの処理など)や、特定のアクセシビリティ属性(例:role
とscope
)を自動的に適用する処理を最適化するように設計されています。また、スタックテーブル、スティッキーヘッダー、およびカラムのマークアップを生成することもできます。コンポーネント<b-table>
および<b-table-lite>
は、内部でこれらのヘルパーコンポーネントを使用します。
シンプルなテーブルの例では、ヘルパーコンポーネント<b-thead>
、<b-tbody>
、<b-tr>
、<b-th>
、<b-td>
、および<b-tfoot>
を使用しています。<b-table-simple>
内で通常のテーブルの子要素(例:<tbody>
、<tr>
、<td>
など)と、名前付きスロットtop-row
、bottom-row
、およびthead-top
を使用することもできますが、これらのBootstrapVueテーブル<b-t*>
ヘルパーコンポーネントを使用することをお勧めします。<caption>
、<colgroup>
、または<col>
用のヘルパーコンポーネントはないため、これらの3つのHTML5要素は<b-table-simple>
内で直接使用できます。
- テーブルヘルパーコンポーネント
<b-tr>
、<b-td>
、および<b-th>
はすべて、variant
プロパティを受け入れます。このプロパティは、Bootstrapのテーマカラーのいずれかを適用し(カスタムテーマカラーはテーマを介してサポートされます)、テーブルのdark
モードに基づいて正しいバリアントクラスを使用するように自動的に調整します。 - ヘルパーコンポーネント
<b-thead>
と<b-tfoot>
は、それぞれhead-variant
とfoot-variant
プロパティを受け入れます。サポートされている値は、'dark'
、'light'
、またはnull
です(null
はデフォルトのテーブル背景を使用します)。これらのバリアントは、テキストカラーも制御します('dark'
バリアントの場合は明るいテキスト、'light'
バリアントの場合は暗いテキスト)。 - アクセシビリティ属性
role
とscope
は、<b-th>
および<b-td>
コンポーネントに対して、それらの場所(thead、tbody、またはtfoot)とrowspan
またはcolspan
プロパティに基づいて自動的に設定されます。ヘルパーコンポーネントに適切な属性を設定することで、自動scope
およびrole
の値をオーバーライドできます。 <b-tbody>
、<b-thead>
、および<b-tfoot>
ヘルパーコンポーネントの場合、role
属性を指定してオーバーライドしない限り、適切なデフォルトのrole
である'rowgroup'
が適用されます。 <b-tr>
ヘルパーコンポーネントの場合、role
属性を指定してオーバーライドしない限り、適切なデフォルトのrole
である'row'
が適用されます。<b-tr>
はscope
を追加しません。 <b-tbody>
要素は、tbody-transition-props
とtbody-transition-handlers
プロパティのいずれかまたは両方が使用されている場合、Vueの<transition-group>
のレンダリングをサポートします。詳細については、テーブル本体のトランジションサポートセクションを参照してください。
アクセシビリティ
<b-table>
および<b-table-lite>
コンポーネントは、特定の機能を使用する場合、可能な限り最適なアクセシビリティマークアップを提供するよう試みます。
ヘルパーテーブルコンポーネントとともに<b-table-simple>
を使用する場合、要素には適切なロールがデフォルトで適用されます。必要に応じて、これをオーバーライドできます。<b-table-simple>
ヘルパーコンポーネントでクリックハンドラーを使用する場合、適切なaria-*
属性を適用し、tabindex="0"
を設定して、クリックアクションがスクリーンリーダーやキーボードのみのユーザーでもアクセスできるようにする必要があります。また、@keydown.enter.prevent
をリッスンして、Enterを押してセルまたは行のクリックをトリガーするユーザーを処理する必要があります(キーボードのみのユーザーのアクセシビリティに必要)。
ヘッダーのアクセシビリティ
列(フィールド)がソート可能である場合(<b-table>
のみ)、またはhead-clicked
リスナーが登録されている場合(<b-table>
と<b-table-lite>
)、ヘッダー(およびフッター)の<th>
セルは、キーボードのみのユーザーやスクリーンリーダーユーザーがアクセスできるように、ドキュメントのタブ順序に配置されます(tabindex="0"
を介して)。これにより、ユーザーはヘッダーセルでEnterを押してクリックをトリガーできます。
データ行のアクセシビリティ
テーブルがselectable
モードである場合(<b-table>
のみ、およびプロパティno-select-on-click
が設定されていない場合)、またはrow-clicked
イベントリスナーが登録されている場合(<b-table>
と<b-table-lite>
)、すべてのデータアイテム行(<tr>
要素)は、キーボードのみのユーザーやスクリーンリーダーユーザーがEnterまたはSpaceを押して行をクリックできるように、ドキュメントのタブ順序に配置されます(tabindex="0"
を介して)。
テーブルアイテムの行がドキュメントのタブ順序に配置されている場合(<b-table>
と<b-table-lite>
)、フォーカスされたときに基本的なキーボードナビゲーションもサポートします。
- Downで次の行に移動します
- Upで前の行に移動します
- EndまたはDown+Shiftで最後の行に移動します
- HomeまたはUp+Shiftで最初の行に移動します
- EnterまたはSpaceで行をクリックします。
行イベントのアクセシビリティ
次の行ベースのイベント/アクション(<b-table>
と<b-table-lite>
で使用可能)はアクセシブルとは見なされず、機能が重要でない場合や他の手段で提供できる場合にのみ使用する必要があります。
row-dblclicked
row-contextmenu
row-hovered
row-unhovered
row-middle-clicked
row-middle-clicked
イベントはすべてのブラウザ(例:IE、Safari、およびほとんどのモバイルブラウザ)でサポートされていないことに注意してください。入力やナビゲーションをサポートしていない要素で発生するrow-middle-clicked
イベントをリッスンする場合、通常はマウスの中ボタンのダウンアクションにマップされた他のデフォルトアクションを明示的に防止する必要があります。Windowsでは通常これは自動スクロールであり、macOSとLinuxでは通常これはクリップボードへの貼り付けです。これは、mousedown
またはpointerdown
イベントのデフォルトの動作を防止することで実行できます。
さらに、右クリック後にデフォルトのシステムまたはブラウザのコンテキストメニューを開くのを避ける必要がある場合があります。オペレーティングシステム間のタイミングの違いにより、これもrow-middle-clicked
の防止可能なデフォルトの動作ではありません。代わりに、これはrow-contextmenu
イベントのデフォルトの動作を防止することで実行できます。
イベントに関するさまざまな不整合をアプリが処理できるように、可能な限り多くのブラウザとデバイスのバリアントでアプリをテストすることをお勧めします。
完全な例
<template>
<b-container fluid>
<b-row>
<b-col lg="6" class="my-1">
<b-form-group
label="Sort"
label-for="sort-by-select"
label-cols-sm="3"
label-align-sm="right"
label-size="sm"
class="mb-0"
v-slot="{ ariaDescribedby }"
>
<b-input-group size="sm">
<b-form-select
id="sort-by-select"
v-model="sortBy"
:options="sortOptions"
:aria-describedby="ariaDescribedby"
class="w-75"
>
<template #first>
<option value="">-- none --</option>
</template>
</b-form-select>
<b-form-select
v-model="sortDesc"
:disabled="!sortBy"
:aria-describedby="ariaDescribedby"
size="sm"
class="w-25"
>
<option :value="false">Asc</option>
<option :value="true">Desc</option>
</b-form-select>
</b-input-group>
</b-form-group>
</b-col>
<b-col lg="6" class="my-1">
<b-form-group
label="Initial sort"
label-for="initial-sort-select"
label-cols-sm="3"
label-align-sm="right"
label-size="sm"
class="mb-0"
>
<b-form-select
id="initial-sort-select"
v-model="sortDirection"
:options="['asc', 'desc', 'last']"
size="sm"
></b-form-select>
</b-form-group>
</b-col>
<b-col lg="6" class="my-1">
<b-form-group
label="Filter"
label-for="filter-input"
label-cols-sm="3"
label-align-sm="right"
label-size="sm"
class="mb-0"
>
<b-input-group size="sm">
<b-form-input
id="filter-input"
v-model="filter"
type="search"
placeholder="Type to Search"
></b-form-input>
<b-input-group-append>
<b-button :disabled="!filter" @click="filter = ''">Clear</b-button>
</b-input-group-append>
</b-input-group>
</b-form-group>
</b-col>
<b-col lg="6" class="my-1">
<b-form-group
v-model="sortDirection"
label="Filter On"
description="Leave all unchecked to filter on all data"
label-cols-sm="3"
label-align-sm="right"
label-size="sm"
class="mb-0"
v-slot="{ ariaDescribedby }"
>
<b-form-checkbox-group
v-model="filterOn"
:aria-describedby="ariaDescribedby"
class="mt-1"
>
<b-form-checkbox value="name">Name</b-form-checkbox>
<b-form-checkbox value="age">Age</b-form-checkbox>
<b-form-checkbox value="isActive">Active</b-form-checkbox>
</b-form-checkbox-group>
</b-form-group>
</b-col>
<b-col sm="5" md="6" class="my-1">
<b-form-group
label="Per page"
label-for="per-page-select"
label-cols-sm="6"
label-cols-md="4"
label-cols-lg="3"
label-align-sm="right"
label-size="sm"
class="mb-0"
>
<b-form-select
id="per-page-select"
v-model="perPage"
:options="pageOptions"
size="sm"
></b-form-select>
</b-form-group>
</b-col>
<b-col sm="7" md="6" class="my-1">
<b-pagination
v-model="currentPage"
:total-rows="totalRows"
:per-page="perPage"
align="fill"
size="sm"
class="my-0"
></b-pagination>
</b-col>
</b-row>
<b-table
:items="items"
:fields="fields"
:current-page="currentPage"
:per-page="perPage"
:filter="filter"
:filter-included-fields="filterOn"
:sort-by.sync="sortBy"
:sort-desc.sync="sortDesc"
:sort-direction="sortDirection"
stacked="md"
show-empty
small
@filtered="onFiltered"
>
<template #cell(name)="row">
{{ row.value.first }} {{ row.value.last }}
</template>
<template #cell(actions)="row">
<b-button size="sm" @click="info(row.item, row.index, $event.target)" class="mr-1">
Info modal
</b-button>
<b-button size="sm" @click="row.toggleDetails">
{{ row.detailsShowing ? 'Hide' : 'Show' }} Details
</b-button>
</template>
<template #row-details="row">
<b-card>
<ul>
<li v-for="(value, key) in row.item" :key="key">{{ key }}: {{ value }}</li>
</ul>
</b-card>
</template>
</b-table>
<b-modal :id="infoModal.id" :title="infoModal.title" ok-only @hide="resetInfoModal">
<pre>{{ infoModal.content }}</pre>
</b-modal>
</b-container>
</template>
<script>
export default {
data() {
return {
items: [
{ isActive: true, age: 40, name: { first: 'Dickerson', last: 'Macdonald' } },
{ isActive: false, age: 21, name: { first: 'Larsen', last: 'Shaw' } },
{
isActive: false,
age: 9,
name: { first: 'Mini', last: 'Navarro' },
_rowVariant: 'success'
},
{ isActive: false, age: 89, name: { first: 'Geneva', last: 'Wilson' } },
{ isActive: true, age: 38, name: { first: 'Jami', last: 'Carney' } },
{ isActive: false, age: 27, name: { first: 'Essie', last: 'Dunlap' } },
{ isActive: true, age: 40, name: { first: 'Thor', last: 'Macdonald' } },
{
isActive: true,
age: 87,
name: { first: 'Larsen', last: 'Shaw' },
_cellVariants: { age: 'danger', isActive: 'warning' }
},
{ isActive: false, age: 26, name: { first: 'Mitzi', last: 'Navarro' } },
{ isActive: false, age: 22, name: { first: 'Genevieve', last: 'Wilson' } },
{ isActive: true, age: 38, name: { first: 'John', last: 'Carney' } },
{ isActive: false, age: 29, name: { first: 'Dick', last: 'Dunlap' } }
],
fields: [
{ key: 'name', label: 'Person full name', sortable: true, sortDirection: 'desc' },
{ key: 'age', label: 'Person age', sortable: true, class: 'text-center' },
{
key: 'isActive',
label: 'Is Active',
formatter: (value, key, item) => {
return value ? 'Yes' : 'No'
},
sortable: true,
sortByFormatted: true,
filterByFormatted: true
},
{ key: 'actions', label: 'Actions' }
],
totalRows: 1,
currentPage: 1,
perPage: 5,
pageOptions: [5, 10, 15, { value: 100, text: "Show a lot" }],
sortBy: '',
sortDesc: false,
sortDirection: 'asc',
filter: null,
filterOn: [],
infoModal: {
id: 'info-modal',
title: '',
content: ''
}
}
},
computed: {
sortOptions() {
return this.fields
.filter(f => f.sortable)
.map(f => {
return { text: f.label, value: f.key }
})
}
},
mounted() {
this.totalRows = this.items.length
},
methods: {
info(item, index, button) {
this.infoModal.title = `Row index: ${index}`
this.infoModal.content = JSON.stringify(item, null, 2)
this.$root.$emit('bv::show::modal', this.infoModal.id, button)
},
resetInfoModal() {
this.infoModal.title = ''
this.infoModal.content = ''
},
onFiltered(filteredItems) {
this.totalRows = filteredItems.length
this.currentPage = 1
}
}
}
</script>