table.md 12.1 KB

Table 表格

拓展ElementUI的el-table

配置项

可以通过配置项列表快速生成表格列

::: snippet 设置columns配置表格列,插槽header-列字段名可自定义表头的内容,插槽cell-列字段名可自定义列单元格的内容。

<template>
  <z-table :data="tableData" border size="small" :columns="columns">
    <template #header-age>年龄 <i class="el-icon-question"></i></template>
    <template #cell-gender="{ value }">
      <el-tag size="mini">{{ value }}</el-tag>
    </template>
  </z-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        { name: '张三', age: '31', gender: '男' },
        { name: '李四', age: '27', gender: '女' },
        { name: '王五', age: '16', gender: '男' },
      ],
      columns: [
        { prop: 'name', label: '姓名' },
        { prop: 'age', label: '年龄' },
        { prop: 'gender', label: '性别' },
      ]
    };
  },
}
</script>

:::

追加列

使用配置项时,可以在配置项的左右两边追加列

::: snippet 使用left插槽在表格配置项的左侧插入列,使用right插槽在表格配置项的右侧插入列。

<template>
  <z-table :data="tableData" border size="small" :columns="columns">
    <template #prepend>
      <el-table-column type="selection" width="40"></el-table-column>
    </template>
    <template #left>
      <el-table-column label="左侧的列">
        <template #default="{ $index }">
          左侧内容 {{ $index }}
        </template>
      </el-table-column>
    </template>
    <template #right>
      <el-table-column label="右侧的列">
        <template #default="{ $index }">
          右侧内容 {{ $index }}
        </template>
      </el-table-column>
    </template>
    <template #append>
      <el-table-column label="后置列" width="80">
        <template #default>
          <el-button type="text">编辑</el-button>
        </template>
      </el-table-column>
    </template>
  </z-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        { name: '张三', age: '31', gender: '男' },
        { name: '李四', age: '27', gender: '女' },
        { name: '王五', age: '16', gender: '男' },
      ],
      columns: [
        { prop: 'name', label: '姓名' },
        { prop: 'age', label: '年龄' },
        { prop: 'gender', label: '性别' },
      ]
    };
  },
}
</script>

:::

可编辑表格(即将废弃)

由于创建时间较早且性能不佳,在2.0.1版本之后不推荐使用,并在若干版本之后废弃

一般用于表格的静态数据编辑,设置editable开启可编辑模式,设置clickable开启双击编辑

::: snippet 编辑功能只支持通过columns配置的列,editable设置该列是否可编辑,默认开启;插槽editor-列字段名可自定义列单元格的编辑器,通过解构作用域插槽获取的valueonInput改变表格的绑定值,不支持直接写v-model

<template>
  <div>
    <z-form span="6">
      <z-form-item>编辑模式:<el-switch v-model="editable"></el-switch></z-form-item>
      <z-form-item>编辑全部:<el-switch v-model="editall"></el-switch></z-form-item>
      <z-form-item>双击编辑:<el-switch v-model="clickable"></el-switch></z-form-item>
    </z-form>
    <z-table v-model="tableData" size="mini" :editable="editable" :columns="columns" border :clickable="clickable" @cell-edit-confirm="onCellEditConfirm" :editall="editall">
      <template #editor-gender="{ value, onInput, index }">
        <el-radio-group size="mini" :value="value" @input="onInput">
          <el-radio-button label="男">男</el-radio-button>
          <el-radio-button label="女">女</el-radio-button>
        </el-radio-group>
      </template>
      <template #cell-gender="{ value }">
        <el-tag size="mini" type="info" disable-transitions>{{ value }}</el-tag>
      </template>
      <el-table-column label="操作" width="80">
        <template #default="{ $index }">
          <el-button type="text" @click="deleteRow($index)">删除</el-button>
        </template>
      </el-table-column>
    </z-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      editall: false,
      editable: true,
      clickable: true,
      tableData: [
        { name: '张三', age: 31, gender: '男', remark: '' },
        { name: '李四', age: 27, gender: '女', remark: '' },
        { name: '王五', age: 16, gender: '男', remark: '' },
      ],
      columns: [
        { prop: 'name', label: '姓名', editable: false },
        { component: 'el-input-number', prop: 'age', label: '年龄' },
        { prop: 'gender', label: '性别' },
        { prop: 'remark', label: '备注' },
      ]
    };
  },
  methods: {
    deleteRow(index) {
      this.tableData.splice(index, 1);
    },
    onCellEditConfirm(data) {
      console.log(data);
    }
  }
}
</script>

:::

编辑器

表格单元格可通过editor参数来配置编辑器,默认与表格数据值双向绑定

::: snippet 设置items配置编辑器列

<template>
  <div>
    <div>{{ tableData }}</div>
    <z-table :data="tableData" border size="small" :columns="columns" :editor="editor" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        { name: '张三', age: '31', gender: '男' },
        { name: '李四', age: '27', gender: '女' },
        { name: '王五', age: '16', gender: '男' },
      ],
      columns: [
        { prop: 'name', label: '姓名' },
        { prop: 'age', label: '年龄' },
        { prop: 'gender', label: '性别' },
      ],
      editor: {
        items: [
          { is: 'el-input', prop: 'name', attrs: { placeholder: '请输入' }, props: { size: 'mini', clearable: true } },
          { is: 'el-input-number', prop: 'age', attrs: { style: 'width: 100%' }, props: { size: 'mini', clearable: true } },
        ]
      }
    };
  },
}
</script>

:::

编辑器对象取值与赋值

编辑器可对深层对象进行双向绑定,通过deep参数来配置

