<template><div><el-table :data="tableData" style="width: 100%"><!-- 动态生成表头和列 --><el-table-column v-for="column in columns" :key="column.prop" :label="column.label" :prop="column.prop"><template v-slot:default="scope"><component :is="renderCell(column, scope.row)" /></template></el-table-column></el-table><el-button @click="toggleEdit">{{ isEditing ? '保存' : '编辑' }}</el-button></div>
</template><script setup>
import { ref, reactive, h } from 'vue';// 模拟从后端获取的数据
const backendData = {columns: [{ label: '姓名', prop: 'name', editable: true, type: 'input' },{ label: '年龄', prop: 'age', editable: true, type: 'input' },{ label: '性别', prop: 'gender', editable: true, type: 'select' },{ label: '入职日期', prop: 'hireDate', editable: false, type: 'date' }],data: [{ name: '张三', age: 28, gender: '男', hireDate: '2023-01-01' },{ name: '李四', age: 35, gender: '女', hireDate: '2023-02-15' }]
};// 表头数据
const columns = ref(backendData.columns);// 表格数据
const tableData = ref([...backendData.data]);// 是否处于编辑状态
const isEditing = ref(false);// 切换编辑状态
const toggleEdit = () => {if (isEditing.value) {// 保存操作console.log('保存数据:', tableData.value);}isEditing.value = !isEditing.value;
};// 根据列类型和行数据生成渲染函数
const renderCell = (column, row) => {return () => {const value = row[column.prop];if (!column.editable || !isEditing.value) {return h('span', {}, value);}switch (column.type) {case 'input':return h('el-input',{modelValue: value,'onUpdate:modelValue': (newValue) => {row[column.prop] = newValue;},onBlur: () => handleBlur(row, column.prop),onChange: (event) => handleChange(row, column.prop, event)});case 'select':return h('el-select',{modelValue: value,'onUpdate:modelValue': (newValue) => {row[column.prop] = newValue;},onChange: (event) => handleChange(row, column.prop, event)},getOptions(column.prop).map(option =>h('el-option', { key: option.value, label: option.label, value: option.value })));case 'date':return h('el-date-picker',{modelValue: value,'onUpdate:modelValue': (newValue) => {row[column.prop] = newValue;},onChange: (event) => handleChange(row, column.prop, event)});default:return h('span', {}, value);}};
};// 获取选项数据(仅用于 select 类型)
const getOptions = (prop) => {if (prop === 'gender') {return [{ value: '男', label: '男' },{ value: '女', label: '女' }];}return [];
};// 处理输入框失去焦点事件
const handleBlur = (row, prop) => {console.log(`第 ${tableData.value.indexOf(row) + 1} 行的 ${prop} 字段失去焦点`);
};// 处理选择器值变化事件
const handleChange = (row, prop, value) => {console.log(`第 ${tableData.value.indexOf(row) + 1} 行的 ${prop} 字段值变为 ${value}`);
};
</script><style scoped>
/* 添加一些样式以美化表格 */
.el-table {margin-bottom: 20px;
}
</style>
vue3自定义表格生成动态列
2025/1/31 9:33:09
来源:https://blog.csdn.net/qq_26889291/article/details/145343924
浏览:
次
关键词:vue3自定义表格生成动态列
版权声明:
本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。
我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com
热文排行
- 本周后半段,北方将遭今春首场沙尘天气
- 编程-设计模式 6:适配器模式
- 如何利用大数据技术来识别和预防网络赌博行为?
- 2024年全国青少年信息素养python编程复赛真题+答案
- LLMs之Llama 3.1:Llama 3.1的简介、安装和使用方法、案例应用之详细攻略
- JVM:SpringBoot TomcatEmbeddedWebappClassLoader
- No module named ‘tvtk.custom.light‘ mayavi
- 解决 Ubuntu 系统中 “Temporary Failure in Name Resolution“ 错误
- YOLOv10有效涨点专栏目录
- 开普勒优化算法( KOA)及其Python和MATLAB实现