结合Element Ui 练习一个案例
题目要求
需要使用element-plus组件库来实现
需要在每行数据最后一列放置两个按钮:“删除”、“编辑”
点击“删除”按钮,弹出是否删除确认框,实现删除功能
点击“编辑”按钮,弹出编辑框,实现编辑功能
填充数据如下
[
{
id: 1,
name: '登录接口_自动化测试平台项目',
tester: 'shisuiyi',
project: '自动化测试平台项目',
project_id: 1,
desc: '登录接口',
create_time: '2019-11-06 14:50:30',
testcases: 9
},
{
id: 2,
name: '注册接口_自动化测试平台项目',
tester: '可可',
project: '自动化测试平台项目',
project_id: 1,
desc: '自动化测试平台项目,注册接口',
create_time: '2019-11-06 14:51:00',
testcases: 0
},
{
id: 3,
name: '创建项目接口_自动化测试平台项目',
tester: 'shisuiyi',
project: '自动化测试平台项目',
project_id: 1,
desc: '这是自动化测试平台创建项目接口',
create_time: '2019-11-06 14:51:45',
testcases: 1
},
{
id: 4,
name: '注册接口_前程贷P2P金融项目',
tester: '小可可',
project: '前程贷P2P金融项目',
project_id: 2,
desc: '',
create_time: '2019-11-06 14:52:22',
testcases: 0
},
{
id: 5,
name: '登录接口_前程贷P2P金融项目',
tester: 'shisuiyi',
project: '前程贷P2P金融项目',
project_id: 2,
desc: '',
create_time: '2019-11-06 14:52:40',
testcases: 0
},
{
id: 6,
name: '查看项目列表接口_前程贷P2P金融项目',
tester: 'shisuiyi',
project: '前程贷P2P金融项目',
project_id: 2,
desc: '',
create_time: '2019-11-06 17:22:50',
testcases: 1
}
]
我的答案
<template>
<el-table :data="filterTableData" style="width: 100%">
<el-table-column label="ID" prop="id" />
<el-table-column label="接口名" prop="name" />
<el-table-column label="测试人员" prop="tester" />
<el-table-column label="项目名" prop="project" />
<el-table-column label="项目ID" prop="project_id" />
<el-table-column label="描述详细" prop="desc" />
<el-table-column label="创建时间" prop="create_time" />
<el-table-column label="用例数" prop="testcases" />
<el-table-column align="right">
<template #default="scope">
<el-button size="small" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
<el-button size="small" type="danger" @click="openDeleteDialog(scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 编辑弹框 -->
<el-dialog v-model="showEditDialog" title="编辑表格中的数据" width="50%">
<template #default>
<input v-model="editedRow.name" placeholder="接口名" />
<input v-model="editedRow.tester" placeholder="测试人员" />
<input v-model="editedRow.project" placeholder="项目名" />
<input v-model="editedRow.project_id" placeholder="项目ID" />
<input v-model="editedRow.desc" placeholder="描述详细" />
<input v-model="editedRow.create_time" placeholder="描述详细" />
<input v-model="editedRow.testcases" placeholder="用例数" />
</template>
<template #footer>
<span class="dialog-footer">
<el-button @click="cancelEdit">取消</el-button>
<el-button type="primary" @click="confirmEdit">确定</el-button>
</span>
</template>
</el-dialog>
<!-- 删除弹框 -->
<el-dialog v-model="handleDeleteDialogVisible" title="删除!!!" width="30%">
<span>请确认是否删除</span>
<template #footer>
<span class="dialog-footer">
<el-button @click="cancelDelete">取消</el-button>
<el-button type="primary" @click="confirmDelete">确认</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { computed, ref,reactive} from 'vue'
// interface 是 TypeScript 语言中的一个关键字,用于定义对象的结构和属性类型。
interface User {
id: number
name: string
tester: string
project: string
project_id: number
desc: string
create_time: string
testcases: number
}
const search = ref('')
const filterTableData = computed(() =>
tableData.filter(
(data) =>
!search.value ||
data.name.toLowerCase().includes(search.value.toLowerCase())
)
)
let showEditDialog = ref(false)
const handleEdit = (index: number, row: User) => {
console.log(index, row)
editRowIndex.value = index
editedRow.value = { ...row }
showEditDialog.value = true
}
// 首先,handleEdit是一个函数,它接受两个参数:index和row。index是当前行的索引,
// row是当前行的数据对象。在函数体内,我们首先使用console.log打印出这两个值,以便调试时查看。
// 然后,将index赋值给editRowIndex.value,使得editRowIndex的值变为当前行的索引。
// 接着,使用对象扩展运算符{ ...row }克隆row对象,并将结果赋值给editedRow.value,
// 从而实现对编辑行的数据进行修改。最后,将showEditDialog.value设置为true,显示编辑对话框。
const editRowIndex = ref(-1)
// 接下来,editRowIndex是一个ref响应式对象,初始值设为-1。
// 在编辑过程中,当点击某一行的编辑按钮时,会将该行的索引值赋给editRowIndex.value,以表示正在编辑的行的索引。
const editedRow = ref<User>({
id: 0,
name: '',
tester: '',
project: '',
project_id: 0,
desc: '',
create_time: '',
testcases: 0
})
// editedRow也是一个ref响应式对象,初始值是一个用户对象,
// 其中的各个属性都为空或默认值。用于存储正在编辑的行的数据,通过v-model绑定到编辑对话框的表单上。
const cancelEdit = () => {
showEditDialog.value = false
editRowIndex.value = -1
}
// 接着,cancelEdit函数用于取消编辑操作。
// 在函数体内,将showEditDialog.value设置为false,隐藏编辑对话框;将editRowIndex.value设置为-1,
// 表示没有正在编辑的行。
const confirmEdit = () => {
if (editRowIndex.value > -1 && editedRow.value) {
tableData.splice(editRowIndex.value, 1, { ...editedRow.value })
}
showEditDialog.value = false
editRowIndex.value = -1
}
// 最后,confirmEdit函数用于确认编辑操作。在函数体内,首先判断editRowIndex.value是否大于-1且editedRow.value是否存在。
// 如果满足条件,则使用tableData.splice方法将表格数据中对应的项替换为editedRow.value,从而实现编辑的更新操作
// 然后,将showEditDialog.value设置为false,隐藏编辑对话框;将editRowIndex.value设置为-1,表示没有正在编辑的行。
// tableData.splice(editRowIndex.value, 1, editedRow.value)的作用是将 editedRow.value 对象插入到 tableData
// 数组中的 editRowIndex.value 索引位置,并替换掉原始的元素。通过这种方式,可以实现对表格数据的编辑操作。
const openDeleteDialog = (index: number) => {
handleDelete.value = index
handleDeleteDialogVisible.value = true
}
const handleDelete = ref(-1)
const handleDeleteDialogVisible = ref(false)
const cancelDelete = () => {
handleDelete.value = -1
handleDeleteDialogVisible.value = false
}
const confirmDelete = () => {
if (handleDelete.value > -1) {
tableData.splice(handleDelete.value, 1)
// 删除表格数据后,Vue.js会自动重新渲染表格
}
handleDelete.value = -1
handleDeleteDialogVisible.value = false
}
const tableData = reactive<User[]>([
{
id: 1,
name: '登录接口_自动化测试平台项目',
tester: 'shisuiyi',
project: '自动化测试平台项目',
project_id: 1,
desc: '登录接口',
create_time: '2019-11-06 14:50:30',
testcases: 9
},
{
id: 2,
name: '注册接口_自动化测试平台项目',
tester: '可可',
project: '自动化测试平台项目',
project_id: 1,
desc: '自动化测试平台项目,注册接口',
create_time: '2019-11-06 14:51:00',
testcases: 0
},
{
id: 3,
name: '创建项目接口_自动化测试平台项目',
tester: 'shisuiyi',
project: '自动化测试平台项目',
project_id: 1,
desc: '这是自动化测试平台创建项目接口',
create_time: '2019-11-06 14:51:45',
testcases: 1
},
{
id: 4,
name: '注册接口_前程贷P2P金融项目',
tester: '小可可',
project: '前程贷P2P金融项目',
project_id: 2,
desc: '',
create_time: '2019-11-06 14:52:22',
testcases: 0
},
{
id: 5,
name: '登录接口_前程贷P2P金融项目',
tester: 'shisuiyi',
project: '前程贷P2P金融项目',
project_id: 2,
desc: '',
create_time: '2019-11-06 14:52:40',
testcases: 0
},
{
id: 6,
name: '查看项目列表接口_前程贷P2P金融项目',
tester: 'shisuiyi',
project: '前程贷P2P金融项目',
project_id: 2,
desc: '',
create_time: '2019-11-06 17:22:50',
testcases: 1
}
])
</script>
<style scoped>
.dialog-footer button:first-child {
margin-right: 10px;
}
</style>
评论