::: snippet 表格配置项也支持对象的深层取值

<template>
  <div>
    <div>{{ tableData }}</div>
    <z-table :data="tableData" border size="small" :columns="columns" :editor="editor" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        { name: '张三', info: { age: 27, gender: '女', district: { city: '上海市' } } },
        { name: '李四', info: { age: 19, gender: '男', district: { city: '北京市' } } },
      ],
      columns: [
        { prop: 'name', label: '姓名' },
        { prop: 'info.age', label: '年龄' },
        { prop: 'info.gender', label: '性别' },
      ],
      editor: {
        deep: true,
        items: [
          { is: 'el-input', prop: 'name', attrs: { placeholder: '请输入' }, props: { size: 'mini', clearable: true } },
          { is: 'el-input-number', prop: 'info.age', attrs: { style: 'width: 100%' }, props: { size: 'mini', clearable: true } },
        ]
      }
    };
  },
}
</script>

:::

编辑器条件渲染

编辑器支持通过行内的某些数值来进行条件渲染,支持配置if来进行条件渲染。

::: snippet if同时支持booleanfunction两种类型,其中function可拿到当前行数据

<template>
  <z-table :data="tableData" border size="small" :columns="columns" :editor="editor" />
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        { name: '张三', info: { age: 27, gender: '女', district: { city: '上海市' } } },
        { name: '李四', info: { age: 19, gender: '男', district: { city: '北京市' } } },
      ],
      columns: [
        { prop: 'name', label: '姓名' },
        { prop: 'info.age', label: '年龄' },
        { prop: 'info.gender', label: '性别' },
      ],
      editor: {
        deep: true,
        items: [
          { is: 'el-input', prop: 'name', attrs: { placeholder: '请输入' }, props: { size: 'mini', clearable: true }, if: ({ row, index }) => index > 0 },
          { is: 'el-input-number', prop: 'info.age', attrs: { style: 'width: 100%' }, props: { size: 'mini', clearable: true }, if: false },
        ]
      }
    };
  },
}
</script>

:::

编辑器条件渲染扩展

除了if之外,propsattrson都支持条件渲染

::: snippet 同时支持booleanfunction两种类型,其中function可拿到当前行数据

<template>
  <z-table :data="tableData" border size="small" :columns="columns" :editor="editor" />
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        { name: '', info: { age: 18, gender: '女', district: { city: '上海市' } } },
        { name: '', info: { age: 27, gender: '男', district: { city: '北京市' } } },
      ],
      columns: [
        { prop: 'name', label: '姓名' },
        { prop: 'info.age', label: '年龄' },
        { prop: 'info.gender', label: '性别' },
      ],
      editor: {
        deep: true,
        items: [
          { is: 'el-input', prop: 'name', attrs: ({ row }) => ({ placeholder: '请输入' + (row.info.gender === '女' ? 'MM' : 'GG') + '的姓名' }), props: { size: 'mini', clearable: true } },
          { is: 'el-input', prop: 'info.age', props: ({ row }) => (row.info.gender === '女' ? { size: 'mini', disabled: true } : { size: 'mini', clearable: true }) },
        ]
      }
    };
  },
}
</script>

:::

编辑器校验

编辑器默认支持el-form的单元格校验,配置editor参数中的validate开启校验模式,配置editor参数中的path设置当前表格在form表单中的路径,表头会根据rules自动判断是否必填项追加*

::: snippet 配置编辑器editor下的rules设置单元格的校验规则,也可以在itemsrules中配置用以支持条件渲染

<template>
  <el-form ref="form" :model="form">
    <el-form-item label="ID" prop="id">
      <el-input :value="form.id" type="text" disabled />
    </el-form-item>
    <z-table :data="form.list" border size="small" :columns="columns" :editor="editor" />
    <el-form-item>
      <el-button size="mini" @click="handleValidate">校验</el-button>
    </el-form-item>
  </el-form>
</template>

<script>
export default {
  data() {
    return {
      form: {
        id: 'test',
        list: [
          { name: '', age: 18, gender: '女', },
          { name: '', age: 27, gender: '男' },
        ]
      },
      columns: [
        { prop: 'name', label: '姓名', showOverflowTooltip: true },
        { prop: 'age', label: '年龄', showOverflowTooltip: true },
        { prop: 'gender', label: '性别', showOverflowTooltip: true },
      ],
      editor: {
        path: 'list',
        validate: true,
        rules: {
          name: [{ required: true, message: '请输入姓名' }],
        },
        items: [
          { is: 'el-input', prop: 'name', attrs: { placeholder: '请输入姓名' }, props: { size: 'mini', clearable: true } },
          {
            is: 'el-input',
            prop: 'age',
            props: { size: 'mini', clearable: true },
            rules: ({ row = {} }) => {
              if (row.gender === '女') {
                return [{
                  validator: (rule, value, callback) => {
                    if (value < 14) {
                      callback(new Error('还年轻'));
                    }
                    if (value > 18) {
                      callback(new Error('永远18岁'));
                    }
                    callback();
                  },
                }];
              } else {
                return [{ required: true, message: '请输入年龄' }]
              }
            }
          },
        ]
      }
    };
  },
  methods: {
    handleValidate() {
      this.$refs.form.validate(valid => {
        if (valid) {
          this.$message.success('校验通过');
        } else {
          this.$message.error('校验失败');
        }
      });
    }
  }
}
</script>

:::

API

Attribute 属性

参数|说明|类型|可选值|默认值 -|-|-|-|- data | 表格数据 | Array | - | - columns | 表格列配置 | Array | - | [] editor | 编辑器配置 | Object | - | -