A Vue component used to generate HTML table element

Vue Component simter-vue-table

A Vue component used to generate HTML table element.

Options:

Name___________ Require ValueType Description
columns true [{}] Define table columns
├ id false String The column's id, it's the key in the rows item
├ label true String The column's visible text
├ width false String The column's width, such as '2em'
├ children false [{}] The child group columns. id and width will be ignored if define this property
├ headerClass false String This column's thead/tr/th element class, follow Vue Class Bindings
├ headerStyle false String This column's thead/tr/th element style, follow Vue Class Bindings
├ class false String This column's tbody/tr/td element class, follow Vue Class Bindings
├ style false String This column's tbody/tr/td element style, follow Vue Class Bindings
├ cell false {}
String
Define cell customized, String type means setting component value
│ ├ component false String The cell component's name
│ ├ classes false {} Define the cell's inner dom elements classes, keys is up to the component design
│ ├ styles false {} Define the cell's inner dom elements styles, keys is up to the component design
│ ├ ...custom false custom The custom properties for all this column's cell component. It is up to the component design
rows true [{}] The table's row data
classes false {} Define inner dom elements global classes
├ headerRow false String thead/tr class, follow Vue Class Bindings
├ headerCell false String thead/tr/td class, follow Vue Class Bindings
├ row false String tbody/tr class, follow Vue Class Bindings
├ cell false String tbody/tr/td class, follow Vue Class Bindings
├ groupRow false String group tbody/tr class, follow Vue Class Bindings
├ groupCell false String group tbody/tr/td class, follow Vue Class Bindings
├ table false String table class, follow Vue Class Bindings
├ thead false String thead class, follow Vue Class Bindings
├ tbody false String tbody class, follow Vue Class Bindings
styles false {} Define inner dom elements global styles, simular to classes prop
group false {}
String
Boolean
Function
Define how to predicate a group row.
String type means setting id value with predicate=true.
Boolean or Function type means setting predicate value with id='group'.
├ id false String The key in the row item to get the group cell value
├ predicate false String
Function
Generate a bool value to predicate whether this row is a group row
- String: The row item's key that to get the bool value
- Function: Call to get the bool value. It's first param is the current row data
├ indent false Boolean
String
Predicate whether to indent children row or not. Default is true.
String type means setting a specific indent style, such as padding-left:2em
├ cell false {}
String
The group cell component config, same as columns[i].cell
├ colspan false Number The group cell's colspan attribute value. Default behavior is to merge all the column cell
picker false {}
String
Boolean
Define the picker column cell.
String type means setting component value.
Boolean type means whether to show a default picker cell column.
├ id false String The key in the row item to get the picked value
├ component false String The cell component's name
├ classes false {} Define the picker cell's inner dom elements classes, keys is up to the component design
├ styles false {} Define the picker cell's inner dom elements styles, keys is up to the component design
├ ...custom false custom The custom properties for this picker cell component. It is up to the component design
id false String The key in row item that use its value to unique table row identity

Develop

yarn install  // or npm install
yarn run dev  // or npm run dev

Use [parcel] to run the development debug.

Build

yarn run build  // or npm run build

Use [rollup] package the component to dist directory.

Usage

Example 1 : Simple Columns

Js:

import table from 'simter-vue-table'

new Vue({
  el: "#sample",
  data: {
    columns: [
      { id: "key1", label: "Column1", width: "61px" },
      { id: "key2", label: "Column2", width: "62px" },
      { id: "key3", label: "Column3", width: "63px" }
    ],
    rows: [
      { key1: "v1-1", key2: "v2-1", key3: "v3-1" },
      { key1: "v1-2", key2: "v2-2", key3: "v3-2" },
      { key1: "v1-3", key2: "v2-3", key3: "v3-3" }
    ]
  },
  components: {
    "st-table": table
  }
})

Html template:

<st-table id="#sample" :columns="columns" :rows="rows"></st-table>

Generated html:

<!--
| Column1 | Column2 | Column3 |
| v1-1    | v2-1    | v3-1    |
| v1-2    | v2-2    | v3-2    |
| v1-3    | v2-3    | v3-3    |
-->
<table>
  <colgroup>
    <col style="width: 61px">
    <col style="width: 62px">
    <col style="width: 63px">
  </colgroup>
  <thead>
    <tr><th>Column1</th><th>Column2</th><th>Column3</th></tr>
  </thead>
  <tbody>
    <tr><td>v1-1</td><td>v2-1</td><td>v3-1</td></tr>
    <tr><td>v1-2</td><td>v2-2</td><td>v3-2</td></tr>
    <tr><td>v1-3</td><td>v2-3</td><td>v3-3</td></tr>
  </tbody>
