基于elementUI实现一个可编辑的表格(简洁版)

需求:

实现一个可编辑、增加、删除的表格,每一项是可编辑的输入框、

注:使用vue3+elementui

实现

1、dom部分

html 复制代码
<el-form :model="formData" ref="formRef">
                <el-table :data="filteredTableData" border fit max-height="800">
                <el-table-column label="序号" width="100" align="center">
                    <template #default="{ $index }">
                        {{ $index + 1 }}
                    </template>
                </el-table-column>
                <el-table-column label="手机号" align="center">
                    <template #default="{ row, $index }">
                    <el-form-item
                        :prop="`tableData.${$index}.phone_num`"
                        :rules="phoneRules"
                    >
                        <el-input v-model="row.phone_num" placeholder="请输入手机号" />
                    </el-form-item>
                    </template>
                </el-table-column>
                <el-table-column label="年龄" align="center">
                    <template #default="{ row, $index }">
                    <el-form-item
                        :prop="`tableData.${$index}.car_plate_num`"
                        :rules="plateRules"
                    >
                        <el-input v-model="row.car_plate_num" placeholder="请输入年龄" />
                    </el-form-item>
                    </template>
                </el-table-column>
                <el-table-column label="身高" align="center">
                    <template #default="{ row, $index }">
                    <el-form-item
                        :prop="`tableData.${$index}.vin`"
                        :rules="vinRules"
                    >
                        <el-input v-model="row.vin" placeholder="请输入身高" />
                    </el-form-item>
                    </template>
                </el-table-column>
                <!-- 操作列 -->
                <el-table-column label="操作" align="center" width="100">
                    <template #default="{ row, $index }">
                        <el-icon color="#f56c6c" @click="deleteFilteredRow($index)"><Delete /></el-icon>
                    </template>
                </el-table-column>
                </el-table>
                <el-button style="margin-top:10px" type="primary" plain @click="addRow">+ 添加</el-button>
            </el-form>

2、js部分

javascript 复制代码
// 搜索相关变量
const searchPhone = ref('')
const filteredTableData = ref([])
const originalTableData = ref([])
const tableData = ref<ChargeConfig[]>([]);
// 表单数据
const formData = reactive({
  tableData: [
    { phone_num: '', car_plate_num: '', vin: '' },
  ],
})
const formRef = ref<FormInstance>()
// 表单校验部分
const phoneRules = [{ required: true, message: '请输入手机号', trigger: 'blur' }, { pattern: /^1[3-9]\d{9}$/, message: '请输入11位手机号', trigger: 'blur' }]
const plateRules = [{ required: true, message: '请输入年龄', trigger: 'blur' }]
const vinRules = [{ required: true, message: '请输入身高', trigger: 'blur' }]

// 表单数据
const formData = reactive({
  tableData: [
    { phone_num: '', car_plate_num: '', vin: '' },
  ],
})
const formRef = ref<FormInstance>()
const whiteListVisible = ref(false)

// 手机号搜索方法
const handlePhoneSearch = () => {
    const keyword = searchPhone.value.trim()
    if (!keyword) {
        filteredTableData.value = [...formData.tableData]
    } else {
        filteredTableData.value = formData.tableData.filter(item => 
            item.phone_num && item.phone_num.includes(keyword)
        )
    }
}
// 重置搜索
const resetPhoneSearch = () => {
    searchPhone.value = ''
    filteredTableData.value = [...formData.tableData]
}
// 删除行
const deleteFilteredRow = (index: number) => {
    const deletedItem = filteredTableData.value[index]
    
    // 从原始数据中删除
    const originalIndex = formData.tableData.findIndex(item => 
        item.phone_num === deletedItem.phone_num && 
        item.car_plate_num === deletedItem.car_plate_num && 
        item.vin === deletedItem.vin
    )
    
    if (originalIndex > -1) {
        formData.tableData.splice(originalIndex, 1)
    }
    // 更新过滤后的数据
    handlePhoneSearch()
}
// 添加行
const addRow = () => {
    resetPhoneSearch()
    const newRow = { phone_num: '', car_plate_num: '', vin: '' }
    formData.tableData.push(newRow)
    handlePhoneSearch()
}
// 保存
const saveList = () => {
    // 校验一下表单填写
    formRef.value.validate(valid => {
		if (!valid){
            ElMessage.error("请填写表");
            return;
        }
        // 校验成功,调用接口保存操作
    }).catch(() => {
        ElMessage.error("校验失败,请刷新重试");
    })
}

3.css部分

这里主要是调整一下表格内输入框的位置(看你自己需要,可不用)

scss 复制代码
<style scoped>
:deep(.el-table .cell) {
  padding-top: 12px!important;
}
</style>

end~

希望记录的问题能帮助到你!

相关推荐
一次旅行4 小时前
DeepSeek‑V4.1‑Flash‑1017完整解读:模型升级+Search/Fetch搜索API开放,Agent开发者要注意哪些坑
前端·网络·人工智能
原则猫12 小时前
UDP 到底怎么实现可靠的
前端
Java后端的Ai之路12 小时前
14、ReactJS - 路由(Router)
前端·react.js·状态模式
持敬chijing13 小时前
白盒测试与代码审计-js登录逆向实战
javascript·网络·安全·web安全·网络安全·网络攻击模型
优选资源分享13 小时前
PicGo v3.0.3 新版 | 开源免费图床工具
javascript·笔记·electron
裕晟资质规划14 小时前
三类涉密资质延续时限差异分析:军工60日与集成印制3个月的边界
java·服务器·前端·网络·安全
ShineWinsu14 小时前
对于JavaScript:JavaScript基础语法的解析
开发语言·前端·javascript·面试·web·基础语法·循环
月夏14 小时前
Vue3 转 React:18 项对照表 + 5 个必踩的坑(附 7 天上手路线)
前端
广州华水科技14 小时前
单北斗GNSS位移监测系统的应用与维护解析
前端
普通人615 小时前
php+html+canvas实现树状打开的结构
开发语言·javascript·html5·1024程序员节