Skip to content

EditTable 编辑表格

该组件主要是配置式的编辑表格

基础用法

[
  {
    "id": "001",
    "name": "张三",
    "phone": "13800000000",
    "status": "1",
    "rate": 3,
    "num": 3.14,
    "remark": "这是备注"
  }
]
查看代码
vue
<template>
  <div>
    <el-row justify="end" style="margin-bottom: 8px">
      <el-space>
        <el-button type="success" @click="disabled = !disabled">禁用</el-button>
        <el-button type="primary" @click="onAddRow">新增</el-button>
      </el-space>
    </el-row>
    <gi-edit-table ref="EditTableRef" :columns="columns" :data="data" :max-height="400" :disabled="disabled">
      <template #action="{ $index }">
        <el-row justify="center" style="width: 100%">
          <el-button size="small" type="danger" @click="onDelete($index)">删除</el-button>
        </el-row>
      </template>
    </gi-edit-table>
    <el-row justify="end" style="margin-top: 8px">
      <el-button type="primary" @click="submit">校验并提交</el-button>
    </el-row>
    <pre class="doc-pre">{{ data }}</pre>
  </div>
</template>

<script lang="ts" setup>
import type { EditTableColumnItem } from 'gi-component'
import { ElMessage } from 'element-plus'
import { computed, ref } from 'vue'

const disabled = ref(false)
const EditTableRef = ref()

const data = ref<any[]>([
  {
    id: '001',
    name: '张三',
    phone: '13800000000',
    status: '1',
    rate: 3,
    num: 3.14,
    remark: '这是备注'
  }
])

const columns = computed(() => {
  return [
    {
      type: 'input',
      label: '姓名',
      prop: 'name',
      required: true,
      width: 200
    },
    {
      type: 'input',
      label: '手机号',
      prop: 'phone',
      required: true,
      width: 200
    },
    {
      type: 'select',
      label: '状态',
      prop: 'status',
      componentProps: {
        options: [
          { label: '启用', value: '1' },
          { label: '禁用', value: '0' }
        ]
      },
      width: 120
    },
    {
      type: 'rate',
      label: '评分',
      prop: 'rate',
      width: 150
    },
    {
      type: 'input-number',
      label: '小数',
      prop: 'num',
      width: 150
    },
    {
      type: 'input',
      label: '备注',
      prop: 'remark',
      width: 200
    },
    {
      type: '',
      label: '操作',
      prop: 'action',
      slotName: 'action',
      columnProps: {
        width: 100,
        align: 'center',
        fixed: 'right'
      }
    }
  ] as EditTableColumnItem[]
})

const onAddRow = () => {
  data.value.push({
    name: '',
    phone: '',
    status: '',
    rate: 0,
    num: 0,
    remark: ''
  })
}

const submit = async () => {
  try {
    await EditTableRef.value?.formRef?.validate()
    ElMessage.success('校验成功')
  } catch (error) {
    const data: any[] = Object.values(error as any)
    if (data.length) {
      ElMessage.warning(data[0][0].message)
    }
  }
}

const onDelete = (index: number) => {
  data.value.splice(index, 1)
}
</script>

<style lang="scss" scoped></style>