vue使用element-plus依赖实现表格增加的示例代码
作者:程序酷巴戈
【需求】实现表格增加行数据。
<template> <el-table :data="usercases" style="width: 100%" border :key='id'> <el-table-column fixed prop="id" label="ID" width="50" /> <el-table-column prop="name" label="接口名" width="280" /> <el-table-column prop="tester" label="测试人员" width="120" /> <el-table-column prop="project" label="项目" width="200" /> <el-table-column prop="project_id" label="项目ID" width="120" /> <el-table-column prop="desc" label="描述" width="200" /> <el-table-column prop="create_time" label="创建时间" width="200" /> <el-table-column prop="testcases" label="用例数" width="100" /> <el-table-column fixed="right" label="操作" width="120"> <template #default="{row}"> <el-button link type="primary" size="small" @click="deleteButton(row)">删除</el-button> <el-button link type="primary" size="small" @click='editCase(row)'>修改</el-button> </template> </el-table-column> </el-table> <!-- 编辑对话框 --> <el-dialog v-model="editDialogVisible" title="编辑案例"> <el-form v-model="tempcase"> <el-form-item label="ID" :label-width="formLabelWidth" readonly> <el-input v-model="tempcase.id" autocomplete="off" /> </el-form-item> <el-form-item label="接口名" :label-width="formLabelWidth"> <el-input v-model="tempcase.name" autocomplete="off" /> </el-form-item> <el-form-item label="测试人员" :label-width="formLabelWidth"> <el-input v-model="tempcase.tester" autocomplete="off" /> </el-form-item> <el-form-item label="项目" :label-width="formLabelWidth"> <el-input v-model="tempcase.project" autocomplete="off" /> </el-form-item> <el-form-item label="项目ID" :label-width="formLabelWidth"> <el-input v-model="tempcase.project_id" autocomplete="off" /> </el-form-item> <el-form-item label="描述" :label-width="formLabelWidth"> <el-input v-model="tempcase.desc" autocomplete="off" /> </el-form-item> <el-form-item label="创建时间" :label-width="formLabelWidth"> <el-input v-model="tempcase.create_time" autocomplete="off" /> </el-form-item> <el-form-item label="用例数" :label-width="formLabelWidth"> <el-input v-model="tempcase.testcases" autocomplete="off" /> </el-form-item> </el-form> <template #footer> <span class="dialog-footer"> <el-button @click="cancelSubmit">取消</el-button> <el-button type="primary" @click="confirmEdit">确认</el-button> </span> </template> </el-dialog> </template> <script> import { ElMessage, ElMessageBox } from 'element-plus' export default { data() { return { usercases: [{ id: 1, name: "查看项目列表接口_INlove即时通讯项目", tester: "酷巴戈", project: "INlove即时通讯项目", project_id: 2, desc: "", create_time: "2023-11-06 17:22:50", testcases: 1 }, { id: 2, name: "登录接口_自动化测试平台项目", tester: "csdn", project: "自动化测试平台项目", project_id: 1, desc: "登录接口", create_time: "2023-12-06 14:50:30", testcases: 9 } ], tempcase: { id: null, name: "", tester: "", project: "", project_id: null, desc: "", create_time: "", testcases: null }, editDialogVisible: false, } }, methods: { deleteButton(row) { ElMessageBox.confirm( '是否确认删除', '提醒', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', } ) .then(() => { this.usercases = this.usercases.filter((item) => item !== row); ElMessage({ type: 'success', message: '删除成功', }) }) .catch(() => { ElMessage({ type: 'info', message: '删除取消', }) }) }, cancelSubmit(){ this.editDialogVisible = false; }, editCase(row) { // 将编辑用例的对话框设为可见 this.editDialogVisible = true; // 将当前行的数据赋值给 tempcase,这样对话框中的表单就会显示当前行的值 this.tempcase = { ...row }; }, confirmEdit() { const index = this.usercases.findIndex((item) => item.id === this.tempcase.id); //能找到就返回正常的索引id,找不到就返回-1 if (index !== -1) { this.usercases.splice(index, 1, { ...this.tempcase }); // 提示编辑成功 ElMessage.success('编辑成功'); // 关闭编辑对话框 this.editDialogVisible = false; } else { ElMessage.error('未找到相应项'); } } }, } </script> <style scoped> </style>
【分析需求】
实现增加数据行,那需要准备这些功能:
- 一个新增case的按钮
- 一个对话框,对话框须支持input,且原始输入框为空的
- 单击保存后能保存数据对象到usercases里面
- 再次触发新增case按钮的时候,输入框是空的
【处理需求】
1、新增case按钮
按钮很简单,可以直接拿来删除或修改的按钮来用,放在表格上面或下面都行。
<el-button type="primary" @click="">新增用例</el-button> <br /> <br /> <el-table :data="usercases" style="width: 100%" border :key='id'> // 其他代码 </el-table>
为了整体美观,可以加个换行。不过要注意的是,这个按钮是放在表格外的。
2、对话框:输入框为空
这个和修改按钮的处理很像。只是修改按钮要求点击的事件能够带出数据,而新增按钮要求点击的事件是不带出事件。仔细一看修改的单击事件指向的方法传递了row值,那新增这块不传递不就可了?
// 在methods中加入方法,并在 按钮的单击事件绑定这个方法@click="addCase" addCase() { this.editDialogVisible = true; },
3、保存数据
预览效果发现,倒是能弹出对话框了,怎么点击确认,会报错呢?
仔细看代码,可以发现,这个对话框的确认按钮,我们在定义修改用例的时候,已经给它设置了规则。因为不管输入什么内容,index返回的都是-1,在原来的usercases里面找不到id,所以才报错。
confirmEdit() { const index = this.usercases.findIndex((item) => item.id === this.tempcase.id); if (index !== -1) { this.usercases.splice(index, 1, { ...this.tempcase }); ElMessage.success('编辑成功'); this.editDialogVisible = false; } else { ElMessage.error('未找到相应项'); } },
因此,我们需要定义一个属于增加用例的【确认按钮】,但在同一个对话框内,显示三个按钮,两个都是提交的,这样显然不太合理。
如果简单地解决,可以使用v-show:
- 从addCase进入的对话框,就显示【提交】
- 从editCase,就显示【确认】
那么,我们需要对这两个按钮也做一个可视化的处理。
// 其他数据 <template #footer> <span class="dialog-footer"> <el-button type="primary" @click="cancelSubmit"> 取消 </el-button> <el-button @click="confirmEdit" v-show="confirmEditVisiable">确认编辑</el-button> <el-button @click="confirmAdd" v-show="confirmAddVisiable">提交</el-button> </span> </template> // 其他数据 <script> export default { data() { return { // 其他数据 editDialogVisible: false, confirmAddVisiable: false, confirmEditVisiable: false, } }, methods: { // 其他代码 cancelSubmit() { this.editDialogVisible = false; // 取消,不显示对话框 this.confirmAddVisiable = false; // 不显示确认按钮 this.confirmEditVisiable = false; // 不显示提交按钮 }, editCase(row) { this.editDialogVisible = true; // 单击修改按钮,显示对话框,显示确认按钮 this.confirmEditVisiable = true; this.tempcase = { ...row }; }, confirmEdit() { const index = this.usercases.findIndex((item) => item.id === this.tempcase.id); if (index !== -1) { this.usercases.splice(index, 1, { ...this.tempcase }); this.confirmEditVisiable = false; // 编辑成功,不显示确认按钮 ElMessage.success('编辑成功'); this.editDialogVisible = false; } else { ElMessage.error('未找到相应项'); // 没有将对话框和确认按钮的值修改,则是维持为true的状态 } }, addCase() { this.editDialogVisible = true; // 单击新增按钮,显示对话框,显示提交按钮 this.confirmAddVisiable = true; // 因为在上一步的取消中,已经定义确认按钮为false不显示的状态,所以此时不会出现确认和提交并存的状态 }, confirmAdd() { this.confirmAddVisiable = false; // 提交成功,不显示确认按钮 this.usercases.push({ ...this.tempcase }); this.editDialogVisible = false; ElMessage({ type: 'success', message: '提交成功', }); }, }, } </script>
预览效果可以发现,没有对输入框做校验,导致会生成很多一样的数据,这个肯定是需要修改的。
可以直接在addCase中添加一个基本的校验条件:
confirmAdd() { if (this.isValidInput()) { // this.updateCurrentTime(); this.cases.push({ ...this.tempcase }); this.editDialogVisible = false; this.confirmAddVisiable = false; ElMessage({ type: 'success', message: '提交成功', }); } else { ElMessage.error('请检查输入项是否完整!') } }, isValidInput() { return ( this.tempcase.id !== null && this.tempcase.name !== '' && this.tempcase.tester !== '' && this.tempcase.project !== '' && this.tempcase.project_id !== null && this.tempcase.create_time != '' && this.tempcase.testcases !== null ) },
一定要注意,this.confirmAddVisiable = false; 要发生在提交成功后,不然就会像这样,对话框还在,但是提交按钮没了。
4、置空对话框
置空对话框很重要,不然会发现,不管是新增还是修改,不论是取消还是确认或提交,只要使用了tempcase,上一次的数据都会残留在对话框内。根据不同需求做不同的处理,然而此处,我们要实现每一次的点击都是新的开始。
我们在前面已经知道,对话框里的数据是来自data中的tempcase,那如果要置空tempcase,就得要有tempcase2号把它的空的值写给tempcase。
第一步:先定义一个tempcase2号,然后赋值给tempcase。
resetTempCase() { return this.tempcase = this.getEmptyTempCase() }, getEmptyTempCase() { return { id: null, name: "", tester: "", project: "", project_id: null, desc: "", create_time: "", testcases: null, } },
第二步:调用置空方法。
在哪里调用呢?很明显,在对话框下一次展示之前就需要置空,也就是在对话框关闭的时候,需要同时清除上一次保存在tempcase中的数据。
<template> // 其他代码 </template> <script> export default { // 其他代码 methods: { // 其他代码 cancelSubmit() { // 其他代码 this.resetTempCase(); // 取消置空tempcase }, confirmEdit() { if (index !== -1) { // 其他代码 this.resetTempCase(); // 确认 置空tempcase } else { ElMessage.error('未找到相应项'); } }, confirmAdd() { this.confirmAddVisiable = false; if (this.isValidInput()) { // 其他代码 this.resetTempCase(); // 提交 置空tempcase } else { ElMessage.error('请检查输入项是否完整!') } }, }, } </script> <style scoped> </style>
【完整代码】
<template> <el-button type="primary" @click="addCase">新增用例</el-button> <br /> <br /> <el-table :data="usercases" style="width: 100%" border :key='id'> <el-table-column fixed prop="id" label="ID" width="50" /> <el-table-column prop="name" label="接口名" width="280" /> <el-table-column prop="tester" label="测试人员" width="120" /> <el-table-column prop="project" label="项目" width="200" /> <el-table-column prop="project_id" label="项目ID" width="120" /> <el-table-column prop="desc" label="描述" width="200" /> <el-table-column prop="create_time" label="创建时间" width="200" /> <el-table-column prop="testcases" label="用例数" width="100" /> <el-table-column fixed="right" label="操作" width="120"> <template #default="{row}"> <el-button link type="primary" size="small" @click="deleteButton(row)">删除</el-button> <el-button link type="primary" size="small" @click='editCase(row)'>修改</el-button> </template> </el-table-column> </el-table> <!-- 编辑对话框 --> <el-dialog v-model="editDialogVisible" title="编辑案例"> <el-form v-model="tempcase"> <el-form-item label="ID" :label-width="formLabelWidth" readonly> <el-input v-model="tempcase.id" autocomplete="off" /> </el-form-item> <el-form-item label="接口名" :label-width="formLabelWidth"> <el-input v-model="tempcase.name" autocomplete="off" /> </el-form-item> <el-form-item label="测试人员" :label-width="formLabelWidth"> <el-input v-model="tempcase.tester" autocomplete="off" /> </el-form-item> <el-form-item label="项目" :label-width="formLabelWidth"> <el-input v-model="tempcase.project" autocomplete="off" /> </el-form-item> <el-form-item label="项目ID" :label-width="formLabelWidth"> <el-input v-model="tempcase.project_id" autocomplete="off" /> </el-form-item> <el-form-item label="描述" :label-width="formLabelWidth"> <el-input v-model="tempcase.desc" autocomplete="off" /> </el-form-item> <el-form-item label="创建时间" :label-width="formLabelWidth"> <el-input v-model="tempcase.create_time" autocomplete="off" /> </el-form-item> <el-form-item label="用例数" :label-width="formLabelWidth"> <el-input v-model="tempcase.testcases" autocomplete="off" /> </el-form-item> </el-form> <template #footer> <span class="dialog-footer"> <el-button @click="cancelSubmit">取消</el-button> <el-button type="primary" @click="confirmEdit" v-show='confirmEditVisiable'>确认</el-button> <el-button type="primary" @click="confirmAdd" v-show='confirmAddVisiable'>提交</el-button> </span> </template> </el-dialog> </template> <script> import { ElMessage, ElMessageBox } from 'element-plus' export default { data() { return { usercases: [{ id: 1, name: "查看项目列表接口_INlove即时通讯项目", tester: "酷巴戈", project: "INlove即时通讯项目", project_id: 2, desc: "", create_time: "2023-11-06 17:22:50", testcases: 1 }, { id: 2, name: "登录接口_自动化测试平台项目", tester: "csdn", project: "自动化测试平台项目", project_id: 1, desc: "登录接口", create_time: "2023-12-06 14:50:30", testcases: 9 } ], tempcase: { id: null, name: "", tester: "", project: "", project_id: null, desc: "", create_time: "", testcases: null }, editDialogVisible: false, confirmAddVisiable: false, confirmEditVisiable: false, } }, methods: { deleteButton(row) { ElMessageBox.confirm( '是否确认删除', '提醒', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', } ) .then(() => { this.usercases = this.usercases.filter((item) => item !== row); ElMessage({ type: 'success', message: '删除成功', }) }) .catch(() => { ElMessage({ type: 'info', message: '删除取消', }) }) }, cancelSubmit() { this.editDialogVisible = false; this.confirmAddVisiable = false; this.confirmEditVisiable = false; this.resetTempCase(); }, editCase(row) { this.editDialogVisible = true; this.confirmEditVisiable = true; this.tempcase = { ...row }; }, confirmEdit() { const index = this.usercases.findIndex((item) => item.id === this.tempcase.id); if (index !== -1) { this.usercases.splice(index, 1, { ...this.tempcase }); this.confirmEditVisiable = false; ElMessage.success('编辑成功'); this.editDialogVisible = false; this.resetTempCase(); } else { ElMessage.error('未找到相应项'); } }, addCase() { this.editDialogVisible = true; this.confirmAddVisiable = true; }, confirmAdd() { this.confirmAddVisiable = false; if (this.isValidInput()) { this.cases.push({ ...this.tempcase }); this.editDialogVisible = false; ElMessage({ type: 'success', message: '提交成功', }); this.resetTempCase(); } else { ElMessage.error('请检查输入项是否完整!') } }, isValidInput() { return ( this.tempcase.id !== null && this.tempcase.name !== '' && this.tempcase.tester !== '' && this.tempcase.project !== '' && this.tempcase.project_id !== null && // this.tempcase.create_time != '' && this.tempcase.testcases !== null ) }, resetTempCase() { return this.tempcase = this.getEmptyTempCase() }, getEmptyTempCase() { return { id: null, name: "", tester: "", project: "", project_id: null, desc: "", create_time: "", testcases: null, } }, }, } </script> <style scoped> .el-button--text { margin-right: 15px; } .el-select { width: 300px; } .el-input { width: 300px; } .dialog-footer button:first-child { margin-right: 10px; } .demo-datetime-picker { display: flex; width: 100%; padding: 0; flex-wrap: wrap; } .demo-datetime-picker .block { padding: 30px 0; text-align: center; border-right: solid 1px var(--el-border-color); flex: 1; } .demo-datetime-picker .block:last-child { border-right: none; } </style>
以上就是vue使用element-plus依赖实现表格增加的示例代码的详细内容,更多关于vue element-plus表格增加的资料请关注脚本之家其它相关文章!