Skip to content

表单构建

快速开始

安装

sh
pnpm add @howuse/element-plus-edit-table
sh
npm i @howuse/element-plus-edit-table
sh
yarn add @howuse/element-plus-edit-table

简单示例

<template>
    <div class="vp-raw">
        <ElEditTable v-model:data="data" ref="myTable" :is-edit="true">
            <ElEditTableColumn type="expand">
                <template #default="{ row }">
                    展开的内容 {{ row }}
                </template>
            </ElEditTableColumn>
            <ElEditTableColumn label="ID" prop="id" :is="ElInput" :rules="idRules"></ElEditTableColumn>
            <ElEditTableColumn label="性别" prop="gender" :is="ElSelect" :data="selectData" optionLabel="label"
                optionValue="value" :rules="genderRules">
            </ElEditTableColumn>
        </ElEditTable>

        <ElButton @click="save" type="primary">保存</ElButton>
    </div>
</template>
<script setup lang="ts">
import { ElEditTable, ElEditTableColumn } from "@howuse/element-plus-edit-table"
import { ElInput, ElSelect, ElButton } from "element-plus"
import { ref, unref } from 'vue';

const myTable = ref();

const idRules = [
    { required: true, message: '请输入ID', trigger: 'change' }
]
const genderRules = [
    { required: true, message: '请选择性别', trigger: 'change' }
]

const selectData = [
    { label: '男', value: 1 },
    { label: '女', value: 2 },
]

const data = ref([
    { id: 11, gender: 1 },
])

function save() {
    unref(myTable).validate().then(() => {
        alert(JSON.stringify(unref(data)))
    })
}
</script>
<style scoped></style>

切换编辑状态

操作按钮需要在 视图状态 编辑状态均展示,一般需要此操作时,需要增加 allDisplay 属性

<template>
    <div class="vp-raw">
        <ElEditTable v-model:data="data" ref="myTable" :rules="rules">
            <ElEditTableColumn label="ID" prop="id" :is="ElInput"></ElEditTableColumn>
            <ElEditTableColumn label="性别" prop="gender" :is="ElSelect" :data="selectData" optionLabel="label"
                optionValue="value">
                <template #view="{ text }">
                    <ElTag type="success" v-if="text === 1">男</ElTag>
                    <ElTag type="danger" v-else>女</ElTag>
                </template>
            </ElEditTableColumn>
            <ElEditTableColumn label="操作" prop="operation" allDisplay>
                <template #default="{ row, edit, $index }">
                    <el-button class="el-form-item" link @click="editRow(row, edit, $index)">{{ edit ? '保存' : '编辑'
                    }}</el-button>
                </template>
            </ElEditTableColumn>
        </ElEditTable>

        <el-space>
            <ElButton type="primary" @click="toggleEditStatus()">{{ isEdit ? '保存全部' : '编辑全部' }}</ElButton>
        </el-space>
    </div>
</template>
<script setup lang="ts">
import { ElEditTable, ElEditTableColumn } from "@howuse/element-plus-edit-table"
import { ElInput, ElSelect, ElButton, ElSpace, ElMessage, ElTag } from "element-plus"
import { ref, unref } from 'vue';

const myTable = ref();
const isEdit = ref(true);

const rules = {
    id: [
        { required: true, message: '请输入ID', trigger: 'change' }
    ],
    gender: [
        { required: true, message: '请选择性别', trigger: 'change' }
    ]
}

const selectData = [
    { label: '男', value: 1 },
    { label: '女', value: 2 },
]

const data = ref([
    { id: 1, gender: 1 },
    { id: 2, gender: 2 },
])

function toggleEditStatus() {
    isEdit.value = !isEdit.value
    unref(myTable).toggleEditStatus({ edit: isEdit.value, $index: -1 })
}

async function editRow(row, edit, $index) {
    if (edit) {
        unref(myTable).validate().then(() => {
            ElMessage.success('保存成功')
            unref(myTable).toggleEditStatus({ edit: !edit, $index: $index })
        }).catch(err => {
            ElMessage.error(err.message)
        })
    } else {
        unref(myTable).toggleEditStatus({ edit: !edit, $index: $index })
    }

}
</script>
<style scoped></style>

混合状态

兼容原有ElTable的选项,不需要编辑状态可直接用ElTableColumn代替ElEditTableColumn

<template>
    <div class="vp-raw">
        <ElEditTable v-model:data="data" ref="myTable" :default-status="'edit'">
            <ElTableColumn label="ID" prop="id"></ElTableColumn>
            <ElEditTableColumn label="性别" prop="gender" :is="ElSelect" :data="selectData" optionLabel="label"
                optionValue="value">
            </ElEditTableColumn>
        </ElEditTable>
    </div>
</template>
<script setup lang="ts">
import { ElEditTable, ElEditTableColumn } from "@howuse/element-plus-edit-table"
import { ElSelect, ElTableColumn } from "element-plus"
import { ref } from 'vue';

const myTable = ref();
const isEdit = ref(true);

const selectData = [
    { label: '男', value: 1 },
    { label: '女', value: 2 },
]

const data = ref([
    { id: 11, gender: 1 },
])
</script>
<style scoped></style>

Api

兼容element-plus table 所有属性,参考element-plus-table-api

ElEditTable

属性

属性名说明类型默认值
v-model:data数据列表Array[]
defaultStatus当前展示状态 'edit'/'view''edit' | 'view''edit'

ElEditTableColumn

属性

属性名说明类型默认值
is组件名称Component-
rules校验规则,参考element-plus/form[]-
data额外数据,下拉框等可用[][]
optionLabel下拉框标签对应键名称[]undefined
optionValue下拉框值对应键名称[]undefined
formItemProps表单选项属性Object{}
allDisplay是否在编辑和使徒状态均展示该按钮操作booleanfalse

插槽

属性名说明类型默认值
default编辑状态内容--
view视图状态内容--