</table>

Example 2 : Group Columns

Use children key to define the group.

Js:

import table from 'simter-vue-table'

new Vue({
  el: "#sample",
  data: {
    columns: [
      { id: "key1", label: "Column1", width: "61px" },
      {
        label: "Column2",
        children: [
          { id: "key21", label: "Column21", width: "62px" },
          { id: "key22", label: "Column22", width: "63px" }
        ]
      }
    ],
    rows: [
      { key1: "v1-1", key21: "v2-1-1", key22: "v2-2-1" },
      { key1: "v1-2", key21: "v2-1-2", key22: "v2-2-2" },
      { key1: "v1-3", key21: "v2-1-3", key22: "v2-2-3" }
    ]
  },
  components: {
    "st-table": table
  }
})

Html template:

<st-table id="#sample" :columns="columns" :rows="rows"></st-table>

Generated html:

<!--
| Column1 |       Column2       |
|         | Column21 | Column22 |
| v1-1    | v21-1    | v22-1    |
| v1-2    | v21-2    | v22-2    |
| v1-3    | v21-3    | v22-3    |
--> 
<table>
  <colgroup>
    <col style="width: 61px">
    <col style="width: 62px">
    <col style="width: 63px">
  </colgroup>
  <thead>
    <tr>
      <th rowspan="2">Column1</th>
      <th colspan="2">Column2</th>
    </tr>
    <tr>
      <th>Column21</th>
      <th>Column22</th>
    </tr>
  </thead>
  <tbody>
    <tr><td>v1-1</td><td>v21-1</td><td>v22-1</td></tr>
    <tr><td>v1-2</td><td>v21-2</td><td>v22-2</td></tr>
    <tr><td>v1-3</td><td>v21-3</td><td>v22-3</td></tr>
  </tbody>
</table>

Example 3 : Complex Group Columns

Use children key to define any level nested group columns.

Js:

import table from 'simter-vue-table'

new Vue({
  el: "#sample",
  data: {
    columns: [
      { id: "key1", label: "Column1", width: "61px" },
      {
        label: "Column2",
        children: [
          { id: "key21", label: "Column21", width: "62px" },
          { 
            label: "Column22",
            children: [
              { id: "key221", label: "Column221", width: "63px" },
              { id: "key222", label: "Column222", width: "64px" }
            ] 
          }
        ]
      }
    ],
    rows: [
      { key1: "v1-1", key21: "v21-1", key221: "v221-1", key222: "v222-1" },
      { key1: "v1-2", key21: "v21-2", key221: "v221-2", key222: "v222-2" },
      { key1: "v1-3", key21: "v21-3", key221: "v221-3", key222: "v222-3" }
    ]
  },
  components: {
    "st-table": table
  }
})

Html template:

<st-table id="#sample" :columns="columns" :rows="rows"></st-table>

Generated html:

<!--
| Column1 |              Column2             |
|         | Column21 |       Column22        |
|         |          | Column221 | Column222 |
| v1-1    | v21-1    | v221-1    | v222-1    |
| v1-2    | v21-2    | v221-2    | v222-2    |
| v1-3    | v21-3    | v221-3    | v222-3    |
--> 
<table>
  <colgroup>
    <col style="width: 61px">
    <col style="width: 62px">
    <col style="width: 63px">
    <col style="width: 64px">
  </colgroup>
  <thead>
    <tr>
      <th rowspan="3">Column1</th>
      <th colspan="3">Column2</th>
    </tr>
    <tr>
      <th rowspan="2">Column21</th>
      <th colspan="2">Column22</th>
    </tr>
    <tr>
      <th>Column221</th>
      <th>Column222</th>
    </tr>
  </thead>
  <tbody>
    <tr><td>v1-1</td><td>v21-1</td><td>v221-1</td><td>v222-1</td></tr>
    <tr><td>v1-2</td><td>v21-2</td><td>v221-2</td><td>v222-2</td></tr>
    <tr><td>v1-3</td><td>v21-3</td><td>v221-3</td><td>v222-3</td></tr>
  </tbody>
</table>

GitHub