表格(Tables)

使用<b-table>输出表格,并支持分页、过滤、排序、自定义呈现,各种样式选项,事件和异步数据。 为支持在不具备所有高级功能的情况下简单地显示表格数据,BootstrapVue提供了两个轻巧的替代组件, <b-table-lite> and <b-table-simple>.

示例:基本用法

年龄 姓氏 名字
40 Dickerson Macdonald
21 Larsen Shaw
89 Geneva Wilson
38 Jami Carney
<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 items是数组格式的表数据,其中每个记录(行)数据都是键对象。 示例格式:

const items = [
  { age: 32, first_name: 'Cyndi' },
  { age: 27, first_name: 'Havij' },
  { age: 42, first_name: 'Robert' }
]

<b-table> 自动对第一行进行采样以提取字段名称(记录数据中的键)。 字段名称是自动的 kebab-case, snake_case, and camelCase kebab-case,snake_case和camel对单个单词进行大写并为每个单词大写。 转换示例:

  • first_name 成为 first name
  • last-name 成为last name
  • age 成为 Age
  • YEAR 代替 YEAR
  • isActive 成为 Is Active

这些标题将按照它们在第一条数据记录中出现的顺序显示在表标题中。 请参阅下面的“字段”部分,以自定义字段标题的显示方式。

注意: 无法保证现场订购。 字段通常会按照它们在第一行中定义的顺序出现,但是根据所使用的浏览器版本的不同,情况并非总是如此。 请参阅字段(列定义) 下面的部分,以了解如何保证字段的顺序以及如何覆盖生成的标题。 .

记录数据可能还具有其他特殊的保留名称键,用于为行和单个单元格(变体)着色,以及触发其他行详细信息。 受支持的可选项目记录修改器属性(确保您的字段键与这些名称不冲突):

属性 类型 说明
_cellVariants Object 应用于单个单元格的引导上下文状态。按字段设置关键帧(有关支持的值,请参见Color Variants)。 这些变量映射到类table-${variant}bg-${variant}(设置dark属性时)。
_rowVariant String 应用于整行的引导上下文状态(请参阅支持值的 Color Variants)。 这些变量映射到类table-${variant}bg-${variant} (设置dark属性时)
_showDetails Boolean 用于触发row-details作用域插槽的显示。有关其他信息,请参见下面的 行详细信息支持部分

示例:对表单元格使用变体

年龄 姓氏 名字
40 Dickerson Macdonald
21 Larsen Shaw
89 Geneva Wilson
40 Thor MacDonald
29 Dick Dunlap
<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 of items数据。 提供程序功能也可以是异步的:

  • 在数据准备好后,以数据组作为回调的唯一参数,通过返回 null (或 未定义) 并调用回调
  • 通过返回解析为数组的Promise

有关更多的消息 请参见下面的“使用项目提供程序功能”部分

表格项目注释和警告

  • 避免就地操作记录数据,因为对基础项数据的更改将导致重新呈现行或整个表。请参阅下面的 主键以了解最小化Vue重新呈现行的方法。
  • items items数组记录应该是一个简单的对象,并且 必须 必须避免将可能具有循环引用的数据放在行中的值中。 <b-table> 将行数据序列化为字符串以进行排序和筛选,循环引用将导致堆栈溢出和应用程序崩溃!

字段(列定义)

The fields属性用于自定义表列标题,以及数据列的显示顺序。字段对象键 (i.e. age or first_name as shown below) are used to 如下图所示,年龄或名字)用于从每个项目(记录)行中提取值,并提供其他功能,如对列启用排序等。 sorting on the column, etc.

Fields can be provided as a simple array 字段可以作为简单数组或对象数组提供。字段数据内部将规范化为 包含列字段数据的事件或槽位将采用规范化字段对象格式(字段的对象数组或单个字段的对象数组)。 format. 包含该列的事件或广告位field字段可以是一个简单的数组,用于定义列的顺序以及要显示的列:fields 字段或单个字段的对象

字段作为简单数组

字段可以是一个简单的数组,用于定义列的顺序以及要显示的列:

列如: 使用 数字段 定义组

姓氏 名字 年纪
Dickerson Macdonald 40
Larsen Shaw 21
Geneva Wilson 89
Jami Carney 38
<template>
  <div>
    <b-table striped hover :items="items" :fields="fields"></b-table>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        // Note `isActive` is left out and will not appear in the rendered table
        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>

字段作为对象数组

字段可以是对象数组,可以对字段进行其他控制(例如排序,格式化等)。 仅显示出现在字段数组中的列(键):

示例:使用对象数组字段定义

