vue3 +element ui plus 实现表格 行分页、搜索、行内编辑、行内下拉框选择功能、多表头,能帮我样式写好看点,封装成一个组件,然后调用 吗
时间: 2024-12-10 15:41:32 浏览: 24
在Vue3中使用Element Plus以及Table组件来实现上述功能是一个常见的前端任务。首先,你需要安装相关的依赖,如`vue-element-plus`:
```bash
npm install vue-element-plus@latest @el-plus/components table
```
接下来,我们将创建一个名为`TableComponent.vue`的组件,结合Element UI Plus的`<el-table>`和相应的功能:
```html
<template>
<el-table
:data="tableData"
style="width: 100%"
:row-key="getRowKey"
:loading="isLoading"
@fetch-data="onFetchData"
:filter-method="handleFilter"
ref="table"
>
<!-- 添加列配置 -->
<el-table-column prop="name" label="姓名" width="180"></el-table-column>
<el-table-column prop="age" label="年龄" width="180"></el-table-column>
<!-- ...其他列... -->
<!-- 分页 -->
<el-pagination
v-if="total"
@current-change="setCurrentPage"
:current-page.sync="currentPage"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
></el-pagination>
<!-- 行内编辑 -->
<template #editRow="{ row }">
<el-input v-model="row.name" placeholder="请输入名字"></el-input>
<el-select v-model="row.role" placeholder="请选择角色">
<el-option value="admin" label="管理员"></el-option>
<el-option value="user" label="普通用户"></el-option>
</el-select>
</template>
<!-- 多表头 -->
<el-table-column type="expand" render="expandRowContent">
</el-table-column>
</el-table>
</template>
<script>
export default {
name: "TableComponent",
components: { ElPagination },
data() {
return {
tableData: [],
isLoading: false,
currentPage: 1,
pageSize: 10,
searchKeyword: "",
columnHeadings: [
{ field: "name", title: "姓名" },
{ field: "role", title: "角色" }, // 更多字段...
],
columns: [], // 根据columnHeadings动态生成列
};
},
computed: {
total() {
// 返回总记录数,例如从服务器获取数据时填充
return this.tableData.length;
},
getRowKey(item) {
// 如果需要唯一标识每一行,返回对应的属性值
return item.id || item.key; // 假设item有id属性
},
},
methods: {
onFetchData(page, size) {
// 这里可以去请求后台数据,并将结果赋值给tableData
this.isLoading = true;
setTimeout(() => {
const result = { data: [...this.randomData(size)], total: this.total };
this.tableData = result.data;
this.isLoading = false;
}, 1000);
},
handleFilter(value, column) {
// 搜索函数,可以根据column.field和value进行过滤
return column.field === 'name' ? { name: { $like: `%${value}%` } } : {};
},
setCurrentPage(newPage) {
this.currentPage = newPage;
},
expandRowContent({ $index, row }) {
// 展开行内容的实现
return `
<div class="expand-row">
<p>详细信息...</p>
<!-- 可添加更多详细信息 -->
</div>
`;
},
randomData(size) {
// 示例数据生成
return Array.from({ length: size }, (_, i) => ({
id: i,
name: `Name ${i}`,
role: ['admin', 'user'][Math.floor(Math.random() * 2)],
}));
},
},
};
</script>
<style scoped>
.expand-row {
/* 自定义展开行样式 */
}
</style>
```
这个组件已经包含了基本的功能,你可以直接导入并使用。为了使其样式更美观,可以在`<style scoped>`标签内的CSS部分自定义样式。
阅读全文