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

注:使用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~
希望记录的问题能帮助到你!