1

我有一个看起来像这样的表头:

表头

我正在尝试在 bootstrap-vue 中重新创建此表。原始 HTML 如下所示(简化):

<table>
  <thead>
    <tr>
      <th></th>
      <th colspan="4">Group 1</th>
      <th colspan="4">Group 2</th>
      <!--etc-->
    </tr> 
    <tr>
      <th>Field</th>
      <th>Median</th>
      <!-- etc -->
    </tr>
  </thead>
  <tbody><!-- actual data --></tbody>
</table>

核心 b 表代码将轻松/自动创建第二行。我正在想办法把第一排塞进去。作为一个小人物,我需要能够控制两个组名的内容(即,如果他们在某处更改控件,“Group 1”将变为“Group Foo”)。

我为任何需要一个起点来帮助解决这个问题的人做了一个游乐场: https ://codesandbox.io/s/p56y3y2lnx 那里的目标是以编程方式添加第一行,其中包括group1name并跨越表格的宽度在一个colspan中。

4

2 回答 2

3

从版本 v2.0.0-rc.14(2019-03-08 发布)开始,您现在可以使用 slot 在标题上方添加其他行thead-top

对于您的示例,您将在标记内放置以下代码b-table

  <template slot="thead-top" slot-scope="data">
    <tr>
      <th></th>
      <th colspan="3">Group 1</th>
      <th colspan="4">Group 2</th>
      <th colspan="4"></th>
    </tr>
  </template>

这是对新功能的引用:https ://bootstrap-vue.js.org/docs/components/table/#adding-additional-rows-to-the-header

于 2019-03-27T23:27:35.733 回答
2

我无法找到一种干净的方法来实现我想要的结果,所以我最终得到了一些更 hacky 的东西。

b-table你可以添加一个事件,所以我input这样做是为了知道表格何时完成加载。

HTML:

<b-table @input="tableLoaded" ref="table"></b-table>

然后在我的方法中:

tableLoaded() {
    if (!this.$refs.table) {
        return;
    }

    var headers = this.$refs.table.$el.querySelectorAll('thead tr');
    if (headers.length > 1) {
        return;//nothing to do, header row already created
    }

    var topHeader = document.createElement('tr');
    topHeader.innerHTML =
        '<th></th>'+
        '<th colspan="3">Group 1</th>'+
        '<th colspan="4">Group 2</th>'+
        '<th colspan="4"></th>';
    headers[0].parentNode.insertBefore(topHeader, headers[0]);
}

我很乐意接受更清洁的解决方案。

于 2018-07-30T16:55:16.780 回答