Last Name (Click to sort Ascending) First Name Person age (Click to sort Ascending)
Macdonald Dickerson 40
Shaw Larsen 21
Wilson Geneva 89
Carney Jami 38
<template>
  <div>
    <b-table striped hover :items="items" :fields="fields"></b-table>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        // Note 'isActive' is left out and will not appear in the rendered table
        fields: [
          {
            key: 'last_name',
            sortable: true
          },
          {
            key: 'first_name',
            sortable: false
          },
          {
            key: 'age',
            label: 'Person age',
            sortable: true,
            // Variant applies to the whole column, including the header and footer
            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 String 从项目数组中的记录中选择数据的key。通过对象数组设置字段时必需。该键还用于生成自定义数据呈现自定义页眉和页脚槽名称。
label String 显示在列表页眉中(如果设置了foot-clone,则显示在页脚中)。 如果未提供,则默认为字段的键(人性化格式)。可以通过分配空字符串"" 来使用空标签, 但请确保还设置了headerTitle,以便向未看到的用户提供有关列内容的提示。
headerTitle String 要放置在字段标题<th>属性 title上的文本。 默认为无title属性。
headerAbbr String 要放置在字段标题<th>属性abbr上的文本。 如果标签(或标题)是缩写,请将其设置为标签(或标题)的未修订版本。默认为无abbr属性。
class String or Array 要添加到列中的<th> <td>的类名(或类名数组)。
formatter String or Function 可以使用格式化程序回调函数或组件中方法的名称,而不是(或与)作用域字段槽一起使用。将使用语法formatter(value, key, item)。 有关详细信息,请参阅自定义数据呈现
sortable Boolean 对此列启用排序。有关详细信息,请参阅排序部分。
sortDirection String 设置此列排序后的初始排序方向。有关详细信息,请参阅更改初始排序方向部分。
sortByFormatted Boolean or Function 当设置为true时,根据字段的formatter回调函数的结果对列进行排序。 默认值为false。如果字段没有formatter,布尔值无效。 (可选)接受格式化程序函数引用以格式化值,仅用于排序目的。有关详细信息,请参阅排序部分。
filterByFormatted Boolean or Function 当设置为true时,根据字段的formatter回调函数的结果筛选列。 默认值为false。如果字段没有formatter,布尔值无效。 (可选)接受格式化程序函数引用以格式化值,仅用于筛选目的。有关详细信息,请参阅 筛选部分。
tdClass String or Array or Function 要添加到列中<tbody>数据 <td>单元格的类名(或类名数组)。 如果每个单元格需要自定义类,则可以指定回调函数。函数将被称为tdClass(value, key, item),它必须返回ArrayString
thClass String or Array 要添加到此字段的 <thead>/ <tfoot>标题<th>单元格的类名(或类名数组)。
thStyle Object 表示要应用于表<thead>/<tfoot>字段 <th>的CSS样式的JavaScript对象。
variant String 对列中的所有<th> <td>应用上下文类 active, success, info, warning, danger。 这些变量映射到类thead-${variant}(在标题中)、 table-${variant}(在正文中)或bg-${variant} (在设置prop dark时)。
tdAttr Object or Function JavaScript对象,表示要应用于<tbody>>字段<td>单元格的其他属性。 如果需要每个单元格的自定义属性,则可以指定回调函数。函数将被调用为tdAttr(value, key, item),它必须返回一个 Object
thAttr Object or Function 表示要应用于字段的<thead>/<tfoot>标题 <th>单元格的附加属性的JavaScript对象。 如果字段的isRowHeader设置为true, 属性也将应用于<tbody>字段<th>单元格。 如果需要每个单元格的自定义属性,则可以指定回调函数。函数将被调用为 thAttr(value, key, item, type), 它必须返回一个Object
isRowHeader Boolean 当设置为true时, 字段的项数据单元格将用<th>而不是默认的<td>呈现。
stickyColumn Boolean 如果设置为true, 并且表处于 responsive 模式或具有sticky headers,则当滚动表的水平滚动条时,该列将固定在左侧。有关详细信息, 请参见Sticky columns

注意:

  • 除非上面另有说明,否则字段属性(如果不存在)默认为
  • class, thClass, tdClass 不能与在作用域CSS中定义的类一起使用,除非您使用VueLoader的 深度选择器.
  • 有关 thStyle支持的语法的信息,请参见Vue.js指南中的类和样式绑定。 .
  • 添加到字段定义对象的所有其他属性将保持不变-因此您可以通过命名作用域的插槽访问它们,以用于自定义数据,页眉和页脚呈现。

有关作用域插槽和格式化程序的信息和用法,请参阅下面的自定义 数据呈现 部分

随意混合和匹配简单数组和对象数组:

const fields = [
  { key: 'first_name', label: 'First' },
  { key: 'last_name', label: 'Last' },
  'age',
  'sex'
]

主键

<b-table> 提供而外的道具给primary-key您可以使用它来标识唯一标识行的字段键的名称。

主列键指定的值必须是 either a 字串符 或者 数字, 并且 是唯一的 跨表中的所有行。

主键列不需要出现在显示的字段中。

表格行ID生成

提供时, 主键 将为每个项目行元素生成唯一的ID。 <tr> 该ID的格式为{table-id}__row_{primary-key-value} ,其中 {table-id}<b-table>的唯一ID 并且主键指定的字段的项目字段值的最大值。

表格渲染和过渡优化

<b-table>还使用 主键帮助Vue优化表行的呈现。 在内部,由主键prop指定的字段键的值用作每个渲染的项目行元素的Vue:key值。 primary-key

如果您看到渲染问题(例如,工具提示隐藏或子组件意外重用, 项目数据更改或数据已排序/过滤/编辑)或表格行转换无效, 主键 道具(如果每行具有唯一的标识符)可以缓解这些问题。

如果您使用的是第三方表转换或拖放插件,则指定主键列很方便,因为它们依赖于每行:key值的一致性和唯一性。 a和拖放插件,因为它们依赖于每行:key值的一致性和唯一性。:key value.

如果未提供primary-key<b-table>将根据显示行的索引号(即在显示的表行中的位置)自动生成键。 这可能会导致GUI问题,例如使用以前的结果进行渲染的子组件/元素(即被Vue的渲染修补程序优化例程重用)。指定primary-key 列 可以缓解此问题(或者可以在自定义格式化字段槽中的元素/组件上放置unique:key)。

有关更多详细信息,请参阅表体过度支撑部分。

表格样式选项

表格样式

<b-table> 提供几个属性来更改表的样式:

属性 类型 说明
striped Boolean 将斑马线添加到<tbody>
bordered Boolean 用于表格和单元格所有边上的边框。
borderless Boolean 从表中删除内部边框。
outlined Boolean 在桌子的所有边上画一条细线。如果设置了bordered,则不起作用。
small Boolean 通过将单元格填充减半使表更紧凑。
hover Boolean <tbody>中的表行上启用悬停突出显示状态
dark Boolean 反转颜色-在深色背景上使用浅色文本(相当于Bootstrap v4 class.table-dark
fixed Boolean 生成具有相等固定宽度列的表(table-layout: fixed;
responsive Boolean or String 生成响应表格以使其水平滚动。对于始终响应的表,将其设置为true,或将其设置为断点'sm', 'md', 'lg',和 'xl', 以使表仅在小于断点的屏幕上响应(水平滚动)。请参阅下面的响应表格以了解详细信息。
sticky-header Boolean or String 生成带有粘性标题的垂直可滚动表。设置为true可启用粘性标题(默认表最大高度为300pxpx), 或设置为包含高度的字符串(使用CSS单位)可指定300pxpx以外的最大高度。有关详细信息,请参阅下面的粘性页眉部分。
stacked Boolean or String 生成响应堆栈表。对于始终堆叠的表,将其设置为true, 或将其设置为断点'sm', 'md', 'lg',和 'xl'之一,以使表仅在小于断点的屏幕上可视堆叠。有关详细信息,请参见下面的堆叠表格
caption-top Boolean 如果table上有标题,并且此属性设置为true,则标题将可视地放置在table上方。 如果为false(默认值),则标题将可视地放置在table下方。
table-variant String 为表格提供整体主题颜色。
head-variant String 使用'light''dark'分别使表格标题显示为浅色或深灰色
foot-variant String 使用'light''dark'使表格页脚分别显示为浅灰色或深灰色。 如果未设置,将使用head-variant。 如果未设置foot-clone,则无效
foot-clone Boolean 打开表格页脚,并默认使用与表格页眉相同的内容
no-footer-sorting Boolean foot-clone为true并且表可排序时, 将禁用排序图标和对页脚标题单元格的单击行为。 有关更多详细信息,请参阅下面的排序部分。
no-border-collapse Boolean 禁用折叠表格边框的默认设置。 主要用于sticky headers和/或sticky columns。 在某些情况下会导致出现双边框。

注意: fixed, stacked, caption-top, no-border-collapse,粘性标题,粘性列以及表排序功能的表格样式选项均需要Bootstrap Vue自定义CSS。

示例: 基本表格样式

Table Options
Head Variant
First Name Last Name Age
Dickerson Macdonald 40
Larsen Shaw 21
Geneva Wilson 89
<template>
  <div>
    <b-form-group label="Table Options" label-cols-lg="2">
      <b-form-checkbox v-model="striped" inline>Striped</b-form-checkbox>
      <b-form-checkbox v-model="bordered" inline>Bordered</b-form-checkbox>
      <b-form-checkbox v-model="borderless" inline>Borderless</b-form-checkbox>
      <b-form-checkbox v-model="outlined" inline>Outlined</b-form-checkbox>
      <b-form-checkbox v-model="small" inline>Small</b-form-checkbox>
      <b-form-checkbox v-model="hover" inline>Hover</b-form-checkbox>
      <b-form-checkbox v-model="dark" inline>Dark</b-form-checkbox>
      <b-form-checkbox v-model="fixed" inline>Fixed</b-form-checkbox>
      <b-form-checkbox v-model="footClone" inline>Foot Clone</b-form-checkbox>
      <b-form-checkbox v-model="noCollapse" inline>No border collapse</b-form-checkbox>
    </b-form-group>
    <b-form-group label="Head Variant" label-cols-lg="2">
      <b-form-radio-group v-model="headVariant" 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
        v-model="tableVariant"
        :options="tableVariants"
        id="table-style-variant"
      >
        <template v-slot: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 String, Array or Function 应用于表上每一行的类。 如果给出了一个函数,它将被称为 tbodyTrClass( item, type ), 并且它可能返回一个ArrayObjectString
tbody-tr-attr Object or Function 应用于表上每一行的属性。 如果给出了一个函数,它将被称为tbodyTrAttr( item, type ),并且它必须返回一个Object

将函数引用传递给tbody-tr-classtbody-tr-attr时,该函数的参数如下:

  • item - 项目记录与行关联的数据。 对于与项目记录不相关的行,此值将为nullundefined
  • type - 呈现的行的类型。 'row'用于项目行, 'row-details'用于项目明细行, 'row-top'用于固定行顶部插槽, 'row-bottom'用于固定行底部插槽, 或'table-busy'用于table繁忙时段。

示例: 基本行样式

First Name Last Name Age
Dickerson Macdonald 40
Larsen Shaw 21
Geneva Wilson 89
<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>

响应表格

响应式表格允许轻松地水平滚动表。 通过将prop设置为true, 使所有表在所有视口中都具有responsive。 或者,通过将prop设置为响应以下断点值之一来选择最大响应点,以使其具有responsivesm, md, lg, 或 xl.

示例: 始终响应表格

Heading1 Heading2 Heading3 Heading4 Heading5 Heading6 Heading7 Heading8 Heading9 Heading10 Heading11 Heading12
table cell table cell table cell table cell table cell table cell table cell table cell table cell table cell table cell table cell
table cell table cell table cell table cell table cell table cell table cell table cell table cell table cell table cell table cell
table cell table cell table cell table cell table cell table cell table cell table cell table cell table cell table cell table cell
<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,它会剪裁超出表底部或顶部边缘的所有内容。 特别是,这可能会剪切下拉菜单和其他第三方小部件。
  • 使用responsivefixed在一起的属性将无法正常工作。 固定表格布局使用第一行(在这种情况下为表格标题)来计算每一列所需的宽度(以及表格的整体宽度)以适合父容器的宽度-无需考虑 <tbody>中的单元格- 导致表可能没有响应。 要解决此限制,您将需要通过以下方法之一为列(或某些列)指定宽度:

堆叠表格

作为响应表格的替代方法,BootstrapVue包括堆叠表格选项(使用自定义SCSS / CSS),该选项允许以可视堆叠格式呈现表。 通过将属性stacked 设置为true,可以在所有视口中堆叠任何表格。 或者,通过将stacked的prop设置为断点值 'sm', 'md', 'lg''xl'.之一来设置断点,表将在该断点处恢复为正常的表格式。

列标题标签将使用CSS ::before伪元素呈现在每个字段值的左侧,宽度为40%。

stacked的属性优先于响应式道具,sticky-header属性 和stickyColumn字段定义属性。

示例: Always 堆积表

40
Dickerson
Macdonald
21
Larsen
Shaw
89
Geneva
Wilson
<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>

注意: 当table被视觉上堆叠时:

  • 表格标题(和表格页脚)将被隐藏。
  • 自定义呈现的标题槽将不会显示,而是使用字段的label
  • 无法通过单击呈现的字段标签对表进行排序。 您将需要提供一个外部控件来选择要排序的字段和排序方向。 有关对控件信息进行排序的信息,请参见下面的Sorting部分; 对于使用表单控件来控制排序的示例,请参见本页底部的 完整实例
  • 在视觉上堆叠时,top-rowbottom-row排插槽将被隐藏
  • 表格标题(如果提供)在视觉上堆叠时将始终显示在表格的顶部。
  • 在始终堆叠的表中,表的页眉和页脚以及固定的顶部和底部行插槽 将不会被渲染。

为了支持堆叠表格,需要BootstrapVue的自定义CSS。

表格标题

通过属性caption或命名的slot table-caption(插槽优先于prop),向表中添加可选标题。 默认的Bootstrap v4样式将标题放在表格的底部:

This is a table caption.
First Name Last Name Age
Dickerson Macdonald 40
Larsen Shaw 21
Geneva Wilson 89
<template>
  <div>
    <b-table :items="items" :fields="fields">
      <template v-slot: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来将标题放置在表格的顶部:

This is a table caption at the top.
First Name Last Name Age
Dickerson Macdonald 40
Larsen Shaw 21
Geneva Wilson 89
<template>
  <div>
    <b-table :items="items" :fields="fields" caption-top>
      <template v-slot: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 Number 呈现表中的列数
fields Array 字段定义对象数组(标准化为对array of objects

提供时, table-colgroup插槽的内容将放置在元素内。 无需提供您自己的外部<colgroup>元素。 如果出于辅助技术的原因应将一系列表列分组(为了传达逻辑列关联,请使用<col span="#">元素(用#替换为分组列的数量)来对一系列列进行分组。

提示: 在某些情况下,当尝试通过元素上的 styleclass设置列宽时,您可能会发现将表置于固定标题宽度(表固定布局模式)模式与responsive(水平滚动)模式结合使用会有所帮助,尽管您将需要通过样式或类为每个列的相应<col>元素设置显式宽度或最小宽度。例如:

<b-table fixed responsive :items="items" :fields="fields" ... >
  <template v-slot:table-colgroup="scope">
    <col
      v-for="field in scope.fields"
      :key="field.key"
      :style="{ width: field.key === 'foo' ? '120px' : '180px' }"
    >
  </template>
  <!-- additional table slots here if needed -->
</b-table>

表格忙碌状态

<b-table>提供了一个忙碌属性,它将把table标记为busy,您可以在更新商品之前将其设置为true,然后在拥有商品后将其设置为false。当处于繁忙状态时,该表将具有属性aria-busy="true"

在繁忙状态期间,将使用以下自定义CSS将表呈现为“静音”外观(opacity: 0.6):

/* Busy table styling */
table.b-table[aria-busy='true'] {
  opacity: 0.6;
}

您可以使用自己的CSS覆盖此样式。

您可以选择提供一个table-busy 插槽,以在表的忙状态为真时显示自定义加载消息或微调框。 该插槽将放置在 b-table-busy-slot类的 <tr>元素中,该元素具有一个单个<td> ,且colspan设置为字段数。

表格table-busy用法:

First Name Last Name Age
Dickerson MacDonald 40
Larsen Shaw 21
Geneva Wilson 89
Jami Carney 38
<template>
  <div>
    <b-button @click="toggleBusy">Toggle Busy State</b-button>

    <b-table :items="items" :busy="isBusy" class="mt-3" outlined>
      <template v-slot: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>组件中没有忙碌的样式和插槽。

自定义数据渲染

可以使用scoped slots或格式化程序回调函数或两者结合来为行中的每个数据字段自定义呈现。

范围字段插槽

范围字段槽使您可以更好地控制记录数据的显示方式。 您可以使用作用域内的插槽为特定字段提供自定义呈现。 如果要添加记录中不存在的额外字段, 只需将其添加到fields 数组,然后在作用域插槽中引用该字段。 范围字段槽使用以下命名语法:'cell(' + field key + ')'

您可以使用默认的后备作用域作用域插槽'cell()'来格式化没有提供显式作用域插槽的所有单元格。

示例: 具有作用域插槽的自定义数据呈现

Index Full Name Age Sex First name and age
1 DOE, John 42 Male John is 42 years old
2 DOE, Jane 36 Female Jane is 36 years old
3 KINCADE, Rubin 73 Male Rubin is 73 years old
4 PARTRIDGE, Shirley 62 Female Shirley is 62 years old
<template>
  <div>
    <b-table small :fields="fields" :items="items" responsive="sm">
      <!-- A virtual column -->
      <template v-slot:cell(index)="data">
        {{ data.index + 1 }}
      </template>

      <!-- A custom formatted column -->
      <template v-slot:cell(name)="data">
        <b class="text-info">{{ data.value.last.toUpperCase() }}</b>, <b>{{ data.value.first }}</b>
      </template>

      <!-- A virtual composite column -->
      <template v-slot:cell(nameage)="data">
        {{ data.item.name.first }} is {{ data.item.age }} years old
      </template>

      <!-- Optional default data cell scoped slot -->
      <template v-slot:cell()="data">
        <i>{{ data.value }}</i>
      </template>
    </b-table>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        fields: [
          // A virtual column that doesn't exist in items
          'index',
          // A column that needs custom formatting
          { key: 'name', label: 'Full Name' },
          // A regular column
          'age',
          // A regular column
          'sex',
          // A virtual column made up from two fields
          { 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 Number 相对于显示行的行号(从零开始索引)
item Object 该行的全部原始记录数据(即items[index])(在应用任何格式化程序之前)
value Any 记录中此键的值(如果为虚拟列,则为nullundefined),或字段的格式化程序 功能的输出
unformatted Any 在传递给字段的格式化程序 功能之前, 该键在项目记录中的原始值(如果为虚拟列,则为nullundefined
field Object 字段的规范化字段定义对象
detailsShowing Boolean 如果该行的row-details范围的广告位可见, 则为true。有关其他信息,请参见下面的 row-details scoped slot is visible. See section 行详情信息支持部分。
toggleDetails Function 可以调用此选项来切换行的 row-details 范围的作用域插槽。 有关其他信息,请参见下面的行详情信息支持部分。
rowSelected Boolean 如果已选择该行,则为true。有关其他信息,请参见行选择支持部分。
selectRow Function 调用时,选择当前行。 有关其他信息,请参见行选择支持部分。
unselectRow Function 调用时,取消选择当前行。 有关其他信息,请参见行选择支持部分。

注意:

  • index 并非总是实际行的索引号,因为它是在对原始表数据应用了过滤,排序和分页之后计算的。 index值将参考显示的行号。 该数字将与可选v-model 绑定变量的索引对齐。
  • 在使用新的Vue 2.6 v-slot语法时,请注意,插槽名称不能 包含空格,并且在使用浏览器内DOM模板时,插槽名称将始终小写。 为了解决这个问题,您可以使用Vue的dynamic slot names

显示原始HTML

默认情况下,b-table 会在item数据和格式化程序功能的结果中转义HTML标记,如果需要在b-table 中显示原始HTML代码,则应在作用域内的字段插槽中的元素上使用v-html指令。

Text Html
This is <i>escaped</i> content This is raw HTML content
<template>
  <div>
    <b-table :items="items">
      <template v-slot: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属性。 此属性的值可以是String或函数引用。 如果为String值,则必须在父组件的方法中定义函数。 在将格式化程序作为函数提供时,除非已绑定到此上下文,否则必须在全局范围(在Vue的窗口或在Vue上作为全局mixin或作为匿名函数)进行声明。

回调函数接受三个参数-value, key,和 item,并且应以字符串形式返回格式化的值(不支持HTML字符串)

示例: 使用格式化程序回调函数自定义数据呈现

Full Name Age Sex Calculated Birth Year
John Doe 42 M 1978
Jane Doe 36 F 1984
Rubin Kincade 73 M 1947
Shirley Partridge 62 F 1958
<template>
  <div>
    <b-table :fields="fields" :items="items">
      <template v-slot:cell(name)="data">
        <!-- `data.value` is the value after formatted by the Formatter -->
        <a :href="`#${data.value.replace(/[^a-z]+/i,'-').toLowerCase()}`">{{ data.value }}</a>
      </template>
    </b-table>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        fields: [
          {
            // A column that needs custom formatting,
            // calling formatter 'fullName' in this app
            key: 'name',
            label: 'Full Name',
            formatter: 'fullName'
          },
          // A regular column
          'age',
          {
            // A regular column with custom formatter
            key: 'sex',
            formatter: value => {
              return value.charAt(0).toUpperCase()
            }
          },
          {
            // A virtual column with custom formatter
            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>

还可以为表格theadtfoot元素提供自定义呈现。 请注意,默认情况下,除非将 foot-clone设置为true,否则不会呈现表页脚。

页眉和页脚单元格的作用域插槽分别使用特殊的命名约定'head(<fieldkey>)''foot(<fieldkey>)'。 如果未提供字段的 'foot(...)'插槽,但提供了 'head(...)'插槽,则页脚将使用 'head(...)'插槽内容。

您可以使用默认的后备作用域作用域插槽'head()''foot()'来格式化没有提供显式作用域插槽的任何页眉或页脚单元格。

FULL NAME Age Sex
John Doe 42 Male
Jane Doe 36 Female
Rubin Kincade 73 Male
Shirley Partridge 62 Female
Full Name Age Sex
<template>
  <div>
    <b-table :fields="fields" :items="items" foot-clone>
      <!-- A custom formatted data column cell -->
      <template v-slot:cell(name)="data">
        {{ data.value.first }} {{ data.value.last }}
      </template>

      <!-- A custom formatted header cell for field 'name' -->
      <template v-slot:head(name)="data">
        <span class="text-info">{{ data.label.toUpperCase() }}</span>
      </template>

      <!-- A custom formatted footer cell for field 'name' -->
      <template v-slot:foot(name)="data">
        <span class="text-danger">{{ data.label }}</span>
      </template>

      <!-- Default fall-back custom formatted footer cell -->
      <template v-slot:foot()="data">
        <i>{{ data.label }}</i>
      </template>
    </b-table>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        fields: [
          // A column that needs custom formatting
          { key: 'name', label: 'Full Name' },
          // A regular column
          'age',
          // A regular column
          '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>

插槽可以选择范围(上例中的数据),并具有以下属性:

属性 类型 描述
column String 字段的关键值
field Object 字段的对象(来自字段属性)
label String 字段标签值(也可以作为data.field.label使用)
selectAllRows Method 选择所有行(如果表处于可选模式,则适用
clearSelected Method 取消选择所有行(如果表处于可选模式,则适用

head(...)foot(...)插槽内放置输入,按钮,选择或链接时,请注意,单击输入,选择,文本区域时,将不会发出单击事件(除非已禁用它们) 。 单击作用域内的插槽中的链接或按钮时,即使单击禁用,也不会发出用鼠标点击的标题

笔记:

  • 在使用新的Vue 2.6 v-slot语法时, 请注意,插槽名称>包含空格,并且在使用浏览器内DOM模板时,插槽名称将始终小写。 为了解决这个问题,您可以使用Vue的dynamic slot names传递插槽名称

向标题添加其他行

如果您想在标题中添加其他行,可以通过thead-top插槽进行。 该插槽插入标头单元格行之前,并且不会被<tr>..</tr>标记自动封装。 建议使用BootstrapVue表格帮助器组件,而不要使用本机浏览器表子元素。

Name and ID Type 1 Type 2 Type 3
Name ID Type 1 Type 2A Type 2B Type 2C Type 3
Stephen Hawking 1 false true false false false
Johnny Appleseed 2 false true true false false
George Washington 3 false false false false true
Albert Einstein 4 true false false true false
Isaac Newton 5 true true false true false
<template>
  <div>
    <b-table
      :items="items"
      :fields="fields"
      responsive="sm"
    >
      <template v-slot: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 Number 呈现表中的列数
fields Array 字段定义对象数组(标准化为对象数组格式)
selectAllRows Method 选择所有行(如果表处于selectable模式,则适用
clearSelected Method 取消选择所有行(如果表处于selectable 模式,则适用

如果需要对<tfoot>的内容进行更大的布局控制,则可以使用可选范围的插槽 custom-foot 提供自己的行和单元格。 使用BootstrapVue的表助手子组件 <b-tr>, <b-th>,和 <b-td>生成自定义页脚布局。

插槽custom-foot可以选择范围,接收具有以下属性的对象:

属性 类型 描述
columns Number 呈现表中的列数
fields Array 字段定义对象数组(标准化为对象数组格式)
items Array 当前显示的项记录的数组-过滤,排序和分页后

笔记:

  • 如果设置了custom-foot属性,则不会渲染foot-clone
  • 单击自定义英尺单元时,不会发出单击事件。
  • 当表格处于视觉堆叠模式时,自定义页脚将不会显示。

通过插槽自定义空白和EmptyFiltered渲染

除了使用empty-text, empty-filtered-text, empty-html,和 empty-filtered-html外,还可以为没有数据的表提供自定义呈现,而表中没有要使用命名槽显示的数据。

为了显示这些插槽,必须设置show-empty属性,并且项必须为falsy或长度为0的数组。

<div>
  <b-table :fields="fields" :items="items" show-empty>
    <template v-slot:empty="scope">
      <h4>{{ scope.emptyText }}</h4>
    </template>
    <template v-slot:emptyfiltered="scope">
      <h4>{{ scope.emptyFilteredText }}</h4>
    </template>
  </b-table>
</div>

插槽可以选择范围。 插槽的范围(上例中的作用域)将具有以下属性:

属性 类型 描述
emptyHtml String empty-html属性
emptyText String empty-text属性
emptyFilteredHtml String empty-filtered-html属性
emptyFilteredText String empty-filtered-text属性
fields Array fields属性
items Array items属性,Exposed here to check null vs []

高级功能

粘页眉

使用sticky-header属性启用垂直滚动表,并在表主体滚动时保持标题不变(粘滞)。 将prop设置为true(或没有显式值)将生成一个最大高度为300px的表。 要指定300px以外的最大高度,请将sticky-header 属性设置为有效的CSS高度(包括单位),即sticky-header="200px"。 如果表大于可用的水平空间,则启用粘性页眉的表也将自动始终保持水平响应,而不管responsive属性设置如何。

Heading1 Heading2 Heading3
table cell table cell table cell
table cell table cell table cell
table cell table cell table cell
table cell table cell table cell
table cell table cell table cell
table cell table cell table cell
table cell table cell table cell
table cell table cell table cell
table cell table cell table cell
table cell table cell table cell
table cell table cell table cell
table cell table cell table cell
<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>中,并设置了最大高度。
  • 需要BootstrapVue的自定义CSS才能支持sticky-header
  • Bootstrap v4使用CSS样式border-collapse: collapsed: 在表格元素上折叠。 这样可以防止粘性标头上的边框“粘在”标头上,因此,当正文滚动时,边框也会滚动。 要解决此问题,请在表格上设置属性no-border-collapse (注意,使用带边框等功能时,这可能会导致边框宽度加倍)。
  • 粘性标头功能使用CSS样式位置:position: sticky。 Internet Explorer不支持位置:position: sticky,因此对于IE 11,表标题将与表主体一起滚动。

粘性列

可以将列设置为粘性列,当表格具有水平滚动条时,列会停留在表格的左侧。 要将列设为stickyColumn, 请在字段的标题定义中设置stickyColumn属性。 粘性列仅在表格具有sticky-header属性设置和/或已设置响应属性时才起作用。

示例:粘性列和标题

Row ID
Heading A
Heading B
Heading C
Heading D
Heading E
Heading F
Heading G
Heading H
Heading I
Heading J
Heading K
Heading L
1 0 1 2 3 4 5 6 7 8 9 10 11
2 0 1 2 3 4 5 6 7 8 9 10 11
3 0 1 2 3 4 5 6 7 8 9 10 11
4 0 1 2 3 4 5 6 7 8 9 10 11
5 0 1 2 3 4 5 6 7 8 9 10 11
6 0 1 2 3 4 5 6 7 8 9 10 11
7 0 1 2 3 4 5 6 7 8 9 10 11
8 0 1 2 3 4 5 6 7 8 9 10 11
9 0 1 2 3 4 5 6 7 8 9 10 11
10 0 1 2 3 4 5 6 7 8 9 10 11
<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"
    >
      <!-- We are using utility class `text-nowrap` to help illustrate horizontal scrolling -->
      <template v-slot:head(id)="scope">
        <div class="text-nowrap">Row ID</div>
      </template>
      <template v-slot: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>

粘性列注释:

  • 如果表格具有堆积的属性集,则粘性列无效。
  • 粘性列表需要sticky-header 和/或 responsive模式,并包装在可水平滚动的<div>中。
  • 当您将多个列设置为stickyColumn时,这些列将在视觉上相互堆叠,并且最左边的粘性列可能会从下一个粘性列下方“窥视”。 要解决此问题,请确保后面的stickyColumns与以前的sticky列具有相同的宽度或宽度。
  • Bootstrap v4使用CSS样式border-collapse: collapsed在表格元素上折叠。 这样可以防止粘滞列上的任何边界“粘连”到列上,因此,当正文滚动时,这些边界也将滚动。 要解决此问题,请在表格上设置属性 no-border-collapse(注意,使用带边框等功能时,这可能会导致边框宽度加倍)。
  • 为了支持粘性列,需要BootstrapVue的自定义CSS。
  • 粘性列功能使用CSS样式position: sticky以定位列单元格。 Internet Explorer不支持position: sticky,因此对于IE 11,粘性列将随表格主体滚动。

行详细信息支持

如果您可以选择显示其他记录信息(例如,在字段定义数组中未指定的列),则可以将作用域内的row-details与 特殊项目记录布尔属性_showDetails结合使用。

如果记录的_showDetails属性设置为true, 并且存在row-details的槽,则将在该项目的正下方显示新行,并显示row-details的槽的内容。

在作用域字段插槽中,您可以通过调用传递到该字段作用域插槽变量的toggleDetails函数, 来切换行的row-details 作用域插槽的可见性。 您可以使用作用域字段插槽变量detailsShowing确定row-details插槽的可见性。

注意: 如果直接在项目数据上操作_showDetails属性 (即不通过toggleDetails函数引用), 则_showDetails必须正确存在于项目数据中,以便正确地检测其值的更改。 阅读有关Vue的反应性限制的更多信息。

可用的 行详细信息范围的变量属性:

属性 类型 描述
item Object 整行记录数据对象
index Number 当前可见行号
fields Array 标准化字段定义数组(以对象数组格式)
toggleDetails Function 切换行的详细信息栏可见性的功能
rowSelected Boolean 如果已选择该行,则为true。 有关其他信息, 请参见Row select support部分。
selectRow Function 调用时,选择当前行。 有关其他信息,请参见Row select support部分。
unselectRow Function 调用时,取消选择当前行。 有关其他信息,请参见Row select support部分。

注意:与行选择相关的范围属性仅在<b-table>中可用。

在下面的示例中,我们显示了两种切换细节可见性的方法:一种通过按钮,另一种通过复选框。 我们还有第三行详细信息,默认情况下最初会显示详细信息。

First Name Last Name Show Details
Dickerson Macdonald
Larsen Shaw
Geneva Wilson
Age:
89
Is Active:
false
Jami Carney
<template>
  <div>
    <b-table :items="items" :fields="fields" striped responsive="sm">
      <template v-slot:cell(show_details)="row">
        <b-button size="sm" @click="row.toggleDetails" class="mr-2">
          {{ row.detailsShowing ? 'Hide' : 'Show'}} Details
        </b-button>

        <!-- As `row.showDetails` is one-way, we call the toggleDetails function on @change -->
        <b-form-checkbox v-model="row.detailsShowing" @change="row.toggleDetails">
          Details via check
        </b-form-checkbox>
      </template>

      <template v-slot: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': 一次只能选择一行
  • 'range': 选择任何单击的行,取消选择任何其他行。 SHIFT + 单击选择行范围,然后, 和CTRL (或 CMD) +单击将切换选定的行。

当一个表格是selectable的并且用户单击一行时,<b-table> 将发出row-selected的事件,并传递单个参数,该参数是所选项目的完整列表。将此参数视为只读。

还可以通过<b-table>实例上的以下公开方法以编程方式选择和取消选择行(即通过this.$refs对表实例的引用):

方法 描述
selectRow(index) 选择具有给定索引号的行。
unselectRow(index) 取消选择具有给定索引号的行。
selectAllRows() 选择表中的所有行,但在模式下除外,在这种情况下,仅选择第一行。
clearSelected() 取消选择所有行。
isRowSelected(index) 如果选择了具有给定 索引的行,则返回true; 否则返回false

程序行选择注意事项:

  • index是在应用了过滤,排序和分页之后,表的可见行 从零开始的索引。
  • 模式下,selectRow(index)将取消选择任何先前选择的行。
  • 尝试在不存在的行上选择selectRow(index)unselectRow(index)将被忽略。
  • 该表必须可选中所有这些方法才能生效。
  • 您可以通过设置no-select-on-click 属性来通过点击事件禁用行选择。 然后只能通过编程选择行。

行选择注释:

  • 对表进行Sorting, filtering, 或 paginating清除活动的选择。 如果需要,将以空数组([])发出行选择的事件。
  • 当表处于 可选模式时, 出于可访问的原因,所有数据项<tr>元素都将位于文档选项卡序列中(tabindex="0"), 并且将 aria-selected属性设置为 'true''false'取决于行的选定状态。
  • 当一个表是可选的时, 该表将把aria-multiselect 属性设置为'false' (对于'单'模式)和'true' (对于模式或范围模式)。

<b-table>是可选的时,它将在<table>元素上 具有b-table-selectable和以下三个类之一(取决于所使用的模式):

  • b-table-select-single
  • b-table-select-multi
  • b-table-select-range

当选择至少一行时,b-table-selecting类 将在<table>元素上处于活动状态。 选定行的行将对 <tr>元素应用一类b-table-row-selected

使用属性selected-variant将Bootstrap主题颜色应用于选定的行。 注意,由于表变量在Bootstrap的CSS中定义的顺序,因此任何行变量都可能优先于选择变量。 如果您将使用其他方式来表示已选择行(例如,下例中的作用域字段槽),则可以将selected-variant设置为空字符串。

selected-variant可以是任何标准(或自定义)引导程序基本颜色变体, 也可以是优先于任何特定行或单元格变量的特殊active 变量(默认值)。

出于可访问性的原因(特别是对于色盲用户或有色差问题的用户),强烈建议始终提供其他视觉方式来传达已选择行的信息,例如下面示例中显示的虚拟列。

Selection mode:
Selected Is Active Age First Name Last Name
Not selected true 40 Dickerson Macdonald
Not selected false 21 Larsen Shaw
Not selected false 89 Geneva Wilson
Not selected true 38 Jami Carney

Selected Rows:
[]

<template>
  <div>
    <b-form-group label="Selection mode:" label-cols-md="4">
      <b-form-select v-model="selectMode" :options="modes" class="mb-3"></b-form-select>
    </b-form-group>

    <b-table
      ref="selectableTable"
      selectable
      :select-mode="selectMode"
      :items="items"
      :fields="fields"
      @row-selected="onRowSelected"
      responsive="sm"
    >
      <!-- Example scoped slot for select state illustrative purposes -->
      <template v-slot:cell(selected)="{ rowSelected }">
        <template v-if="rowSelected">
          <span aria-hidden="true">&check;</span>
          <span class="sr-only">Selected</span>
        </template>
        <template v-else>
          <span aria-hidden="true">&nbsp;</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() {
        // Rows are indexed from 0, so the third row is index 2
        this.$refs.selectableTable.selectRow(2)
      },
      unselectThirdRow() {
        // Rows are indexed from 0, so the third row is index 2
        this.$refs.selectableTable.unselectRow(2)
      }
    }
  }
</script>

表格内容过渡支持

可以通过内部使用Vue的<tbody>组件在元素上支持Vue<transition-group>。 提供了三个支持过渡的道具(所有三个道具默认为undefined):

属性 类型 描述
tbody-transition-props Object 过渡组属性的对象
tbody-transition-handlers Object 过渡组事件处理程序的对象
primary-key String 字符串,指定要用作唯一行键的字段(必填)

要启用转换,您需要指定tbody-transition-props 和/或 tbody-transition-handlers, 并且必须通过主键属性指定要用作唯一键的字段键。 您的数据必须具有一列(通过将主键属性设置为字段名称来指定), 该列每行必须具有唯一值,以使转换正常工作。 主键字段的值可以是唯一的字符串或数字。 指定的字段不需要出现在呈现的表输出中,但是必须存在于item数据的每一行中。

您还必须提供CSS来处理项目中的过渡(如果使用CSS过渡)。

有关Vue的列表呈现过渡的更多信息,请参见 Vue JS 官方文档

在下面的示例中,我们使用了以下自定义CSS:

table#table-transition-example .flip-list-move {
  transition: transform 1s;
}
A (Click to sort Ascending) B (Click to sort Ascending) C (Click to sort Ascending)
2 Two Moose
1 Three Dog
3 Four Cat
4 One Mouse
<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: {
          // Transition name
          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属性, 则此变量的内容将是当前显示的项目记录(从零开始的索引,最大也页面大小-1)。 通常应将此变量(属性)视为只读。

v-model中的记录是项的过滤/分页浅表副本, 因此,对v-model中记录属性的任何更改都将反映在原始项数组中(将项设置为提供程序功能时除外)。 从v-model数组中删除记录不会从原始项目数组中删除记录,也不会从显示的行中删除记录。

注意: 请勿将任何值直接绑定到属性。使用v-model绑定。

排序

如上文 字段部分所述, 您可以使列在<b-table>中可排序。 单击可排序的列标题将按升序对列进行排序(从小到大),而再次单击将将排序方向切换为降序(从大到大)。 单击不可排序的列将清除排序(可以使用属性no-sort-reset禁用此功能)。

您可以控制对哪一列进行预排序以及排序顺序(升序或降序)。 要预先指定要排序的列,请将sort-by属性设置为字段的键。 通过将sort-desc设置为true(降序) 或false(默认值升序)来设置排序方向。

  • 上升: 项目按从低到高的顺序(即AZ)排序,并在第一行中以最低的值显示,在随后的行中以更高的值显示。
  • 降序: 项目按从高到低的顺序(即AZ)排序,并在第一行中以最高值显示,在随后的行中以较低的值显示。

通过添加.sync修饰符, 可以将props sort-bysort-desc转换为双向(可同步)props。 然后,将根据当前的排序标准相应地更新您的绑定变量。 有关.sync属性修饰符的详细信息,请参见Vue 文档

排序依据设置为未在字段中定义为可排序的列将导致表未排序。

设置属性foot-clone后,即使您具有自定义格式的页脚字段标题, 页脚标题也将允许通过单击进行排序。 若要禁用排序图标和通过单击页脚中的标题单击来进行排序,请将无页脚排序属性设置为true。

Last Name (Click to sort Ascending) First Name (Click to sort Ascending) Age (Click to sort Descending) Is Active (Click to clear sorting)
Shaw Larsen 21 false
Carney Jami 38 true
Macdonald Dickerson 40 true
Wilson Geneva 89 false
Sorting By: age, Sort Direction: Ascending
<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>上设置属性sort-icon-left 来更改图标以使其左对齐。

Last Name (Click to sort Ascending) First Name (Click to sort Ascending) Age (Click to sort Descending) Is Active (Click to clear sorting)
Shaw Larsen 21 false
Carney Jami 38 true
Macdonald Dickerson 40 true
Wilson Geneva 89 false
Sorting By: age, Sort Direction: Ascending
<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函数根据基础记录对象中的数据对指定的字段 进行排序(如果字段具有格式化程序功能,并且该字段的sortByFormatted属性设置为true,则按格式化值排序)。 如果字段值是一个对象,则首先对其进行字符串化,然后进行排序。

注意事项:

  • 内置的sort-compare例程无法基于字段数据的自定义呈现进行排序:作用域插槽仅用于显示,不会影响基础数据。
  • 如果字段属性sortByFormatted设置为true,则具有 格式化程序 功能字段(虚拟字段或常规字段)可以通过格式化程序功能返回的值进行排序。(可选)您可以将格式器函数引用传递给sortByFormatted, 以在排序之前对值进行格式化。 默认值为false,它将按原始字段值排序。 这仅适用于内置的sortByFormatted例程。
  • 默认情况下,内部排序例程将首先对null, undefined或空字符串值(小于任何其他值)进行排序。 要排序以使null, undefined或空字符串值最后出现(大于任何其他值), 请将sort-null-last属性设置为true

要自定义排序比较处理,请参阅下面的自定义排序比较例程部分。

内部排序和语言环境处理

内部sort-compare例程使用 String.prototype.localeCompare() 来比较字符串化的列值(如果要比较的值既不是Number 也不是Date类型)。浏览器的本地localeCompare() 方法接受一个语言环境字符串(或语言环境字符串数组)和一个用于控制字符串排序方式的options对象。 默认选项为{ numeric: true },并且语言环境未定义(使用浏览器的默认语言环境)。

您可以通过sort-compare-locale属性更改语言环境, 以设置要进行排序的语言环境,也可以通过sort-compare-options属性传递排序选项。

sort-compare-locale属性默认为undefined, 它使用浏览器(或Node.js运行时)的默认语言环境。属性sort-compare-locale可以接受BCP 47 language tag 字符串或此类标签的数组。 有关语言环境的更多详细信息,请参阅MDN上的Locale identification and negotiation

sort-compare-options属性接受包含以下任何属性的对象:

  • localeMatcher: 要使用的语言环境匹配算法。 可能的值为'lookup''best fit'。 默认值为'best fit'。 有关此选项的信息,请参见 MDN Intl 页面以获取详细信息。
  • sensitivity: 字符串中的哪些差异应导致比较结果值非零。 可能的值为:
    • '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: 标点符号是否应被忽略。 可能的值为truefalse。 默认值为false
  • numeric: 是否应使用数字排序规则,例如'1' < '2' < '10'。 可能的值为truefalse。 默认值为 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个是可选的:

  • 前两个参数(ab)是要比较的行的记录对象
  • 第三个参数是排序的字段sortBy
  • 第四个参数(sortDesc)是<b-table> 将显示记录的顺序(true为降序,false为升序)
  • 第五个参数是对该字段格式化函数的引用, 或者是该字段的filterByFormatted值(如果它是函数引用)的引用。 如果未找到格式化程序,则该值将是不确定的。如果需要按格式排序,则需要调用此方法以获取格式化的字段值: valA = formatter(a[key], key, a)valB = formatter(b[key], key, b)值。 如果字段的sortByFormatted属性为true或不是格式化程序函数的引用,或者找不到字段格式化程序的函数,则此字段未定义。
  • 第六个参数是sort-compare-options属性的值(默认为{ numeric: true }
  • 第七个参数是sort-compare-locale属性的值(默认为undefined

如果使用String.prototype.localeCompare()方法比较字符串,则可以使用第六和第七个参数。

在大多数典型情况下,您只需要使用前三个参数。 第四个参数-排序方向-通常不应使用,因为b-table将处理该方向, 并且通常仅在对null和/或 undefined值的排序方式进行特殊处理(即首先对null/undefined进行排序或 持续)。

例程应为a[key] < b[key] 返回-1(或负值), 为a[key] === b[key]返回0,或为a[key] > b[key]返回1(或正值)。

您的自定义排序比较例程还可以返回nullfalse, 以回退到特定键的内置排序比较例程。 您可以使用此功能(即,通过返回null)让您的自定义排序比较例程仅处理某些字段(key), 例如虚拟(作用域插槽)列的特殊情况,并具有内部(内置)排序比较 处理所有其他领域。

默认的排序比较例程的工作原理与以下类似。 请注意,排序比较中使用第四个参数(排序方向):

function sortCompare(aRow, bRow, key, sortDesc, formatter, compareOptions, compareLocale) {
  const a = aRow[key] // or use Lodash `_.get()`
  const b = bRow[key]
  if (
    (typeof a === 'number' && typeof b === 'number') ||
    (a instanceof Date && b instanceof Date)
  ) {
    // If both compared fields are native numbers or both are native dates
    return a < b ? -1 : a > b ? 1 : 0
  } else {
    // Otherwise stringify the field data and use String.prototype.localeCompare
    return toString(a).localeCompare(toString(b), compareLocale, compareOptions)
  }
}

// Helper function to stringify the values of an Object
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-changedcontext-changed的事件以及可同步的道具)。

您可以使用可同步属性sort-by.syncsort-desc.sync 来检测排序列和方向的变化。

同样,当单击可排序的列标题(或页脚)时,将通过包含<b-table>上下文对象的单个参数发出 sort-changed的事件。 有关排序已更改事件和上下文对象的详细信息,请参见下面的检测排序更改部分。

no-local-sorting为true时,sort-compare属性无效。

更改初始排序方向

通过使用排序方向属性,控制单击可排序的列标题时应用升序和降序排序的顺序。 默认值'asc'首先应用升序排序(当当前未对列进行排序时)。 要反转行为并首先按降序排序,请将其设置为'desc'

如果您不希望在单击另一个可排序的列标题时更改当前的排序方向, 请将排序方向设置为'last'。 这将保持先前排序列的排序方向。

对于单个列的初始排序方向(当列从未排序过渡到已排序时适用),请在字段中指定属性sortDirection。 有关使用此功能的示例,请参见下面的完整事例

筛选

使用过滤时,默认情况下将过滤应用于原始项数组数据。 b-table提供了几种有关如何过滤数据的选项。

当前无法通过作用域范围内的插槽基于格式化结果进行过滤。

内置过滤

对该项目的行数据值进行字符串化(有关如何完成字符串化,请参见上面的排序部分),并且过滤器搜索该字符串化数据(不包括下划线'_')开头的任何特殊属性)。 默认情况下,字符串化还包括未显示在所提供列中的任何数据。

使用默认的内置过滤器功能, 过滤器支持值可以是字符串或RegExp对象(正则表达式不应设置/g全局标志)。

如果字符串化的行包含提供的字符串值或与RegExp表达式匹配,则它将包含在显示的结果中。

过滤器属性设置为null或为空字符串以清除当前过滤器。

内置过滤选项

有几个选项可用于控制对过滤器应用哪些数据。

  • filter-ignored-fields属性接受一个顶级(行数据的直接属性)字段键的数组,在过滤时应将其忽略。
  • filter-included-fields性接受过滤时应使用的顶级(行数据的直接属性)字段键的数组。 未包括在此数组中的所有其他字段键将被忽略。 要在特定列上进行过滤时,此功能非常方便。 如果指定的数组为空,则包括所有字段,但通过属性filter-included-fields 指定的字段除外。 如果在忽略过滤器的字段和包含过滤器的字段中都指定了字段关键字,则包含过滤器的字段优先。
  • 通常,<b-table>根据已字符串化的记录数据进行过滤。 如果该字段指定了格式化程序功能, 则可以通过将字段定义属性 filterByFormatted 设置为true来基于格式化程序的结果进行过滤。 如果该字段没有格式化程序功能,则忽略此选项。 您可以选择将格式器函数引用(仅用于过滤)传递给字段定义属性filterByFormatted

使用自定义过滤器>功能或基于项目提供程序的过滤时,props的filter-ignored-fieldsfilter-included-fields 字段以及字段定义属性 filterByFormatted无效。

自定义过滤器

您还可以通过将属性 过滤器功能设置为自定义过滤器测试功能的引用来使用自定义过滤器功能。过滤器函数将传递两个参数:

  • 原始项目行记录数据对象,将此参数视为只读。
  • 过滤器性的内容(可以是字符串,RegExp,数组或对象)

如果记录符合您的条件,则该函数应返回true;如果要过滤掉记录, 则该函数应返回false

为了对显示的数据进行适当的反应性更新,在不过滤时,应将过滤器属性设置为 null或空字符串(而不是空对象或数组)。当过滤器属性为假值时,不会调用筛选器功能。

空过滤器文本的显示取决于empty-filter-text的真实性。

过滤事件

当应用本地过滤,并且结果的项目数量发生变化时,<b-table>将发出带有两个参数的过滤事件:

  • 数组引用,它是通过过滤例程的项目的完整列表。将此参数视为只读。
  • 通过过滤器测试的记录数(第一个参数的长度)

将属性过滤器设置为null或空字符串将清除本地项目过滤。

取消过滤条件的更改

在v2.1.0中已弃用 请使用<b-form-input>反跳功能。

如果您的文本输入与<b-table>过滤器属性相关联, 则过滤过程将针对用户键入的每个字符进行。 对于大型项目数据集,此过程可能需要一段时间,并且可能会导致文本输入显示缓慢。

为了帮助缓解这种情况,<b-table> 通过filter-debounce属性接受一个反跳timout值(以毫秒为单位)。 默认值为0(毫秒)。如果提供的值大于0, 则过滤器将等待该时间,然后再更新表格结果。 如果过滤器属性值在该超时时间到期之前发生更改,则过滤将再次延迟,直到防抖动超时时间结束。

使用时,filter-debounce的建议值应 在100200的范围内,但其他值可能更适合您的用例。

在将提供程序过滤与项目提供程序功能一起使用时,使用此道具会很有用,以帮助减少对后端API的调用次数。

过滤器 注意事项

有关使用过滤器功能的示例,请参见下面的完整实例

分页

<b-table>支持内置的项目数据分页。 您可以通过将每页属性设置为想要显示的最大行数来控制一次显示多少行, 并使用当前页属性指定要显示的页面(从第1页开始)。 如果将当前页设置为大于计算的页面数的值,则不会显示任何行。

您可以将<b-pagination> 组件与<b-table>结合使用,以提供对分页的控制。

每页设置为0(默认值)将禁用本地项目分页功能。

使用项目提供者功能

如在项目属性部分所述,通过通过项目属性指定函数引用,可以使用函数来提供行数据(项目)。

使用以下标签属性调用提供程序函数:

provider(ctx, [callback])

ctx 是与表状态关联的上下文对象,并且包含以下五个属性:

属性 类型 描述
currentPage Number 当前页码(从1开始,即当前页属性的值)
perPage Number 每页显示的最大行数(每页属性的值)
filter String or RegExp or Object 过滤器属性的值
sortBy String 当前正在排序的列键,如果未排序则为空字符串
sortDesc Boolean 当前的排序方向(降序为true,升序为false
apiUrl String 提供给api-url属性的值。如果未提供,则为null

第二个参数callback是使用回调异步方法时的可选参数。

示例: 返回数据数组(同步):

function myProvider() {
  let items = []

  // Perform any items processing needed

  // Must return an array
  return items || []
}

示例: 使用回调返回数据(异步):

function myProvider(ctx, callback) {
  const params = '?page=' + ctx.currentPage + '&size=' + ctx.perPage

  this.fetchData('/some/url' + params)
    .then(data => {
      // Pluck the array of items off our axios response
      const items = data.items
      // Provide the array of items to the callback
      callback(items)
    })
    .catch(() => {
      callback([])
    })

  // Must return null or undefined to signal b-table that callback is being used
  return null
}

示例: 使用Promise返回数据(异步):

function myProvider(ctx) {
  const promise = axios.get('/some/url?page=' + ctx.currentPage + '&size=' + ctx.perPage)

  // Must return a promise that resolves to an array of items
  return promise.then(data => {
    // Pluck the array of items off our axios response
    const items = data.items
    // Must return an array of items or an empty array if an error occurred
    return items || []
  })
}

自动表格繁忙状态

使用项目提供程序功能时, <b-table> 自动跟踪/控制其繁忙状态, 但是它还提供了一个繁忙属性,可用于覆盖内部繁忙状态 或监视<b-pagination>当前繁忙 在您的应用程序中使用2-way.sync修饰符声明状态。

注意: 为了允许<b-table>完全跟踪其繁忙状态,自定义项提供程序功能应处理来自数据源的错误, 并将空数组返回到<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 () {
        // Here we don't set isBusy prop, so busy state will be
        // handled by table itself
        // this.isBusy = true
        let promise = axios.get('/some/url')

        return promise.then((data) => {
          const items = data.items
          // Here we could override the busy state, setting isBusy to false
          // this.isBusy = false
          return(items)
        }).catch(error => {
          // Here we could override the busy state, setting isBusy to false
          // this.isBusy = false
          // Returning an empty array, allows table to correctly handle
          // internal busy state in case of error
          return []
        })
      }
    }
  }
</script>

注意事项:

  • 如果您将表手动置于繁忙状态,则在繁忙状态设置 为false之前, 将不会调用/刷新项目提供程序。
  • 处于繁忙状态时(在提供程序更新期间自动设置,或在手动设置时),不会发出所有与单击相关的和悬停事件以及排序更改的事件。

提供者分页,过滤和排序

默认情况下,在将数据传递到b-table进行显示之前,items provider功能负责 所有数据的分页,过滤和排序

您可以通过将以下b-table属性设置为true来禁用提供程序的分页,筛选和排序(分别):

属性 类型 默认值 描述
no-provider-paging Boolean false 如果为true,则启用使用b-table本地数据分页
no-provider-sorting Boolean false 如果为true,则启用使用b-table本地排序
no-provider-filtering Boolean false 如果为true,则启用使用b-table本地过滤

no-provider-pagingfalse (默认值)时,您应仅返回最大的每页记录数。

注意事项:

  • <b-table>需要引用您的分页和过滤器,以便触发提供程序函数的调用。因此, 请确保绑定到<b-table>上的每页, 当前页过滤器属性以触发提供程序更新功能调用(除非您将各自的no-provider-* 属性设置为true)。
  • 项目是提供程序功能时,no-local-sorting属性无效。
  • 使用提供程序筛选时,您可能会发现,将 <b-form-input> 上的防反跳属性 设置为大于100ms的值将有助于减少用户在标准中键入的对后端API的调用次数。

强制刷新表数据

您还可以通过在$root上发出事件 refresh::table来触发提供程序函数的刷新,其中单个参数是b-tableid。 您必须在表上具有唯一的id才能起作用。

this.$root.$emit('bv::refresh::table', 'my-table')

Or by calling the refresh() method on the table reference

<div>
  <b-table ref="table" ... ></b-table>
</div>
this.$refs.table.refresh()

注意: 如果表处于繁忙状态(即当前正在运行提供程序更新),则刷新将一直等到当前更新完成。 如果当前有一个刷新待处理,并且请求一个新的刷新,则将仅发生一次刷新。

检测分类变化

通过侦听<b-table> 排序已更改 的事件,您可以检测到排序键和方向何时已更改。

<div>
  <b-table @sort-changed="sortingChanged" ... ></b-table>
</div>

排序更改事件提供了表的当前状态上下文对象的单个参数。 此上下文对象的格式与项目提供程序功能使用的格式相同。

export default {
  methods: {
    sortingChanged(ctx) {
      // ctx.sortBy   ==> Field key for sorting by (or null for no sorting)
      // ctx.sortDesc ==> true if sorting descending, false otherwise
    }
  }
}

您也可以分别使用::sort-by.sync:sort-desc.sync双向属性来获取当前的sortBy和sortDesc值 (有关详细信息,请参见上面的排序部分)。

<div>
  <b-table :sort-by.sync="mySortBy" :sort-desc.sync="mySortDesc" ... ></b-table>
</div>

服务器端渲染

使用服务器端呈现(SSR)和项目提供程序功能时,必须格外小心。 确保在获取数据时处理服务器端可能需要的任何特殊情况!

在文档中装入<b-table>后,它将自动触发提供程序更新调用。

轻量级表格

如果只需要简单地显示表格数据,那么<b-table-lite> 提供了一个很好的替代<b-table>的方法。 <b-table-lite>组件提供了 <b-table>的所有样式和格式设置功能(包括行详细信息和堆叠支持),但不包括以下功能:

  • 筛选
  • Sorting
  • 排序
  • 项目提供者支持
  • 可选行
  • 繁忙的表格状态和样式
  • 固定顶排和底排
  • 空行支持

表精简版作为插件

TablePlugin包括<b-table-lite>。 为了方便起见,BootstrapVue还提供了TableLitePlugin, 该表仅安装<b-table-lite>TableLitePlugin可以用作名为export的顶层。

简单表格

<b-table-simple>组件使用户可以完全控制表内容的呈现, 同时提供基本的Bootstrap v4表样式。<b-table-simple>是围绕 <table>元素的包装器组件。 通过默认插槽, 可以在组件内部使用任何或所有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, responsivesticky-header。 请注意,堆叠模式可用, 但是需要一些额外的标记来生成单元格标题,如下面的简单表格和堆叠模式部分所述。 还支持粘性列,但是还需要一些额外的标记来指定哪些列是粘性的。 有关使用 粘性列的更多信息,请参见下文。

由于b-table-simple只是一个包装器组件,您将需要在其中封装内容, 因此它不提供<b-table>的任何高级功能(即行事件,头事件,排序,分页,过滤) ,脚步克隆,项目,字段等)。

Items sold in August, grouped by Country and City:
Region Clothes Accessories
Country City Trousers Skirts Dresses Bracelets Rings
Belgium Antwerp 56 22 43 72 23
Gent 46 18 50 61 15
Brussels 51 27 38 69 28
The Netherlands Amsterdam 89 34 69 85 38
Utrecht 80 12 43 36 19
Total Rows: 5
<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>

响应式粘滞标题模式下, <table>元素被包装在<div>元素内。 如果您需要将其他类应用于<table>元素,请使用table-classes属性。

赋予<b-table-simple>的任何其他属性将始终应用于<table>元素。

简单表格和堆叠模式

当表处于堆叠模式时,<b-table-simple>主体单元格上需要一些附加标记。 具体来说,BootstrapVue使用特殊的数据属性来创建单元格的标题,您可以通过 堆栈标题属性将其提供给<b-td><b-th>。 仅支持纯字符串(不支持HTML标记),因为我们使用伪元素:: ::before 和 css content属性。

这是与上述相同的表,设置为始终堆叠,具有额外的标记要处理堆叠模式(专门用于生成单元格标题):

Items sold in August, grouped by Country and City:
Region Clothes Accessories
Country City Trousers Skirts Dresses Bracelets Rings
Belgium (3 Cities)
Antwerp
56
22
43
72
23
Gent
46
18
50
61
15
Brussels
51
27
38
69
28
The Netherlands (2 Cities)
Amsterdam
89
34
69
85
38
Utrecht
80
12
43
36
19
Total Rows: 5
<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>一样, 在可视地堆叠表格时,可视地隐藏了表头()和页脚()。 如果需要页眉或页脚,可以通过在<b-tbody>组件内部 (或在第二个<b-tbody>组件中)创建一个额外的<b-tr> 并将其设置为columnheader<b-th>单元格, 并使用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行组中)上设置粘性列支持。 例如:

<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-responsive>

<b-table><b-table-lite>一样, 当将 堆叠属性设置在<b-table-simple>上时,不支持粘性列。

表格简单易用

TablePlugin包括<b-table-simple>和所有帮助程序组件。 为了方便起见,BootstrapVue还提供了TableSimplePlugin, 该表可安装<b-table-simple>和所有帮助程序组件。 TableSimplePlugin可以用作名为export的顶层。

表格助手组件

当使用<b-table-simple>或命名槽 top-row, bottom-row, thead-top,和 custom-foot(所有这些都接受表子元素)时,BootstrapVue提供了其他辅助子组件。 帮助器组件如下:

  • b-tbody (<b-table-simple> only)
  • b-thead (<b-table-simple> only)
  • b-tfoot (<b-table-simple> only)
  • b-tr
  • b-td
  • b-th

这些组件经过优化,可以处理将变体转换为适当的类(例如处理表格模式), 并自动应用某些辅助功能属性(即角色作用域)。 他们还可以生成堆积表以及粘性标题和列,标记。组件<b-table><b-table-lite>在内部使用这些帮助程序组件。

简单表示例中, 我们使用帮助器组件<b-thead>, <b-tbody>, <b-tr>, <b-th>, <b-tr><b-tfoot>。 虽然您可以在<b-table-simple>中使用常规表子元素 (即<tbody>, <tr>, <td>等), 并在顶部行底部行thead-top中使用命名的插槽, 建议使用这些BootstrapVue表<b-t*>帮助器组件。 请注意,没有<caption>, <colgroup><col>的帮助器组件,因此您可以直接在<b-table-simple>中使用这三个HTML5元素。

  • 表格助手组件<b-tr>, <b-td><b-th>都接受variant属性, 它将应用Bootstrap主题颜色之一(通过主题化支持自定义主题颜色), 并将自动调整为 根据表格的模式使用正确的变体类。
  • 辅助组件<b-thead>, <b-tfoot>分别接受head-variantfoot-variant属性。 支持的值是'dark', 'light'null ( null使用默认的表格背景)。 这些变体还控制文本颜色(“深色”变体为浅色文本, “浅色”变体为深色文本)。
  • 可访问性属性的角色作用域会根据其位置 (thead,tbody或tfoot)及其行距colspan属性在 <b-th><b-td>组件上自动设置。 您可以通过在帮助程序组件上设置适当的属性来覆盖自动 作用域角色值。
  • 对于<b-tbody>, <b-thead>,和 <b-tfoot> 帮助器组件, 将应用适当的默认'rowgroup',除非您通过提供角色属性来 覆盖角色
  • 对于<b-tr>帮助器组件,除非您通过提供角色属性来覆盖 角色,否则将应用适当的默认角色“行”<b-tr>不添加范围
  • 当使用tbody-transition-propstbody-transition-handlers属性中的一个或两个时, <b-tbody>元素支持渲染Vue<transition-group> 。 有关更多详细信息,请参见 表格内容过渡支持 部分。

辅助功能

当使用特定功能时,<b-table><b-table-lite>组件将尝试提供可能的最佳可访问性标记。

在辅助表组件中使用<b-table-simple>时,元素将默认应用适当的角色,您可以选择覆盖这些角色。 在<b-table-simple>帮助器组件上使用单击处理程序时,将需要应用适当的aria-*属性, 并设置tabindex="0"以使屏幕阅读器和纯键盘用户可以访问该单击操作。 您还应该收听@keydown.enter。 阻止用户按ENTER触发您单击单元格或行(仅键盘用户可访问性要求)。

标题可访问性

当列(字段)是可排序的(仅<b-table>) 或注册了单击鼠标左键的侦听器(<b-table><b-table-lite>)时, 页眉(和页脚) <th>单元格将放置在文档选项卡序列中 (通过tabindex="0"),以供纯键盘和屏幕阅读器用户访问,以便用户可以触发单击(通过在标题单元格上按ENTER键)。

数据行可访问性

当表处于可选模式(仅<b-table>, 并且未设置属性 no-select-on-click)时, 或者如果注册了行单击事件监听器(<b-table><b-table-lite>), 所有数据项行(<tr>元素) 都将放入文档选项卡序列中(通过tabindex="0"),以使纯键盘和屏幕阅读器用户可以通过按ENTER 键来单击行或SPACE

将表项目行按文档选项卡顺序放置(<b-table><b-table-lite>)时,它们在集中时也将支持基本的键盘导航:

  • DOWN 将移至下一行
  • UP 将移至上一行
  • END or DOWN+SHIFT 将移至最后一行
  • HOME or UP+SHIFT将移至第一行
  • ENTER or SPACE 单击该行。

行事件可访问性

请注意,以下基于行的事件/操作(可用于<b-table><b-table-lite>)被认为是不可访问的,并且仅应在功能不重要或可以通过其他方式提供的情况下使用:

  • row-dblclicked
  • row-contextmenu
  • row-hovered
  • row-unhovered
  • row-middle-clicked

请注意,并非所有浏览器(即IE,Safari和大多数移动浏览器)都支持行单击中间事件。 当侦听源自不支持输入或导航的元素的行单击中间事件时, 您通常会希望明确阻止其他默认操作映射到鼠标中键的向下操作。 在Windows上通常是自动滚动,在macOS和Linux上通常是剪贴板粘贴。 这可以通过防止mousedownpointerdown事件的默认行为来完成。

此外,您可能需要避免在右键单击后打开默认系统或浏览器上下文菜单。 由于操作系统之间的时间差异,这也不是行中间单击可预防的默认行为。 而是可以通过防止row-contextmenu事件的默认行为来完成此操作。

建议您在尽可能多的浏览器和设备变体中测试您的应用,以确保您的应用能够处理各种与事件不一致的情况。

完整的例子

Filter On
Leave all unchecked to filter on all data
Person Full name (Click to sort Ascending) Person age (Click to sort Ascending) is Active (Click to sort Ascending) Actions
Dickerson Macdonald
40
Yes
Larsen Shaw
21
No
Mini Navarro
9
No
Geneva Wilson
89
No
Jami Carney
38
Yes
<template>
  <b-container fluid>
    <!-- User Interface controls -->
    <b-row>
      <b-col lg="6" class="my-1">
        <b-form-group
          label="Sort"
          label-cols-sm="3"
          label-align-sm="right"
          label-size="sm"
          label-for="sortBySelect"
          class="mb-0"
        >
          <b-input-group size="sm">
            <b-form-select v-model="sortBy" id="sortBySelect" :options="sortOptions" class="w-75">
              <template v-slot:first>
                <option value="">-- none --</option>
              </template>
            </b-form-select>
            <b-form-select v-model="sortDesc" size="sm" :disabled="!sortBy" 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-cols-sm="3"
          label-align-sm="right"
          label-size="sm"
          label-for="initialSortSelect"
          class="mb-0"
        >
          <b-form-select
            v-model="sortDirection"
            id="initialSortSelect"
            size="sm"
            :options="['asc', 'desc', 'last']"
          ></b-form-select>
        </b-form-group>
      </b-col>

      <b-col lg="6" class="my-1">
        <b-form-group
          label="Filter"
          label-cols-sm="3"
          label-align-sm="right"
          label-size="sm"
          label-for="filterInput"
          class="mb-0"
        >
          <b-input-group size="sm">
            <b-form-input
              v-model="filter"
              type="search"
              id="filterInput"
              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
          label="Filter On"
          label-cols-sm="3"
          label-align-sm="right"
          label-size="sm"
          description="Leave all unchecked to filter on all data"
          class="mb-0">
          <b-form-checkbox-group v-model="filterOn" 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-cols-sm="6"
          label-cols-md="4"
          label-cols-lg="3"
          label-align-sm="right"
          label-size="sm"
          label-for="perPageSelect"
          class="mb-0"
        >
          <b-form-select
            v-model="perPage"
            id="perPageSelect"
            size="sm"
            :options="pageOptions"
          ></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>

    <!-- Main table element -->
    <b-table
      show-empty
      small
      stacked="md"
      :items="items"
      :fields="fields"
      :current-page="currentPage"
      :per-page="perPage"
      :filter="filter"
      :filterIncludedFields="filterOn"
      :sort-by.sync="sortBy"
      :sort-desc.sync="sortDesc"
      :sort-direction="sortDirection"
      @filtered="onFiltered"
    >
      <template v-slot:cell(name)="row">
        {{ row.value.first }} {{ row.value.last }}
      </template>

      <template v-slot: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 v-slot: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>

    <!-- Info modal -->
    <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],
        sortBy: '',
        sortDesc: false,
        sortDirection: 'asc',
        filter: null,
        filterOn: [],
        infoModal: {
          id: 'info-modal',
          title: '',
          content: ''
        }
      }
    },
    computed: {
      sortOptions() {
        // Create an options list from our fields
        return this.fields
          .filter(f => f.sortable)
          .map(f => {
            return { text: f.label, value: f.key }
          })
      }
    },
    mounted() {
      // Set the initial number of items
      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) {
        // Trigger pagination to update the number of buttons/pages due to filtering
        this.totalRows = filteredItems.length
        this.currentPage = 1
      }
    }
  }
</script>

组件引用

<b-table>

属性

属性 (Click to sort Ascending) 类型 默认值 描述
id String 用于在渲染的内容上设置“id”属性,并用作根据需要生成任何其他元素ID的基础
items Array or Function [] 要显示的项目数组,或项目提供程序功能参考。 有关详细信息,请参阅文档
fields Array 字段名称数组或字段定义对象数组
primary-key String 表字段的名称,每行包含一个保证的唯一值。 需要tbody转换支持,并且还可以加速表格渲染
value Array [] 当前显示的行数据 只读 不要为此属性设置值
striped Boolean false 将条纹应用于内容行
bordered Boolean false 为所有单元格和标题添加边框
borderless Boolean false 删除单元格的所有边框
outlined Boolean false 向表格元素添加轮廓边框
dark Boolean false 将桌子置于暗模式
hover Boolean false 在行上启用悬停样式
small Boolean false 用较小的单元格填充表
fixed Boolean false 使所有列均等宽(固定布局表)。 将加快大型表的渲染。 列宽可以通过CSS或colgroup设置
responsive Boolean or String false 使表格在宽度上响应,并添加水平滚动条。 设置为true表示始终响应,或设置为从响应切换为正常的断点之一:“ sm”,“ md”,“ lg”,“ xl”
sticky-header Boolean or String false 使表格标题变粘。 对于最大高度为300px的桌子,将其设置为true,或者将其设置为任何有效的CSS高(包括单位)
no-border-collapse v2.0.0+ Boolean false 禁用表格边框的折叠。 当表格具有粘性标题或列时很有用
caption-top Boolean false 可视地将表格标题放在表格上方。 默认值如下。
table-variant String 将Bootstrap主题颜色变体应用于整个表格
table-class String or Array or Object CSS类(或多个类)应用于表元素
stacked Boolean or String false 将表格放在堆叠模式。 为始终堆叠设置为true,或设置为从堆叠切换为正常的断点之一:'sm','md','lg','xl'
head-variant String 标头变体:“浅”或“暗”,或未设置。 可能优先于行头变量
head-row-variant v2.1.0+ String 将Bootstrap主题颜色变体应用于thead中的tr元素
thead-class String or Array or Object CSS类(适用于thead元素)
thead-tr-class String or Array or Object CSS类(一个或多个)应用于thead中的tr元素
foot-clone Boolean false 启用到表的页脚,并默认情况下克隆标题内容
foot-variant String 页脚变体:“浅”或“暗”或未设置。 可能优先于行脚变化
foot-row-variant v2.1.0+ String 将Bootstrap主题颜色变体应用于tfoot中的tr元素。 跌落到头行变数
tfoot-class String or Array or Object CSS类(或多个类)应用于tfoot元素
tfoot-tr-class String or Array or Object CSS类(或多个类)应用于tfoot中的tr元素
tbody-tr-class String or Array or Object or Function CSS类(或多个类)应用于tbody中的tr元素。 可以是返回类的函数(有关详细信息,请参阅文档)
tbody-tr-attr v2.2.0+ Object or Function 要添加到tbody中每个tr的属性,或返回此类属性的函数(有关详细信息,请参阅文档)
details-td-class v2.1.0+ String or Array or Object CSS类(或多个类)应用于详细信息行中的td元素
tbody-transition-props Object Vue的“过渡组”属性。 提供时将使tbody成为Vue的“过渡组”组件
tbody-transition-handlers Object Vue“过渡组”事件处理程序。 提供时将使tbody成为Vue的“过渡组”组件
tbody-class String or Array or Object CSS类(或多个类)应用于tbody元素
filter String or RegExp or Object or Array 过滤条件。 内部过滤仅支持字符串或RegExpr条件。
filter-function Function 引用要使用的功能,而不是内部过滤功能。 有关详细信息,请参阅文档
filter-ignored-fields Array 过滤项目数据时要忽略的顶级字段数组
filter-included-fields Array 过滤时要包括的字段数组。 覆盖filter-ignore-fields
filter-debounce v2.0.0+ Deprecated Number or String 0 过滤记录之前消除对过滤条件的更改的时间(以毫秒为单位)

不建议使用“过滤器反跳”属性。 请使用"<b-form-input>"的去抖动功能。

sort-by String 当前正在排序的字段名称。 设置为null可清除排序。 可与.sync属性修改器同步
sort-desc Boolean false 设置为true以按降序对列进行排序。 可与.sync属性修改器同步
sort-direction String 'asc' 用于按“ asc”,“ desc”或“ last”对未排序列进行排序的初始排序方向(以使用先前的排序方向)
sort-compare Function 对用于对两行数据进行排序比较的函数的引用。 默认为内部排序比较例程。 有关详细信息,请参阅文档
sort-compare-options Object {'numeric':true} 包含“ String.prototype.sortLocale”方法的排序配置的对象。 有关详细信息,请参阅文档
sort-compare-locale String or Array 在排序时指定语言的语言环境字符串(或语言环境字符串数组)。 有关详细信息,请参阅文档
sort-null-last Boolean false 排序时,将首先对null和undefined值进行排序(或最后排序,具体取决于'sort-desc')。 设置此属性可以最后对空值排序。 仅适用于内部排序
no-sort-reset Boolean false 当一个表是可排序的时,单击任何不可排序的列标题将清除当前的排序值。 设置此道具以禁用此功能
label-sort-asc String 'Click to sort Ascending' 单击单元格时在标题单元格中放置的隐藏字符串会将排序方向更改为升序
label-sort-desc String 'Click to sort Descending' 单击单元格时在标题单元格中放置的隐藏字符串会将排序方向更改为降序
label-sort-clear String 'Click to clear sorting' 单击单元格时隐藏在标题单元格中的字符串将清除当前排序方向
no-local-sorting Boolean false 禁用内部排序例程,并希望用户提供已排序的项目。 排序控件仍然可用
sort-icon-left Boolean false 将排序控件放置在标题文本的左侧。 默认值位于标题文本的右侧
per-page Number or String 0 每页显示的行数。 设置为0禁用分页
current-page Number or String 1 对表进行分页时要显示的当前页码。 从1开始
caption String 放置在标题元素中的文本字符串
caption-html Use with caution String 放置在标题元素中的HTML字符串。 谨慎使用
selectable Boolean false 设置后,将表主体行置于可选模式
select-mode String 'multi' 设置为“可选”时,表格的可选模式。 可能的值:“单”,“多”或“范围”
selected-variant String 'active' Bootstrap颜色主题变体,用于将选定的行设置为该颜色。 使用任何标准的Bootstrap主题颜色变体,或特殊的表行变体“ active”(默认)。 设置为空字符串不使用变体
no-select-on-click v2.1.0+ Boolean false 通过点击事件禁用行选择。 行选择将仅以编程方式可用
show-empty Boolean false 启用后,没有要显示的项目记录,将显示一条消息,提示没有行显示
empty-text String 'There are no records to show' 当表格中没有要显示的项目时显示的文本字符串
empty-html Use with caution String 当表格中没有要显示的项目时显示的HTML字符串。 谨慎使用
empty-filtered-text String 'There are no records matching your request' 当表格由于过滤而没有要显示的项目时显示的文本字符串
empty-filtered-html Use with caution String 当表格由于过滤而没有要显示的项目时显示的HTML字符串。 谨慎使用
busy Boolean false 设置时,将表强制为繁忙状态。在调用项提供程序功能时自动设置
no-provider-paging Boolean false 设置后,使用内部分页对数据进行分页。 否则,项目提供者应执行分页
no-provider-sorting Boolean false 设置后,使用内部排序对数据进行排序。 否则,项目提供者应执行排序
no-provider-filtering Boolean false 设置后,使用内部过滤对数据进行分页。 否则,期望提供者执行过滤
api-url String 通过道具。 作为上下文对象的一部分传递给项目提供者函数

警告: 当传递原始用户提供的值时,支持HTML字符串(*-html)的道具可能容易 受到 跨站点脚本(XSS)攻击。 您必须先对用户输入进行正确的 清理

插槽

插槽名称 (Click to sort Ascending) 描述 范围
cell({key}) 作用域插槽,用于字段数据的自定义数据呈现。 “ {key}”是字段的键名。 有关范围数据,请参阅文档
cell() 用于字段数据的自定义数据呈现的默认作用域插槽。 有关范围数据,请参阅文档
head({key}) 用于自定义呈现字段标题的作用域插槽。 “ {key}”是字段的键名。 有关范围标头,请参见文档
head() 用于自定义呈现字段标题的默认作用域插槽。 有关范围标头,请参见文档
foot({key}) 用于自定义呈现字段页脚的作用域插槽。 “ {key}”是字段的键名。 请参阅文档以了解范围内的页脚
foot() 用于自定义呈现字段页脚的默认作用域插槽。 请参阅文档以了解范围内的页脚
table-caption 在表格的标题元素中显示的内容
table-colgroup 放置自定义colgroup和col元素的插槽。 可选范围
table-busy 表处于繁忙状态时用于放置加载消息的可选插槽
row-details 作用域插槽,用于可选呈现其他记录详细信息。 请参阅文档以获取行详细信息支持
empty 当“项目”数组中没有项目时显示的内容。 可选范围
emptyfiltered 在过滤后的“项目”数组中不存在任何项目时显示的内容。 可选范围
thead-top 用户提供的带有B-TH / B-TD的B-TR的`thead`元素中列标题上方的插槽。 可选范围。
top-row 用户提供的B-TD单元的固定顶部行插槽。 可选范围
bottom-row 用户提供的B-TD单元的固定底部行插槽。 可选范围
custom-foot 用户提供的B-TR,B-TH,B-TD的自定义页脚内容插槽。 可选范围

事件

事件 参数 描述
row-clicked
  1. item - 单击的行的项目数据。
  2. index - 单击的行的索引。
  3. event - 本机事件对象。
单击某行时发出。
row-dblclicked
  1. item - 双击该行的项目数据。
  2. index - 双击行的索引。
  3. event - 本机事件对象。
双击某行时发出。
row-middle-clicked
  1. item - 该行的项目数据被单击中。
  2. index - 该行的索引处于中间单击状态。
  3. event - 本机事件对象。
在单击鼠标中键时发出。
row-contextmenu
  1. item - 右键单击该行的项目数据。
  2. index - 右键单击该行的索引。
  3. event - 本机事件对象。
右键单击一行时发出。
row-hovered
  1. item - 悬停的行的项目数据。
  2. index - 悬停的行的索引。
  3. event - 本机事件对象。
悬停时发出。
row-unhovered
  1. item - 该行的项目数据未悬停。
  2. index - 未悬停的行的索引。
  3. event - 本机事件对象。
当行未悬停时发出。
row-selected
  1. rows - 所选行项目的数组。
在选择或取消选择一个或多个行时触发。
head-clicked
  1. key - 单击列键(字段名称)。
  2. field - 字段定义对象。
  3. event - 本机事件对象。
  4. isFooter - 如果事件来自于页脚单元格,则为“ True”
单击页眉或页脚单元格时发出。 不适用于“自定义脚”插槽。
sort-changed
  1. ctx - 表状态上下文对象。 参见文档。
当表格上的排序更改时发出
context-changed
  1. ctx - 表状态上下文对象。 参见文档。
表状态上下文更改时发出
filtered
  1. filteredItems - 过滤后的项目数组(在发生本地分页之前)。
当本地过滤导致项目数更改时发出。
refreshed 当项目提供程序功能返回数据时发出。

$root 事件监听器

您可以通过在$root上发出以下事件来控制<b-table>

事件 参数 描述
bv::refresh::table

id - 通过表格ID以刷新数据

在$ root上发出此事件时刷新特定表格的数据

<b-table-lite>

属性

属性 (Click to sort Ascending) 类型 默认值 描述
id String 用于在渲染的内容上设置“id”属性,并用作根据需要生成任何其他元素ID的基础
items Array [] 要显示的项目数组
fields Array 字段名称数组或字段定义对象数组
primary-key String 表字段的名称,每行包含一个保证的唯一值。 需要tbody转换支持,并且还可以加速表格渲染
value Array [] 当前显示的行数据 只读 不要为此属性设置值
striped Boolean false 将条纹应用于内容行
bordered Boolean false 为所有单元格和标题添加边框
borderless Boolean false 删除单元格的所有边框
outlined Boolean false 向表格元素添加轮廓边框
dark Boolean false 将表格置于暗模式
hover Boolean false 在行上启用悬停样式
small Boolean false 用较小的单元格填充表格
fixed Boolean false 使所有列均等宽(固定布局表)。 将加快大型表的渲染。 列宽可以通过CSS或colgroup设置
responsive Boolean or String false 使表格在宽度上响应,并添加水平滚动条。 设置为true表示始终响应,或设置为从响应切换为正常的断点之一:“ sm”,“ md”,“ lg”,“ xl”
sticky-header Boolean or String false 使表格标题变粘。 对于最大高度为300px的桌子,将其设置为true,或者将其设置为任何有效的CSS高(包括单位)
no-border-collapse v2.0.0+ Boolean false 禁用表格边框的折叠。 当表格具有粘性标题或列时很有用
caption-top Boolean false 可视地将表格标题放在表格上方。默认值如下。
table-variant String 将Bootstrap主题颜色变体应用于整个表格
table-class String or Array or Object CSS类(或多个类)应用于表元素
stacked Boolean or String false 将桌子放在堆叠模式。 为始终堆叠设置为true,或设置为从堆叠切换为正常的断点之一:'sm','md','lg','xl'
head-variant String 标头变体:“浅”或“暗”,或未设置。 可能优先于行头变量
head-row-variant v2.1.0+ String 将Bootstrap主题颜色变体应用于thead中的tr元素
thead-class String or Array or Object CSS类(适用于thead元素)
thead-tr-class String or Array or Object CSS类(一个或多个)应用于thead中的tr元素
foot-clone Boolean false 启用到表的页脚,并默认情况下克隆标题内容
foot-variant String 页脚变体:“浅”或“暗”或未设置。 可能优先于行脚变化
foot-row-variant v2.1.0+ String 将Bootstrap主题颜色变体应用于tfoot中的tr元素。 跌落到头行变数
tfoot-class String or Array or Object CSS类(或多个类)应用于tfoot元素
tfoot-tr-class String or Array or Object CSS类(或多个类)应用于tfoot中的tr元素
tbody-tr-class String or Array or Object or Function CSS类(或多个类)应用于tbody中的tr元素。 可以是返回类的函数(有关详细信息,请参阅文档)
tbody-tr-attr v2.2.0+ Object or Function 要添加到tbody中每个tr的属性,或返回此类属性的函数(有关详细信息,请参阅文档)
details-td-class v2.1.0+ String or Array or Object CSS类(或多个类)应用于详细信息行中的td元素
tbody-transition-props Object Vue的“过渡组”属性。提供时将使tbody成为Vue的“过渡组”组件
tbody-transition-handlers Object Vue“过渡组”事件处理程序。提供时将使tbody成为Vue的“过渡组”组件
tbody-class String or Array or Object CSS类(或多个类)应用于tbody元素
caption String 放置在标题元素中的文本字符串
caption-html Use with caution String 放置在标题元素中的HTML字符串。谨慎使用

警告: 当传递原始用户提供的值时,支持HTML字符串(*-html)的属性 可能容易受到 跨站点脚本(XSS)攻击 。 您必须先对用户输入进行正确的 清理

插槽

插槽名称 (Click to sort Ascending) 描述 范围
cell({key}) 作用域插槽,用于字段数据的自定义数据呈现。“{key}”是字段的键名。
cell() 用于字段数据的自定义数据呈现的默认作用域插槽。
head({key}) 用于自定义呈现字段标题的作用域插槽。“{key}”是字段的键名
head() 用于自定义呈现字段标题的默认作用域插槽。
foot({key}) 用于自定义呈现字段页脚的作用域插槽。“{key}”是字段的键名。
foot() 用于自定义呈现字段页脚的默认作用域插槽
table-caption 在表格的标题元素中显示的内容
table-colgroup 放置自定义colgroup和col元素的插槽。可选范围
row-details 作用域插槽,用于可选呈现其他记录详细信息。请参阅文档以获取行详细信息支持
thead-top 用户提供的带有B-TH/B-TD的B-TR的`thead`元素中列标题上方的插槽。可选范围。
custom-foot 用户提供的B-TR和B-TH/B-TD的自定义页脚内容插槽。可选范围

事件

事件 参数 描述
row-clicked
  1. item - 单击的行的项目数据。
  2. index - 单击的行的索引。
  3. event - 本机事件对象。
单击某行时发出。
row-dblclicked
  1. item - 双击该行的项目数据。
  2. index - 双击行的索引。
  3. event - 本机事件对象。
双击某行时发出。
row-middle-clicked
  1. item - 该行的项目数据被单击中。
  2. index - 该行的索引处于中间单击状态。
  3. event - 本机事件对象。
在单击鼠标中键时发出。
row-contextmenu
  1. item - 右键单击该行的项目数据。
  2. index - 右键单击该行的索引。
  3. event - 本机事件对象。
右键单击一行时发出。
row-hovered
  1. item - 悬停的行的项目数据。
  2. index - 悬停的行的索引。
  3. event - 本机事件对象。
悬停时发出。
row-unhovered
  1. item - 该行的项目数据未悬停。
  2. index - 未悬停的行的索引。
  3. event - 本机事件对象。
当行未悬停时发出。
head-clicked
  1. key - 单击列键(字段名称)。
  2. field - 字段定义对象。
  3. event - 本机事件对象。
  4. isFooter - 如果事件来自于页脚单元格,则为“ True”
单击页眉或页脚单元格时发出。 不适用于“自定义脚”插槽。

<b-table-simple>

Properties

属性 (Click to sort Ascending) 类型 默认值 描述
id String 用于在渲染的内容上设置“id”属性,并用作根据需要生成任何其他元素ID的基础
striped Boolean false 将条纹应用于内容行
bordered Boolean false 为所有单元格和标题添加边框
borderless Boolean false 删除单元格的所有边框
outlined Boolean false 向表格元素添加轮廓边框
dark Boolean false 将表格置于暗模式
hover Boolean false 在行上启用悬停样式
small Boolean false 用较小的单元格填充表
fixed Boolean false 使所有列均等宽(固定布局表)。 将加快大型表的渲染。 列宽可以通过CSS或colgroup设置
responsive Boolean or String false 使表格在宽度上响应,并添加水平滚动条。 设置为true表示始终响应,或设置为从响应切换为正常的断点之一:“ sm”,“ md”,“ lg”,“ xl”
sticky-header Boolean or String false 使表格标题变粘。 对于最大高度为300px的桌子,将其设置为true,或者将其设置为任何有效的CSS高(包括单位)
no-border-collapse v2.0.0+ Boolean false 禁用表格边框的折叠。 当表格具有粘性标题或列时很有用
caption-top Boolean false 可视地将表格标题放在表格上方。 默认值如下。
table-variant String 将Bootstrap主题颜色变体应用于整个表格
table-class String or Array or Object CSS类(或多个类)应用于表元素
stacked Boolean or String false 将桌子放在堆叠模式。 为始终堆叠设置为true,或设置为从堆叠切换为正常的断点之一:'sm','md','lg','xl'

<b-tbody>

Properties

属性 类型 默认值 描述
tbody-transition-props Object Vue的“过渡组”属性。提供时将使tbody成为Vue的“过渡组”组件
tbody-transition-handlers Object Vue“过渡组”事件处理程序。提供时将使tbody成为Vue的“过渡组”组件

<b-thead>

Properties

属性 类型 默认值 描述
head-variant String 标头变体:“浅”或“暗”,或未设置

<b-tfoot>

Properties

属性 类型 默认值 描述
foot-variant String 页脚变体:“浅”或“暗”,或未设置

<b-tr>

Properties

属性 类型 默认值 描述
variant String 将Bootstrap主题颜色变体之一应用于组件

<b-td>

Properties

属性 类型 默认值 描述
variant String 将Bootstrap主题颜色变体之一应用于组件
colspan Number or String 该单元格跨越的列数
rowspan Number or String 该单元格跨越的行数
stacked-heading String 在堆叠模式下前往单元格。 仅适用于“ tbody”元素中的单元格
sticky-column Boolean false 如果这将是粘性列。 必须在此列的所有单元格上进行设置。 表格必须处于粘页眉或响应模式下才能工作

<b-th>

Properties

属性 类型 默认值 描述
variant String 将Bootstrap主题颜色变体之一应用于组件
colspan Number or String 该单元格跨越的列数
rowspan Number or String 该单元格跨越的行数
stacked-heading String 在堆叠模式下前往单元格。 仅适用于“ tbody”元素中的单元格
sticky-column Boolean false 如果这将是粘性列。 必须在此列的所有单元格上进行设置。 表格必须处于粘页眉或响应模式下才能工作

导入单个组件

您可以通过以下命名的导出将单个组件导入到项目中:

组件 命名输出 导入路径
<b-table> BTable bootstrap-vue
<b-table-lite> BTableLite bootstrap-vue
<b-table-simple> BTableSimple bootstrap-vue
<b-tbody> BTbody bootstrap-vue
<b-thead> BThead bootstrap-vue
<b-tfoot> BTfoot bootstrap-vue
<b-tr> BTr bootstrap-vue
<b-td> BTd bootstrap-vue
<b-th> BTh bootstrap-vue

示例:

import { BTable } from 'bootstrap-vue'
Vue.component('b-table', BTable)

导入为Vue.js插件

该插件包括上面列出的所有单个组件。插件还包括任何组件别名。

命名输出 导入路径
TablePlugin bootstrap-vue

该插件还自动包括以下插件:

  • TableLitePlugin
  • TableSimplePlugin

示例:

import { TablePlugin } from 'bootstrap-vue'
Vue.use(TablePlugin)