vue3 动态配置element 的table

需求

合并行、合并标题、列宽可调整、列顺序可调整、可以控制列是否显示、列布局可保存、导出excel…
需求

参考效果

在这里插入图片描述
在这里插入图片描述

代码

引入

npm i xlsx
npm install element-plus --save

table组件


<template><div><div class="table-btn"><el-tooltip content="高级筛选" placement="bottom" effect="light"><el-button :icon="Search" circle @click="dialogRulesVisible = true" /></el-tooltip><el-tooltip content="修改table" placement="bottom" effect="light"><el-button :icon="EditPen" circle @click="dialogVisible = true" /></el-tooltip><el-tooltip content="导出xlsx" placement="bottom" effect="light"><el-button :icon="Download" circle @click="exportBtn" /></el-tooltip></div><el-table :data="tableData" style="width: 100%" ref="exportTableRef"><template v-for="item in tablePropList"><el-table-columnsortable:key="item.prop":prop="item.prop":label="item.label":align="item.align":width="item.width == 0 ? '' : item.width"v-if="item.isShow == 0":fixed="item.fixed"><template v-if="item.children.length > 0"><template v-for="itemChildren in item.children"><el-table-column:key="itemChildren.prop"sortable:prop="itemChildren.prop":label="itemChildren.label":align="itemChildren.align":width="itemChildren.width == 0 ? '' : itemChildren.width"v-if="itemChildren.isShow == 0"></el-table-column></template></template></el-table-column></template><!-- 插槽 --><slot /></el-table><!-- 把这个改成表格 --><el-dialog v-model="dialogVisible" title="修改表格" width="80%"><div class="over-height"><el-table :data="tablePropList" style="width: 100%" row-key="prop"><el-table-column prop="date" label="表格名"><template #default="scope"><el-input v-model="scope.row.label" /></template></el-table-column><el-table-column prop="date" label="序列"><template #default="scope"><el-input-number v-model="scope.row.index" :min="0" :max="100" /></template></el-table-column><el-table-column prop="date" label="宽度(0为自适应)"><template #default="scope"><el-input-number v-model="scope.row.width" :min="0" :max="1000" /></template></el-table-column><el-table-column prop="date" label="对齐方式"><template #default="scope"><el-select v-model="scope.row.align"><el-option label="左对齐" value="left" /><el-option label="居中" value="center" /><el-option label="右对齐" value="right" /></el-select></template></el-table-column><el-table-column prop="date" label="是否固定"><template #default="scope"><el-select v-model="scope.row.fixed"><el-option label="左侧固定" value="left" /><el-option label="右侧固定" value="right" /></el-select></template></el-table-column><el-table-column prop="date" label="是否显示"><template #default="scope"><el-select v-model="scope.row.isShow"><el-option label="显示" value="0" /><el-option label="隐藏" value="1" /></el-select></template></el-table-column></el-table></div><template #footer><span class="dialog-footer"><el-button type="primary" @click="sortTableData(0)">保存并确定</el-button><el-button type="primary" @click="sortTableData(1)">确定</el-button></span></template></el-dialog><el-dialog v-model="dialogRulesVisible" title="高级筛选" width="80%"><el-button-group class="ml-4"><el-button type="primary" plain @click="rulesTableData(0)">保存方案</el-button><el-button type="primary" plain>另存方案</el-button><el-button type="primary" plain>重置条件</el-button></el-button-group><div class="over-height"><div v-for="item in tablePropList" :key="item.prop"><!-- 允许筛选且显示状态下出现筛选列表 --><template v-if="item.isSwitch && item.isShow"><el-form :inline="true" :model="item" class="demo-form-inline"><el-form-item><el-select v-model="item.rules.a" placeholder="表格"><el-option:label="propItem.label":value="propItem.prop"v-for="propItem in tablePropList":key="propItem.prop"/></el-select></el-form-item><el-form-item><el-select v-model="item.rules.a" placeholder="并且"><el-option label="并且" value="0" /><el-option label="" value="1" /></el-select></el-form-item><el-form-item><el-select v-model="item.rules.b" placeholder="等于"><template v-if="item.propType == 'string'"><el-option label="等于" value="0" /><el-option label="包含" value="1" /><el-option label="大于" value="2" /><el-option label="小于" value="3" /></template><template v-else-if="item.propType == 'number'"><el-option label="等于" value="0" /><el-option label="大于" value="2" /><el-option label="小于" value="3" /></template><template v-else><el-option label="等于" value="0" /><el-option label="大于" value="2" /><el-option label="小于" value="3" /></template></el-select></el-form-item><el-form-item><el-input v-model="item.rules.value" /></el-form-item><el-form-item><el-button :icon="Close" circle @click="exportBtn" /></el-form-item></el-form></template></div></div><template #footer><span class="dialog-footer"><el-button type="primary" @click="rulesTableData(1)">确定</el-button></span></template></el-dialog></div>
</template><script lang="ts" setup>
// npm i xlsx
// npm install element-plus --save
import { EditPen, Download, Search, Close } from "@element-plus/icons-vue";
import { ref } from "vue";
import { toRefs, defineProps, defineEmits } from "vue";
const emit = defineEmits(["tableRules"]);// 弹窗布尔值
const dialogVisible = ref(false);
const dialogRulesVisible = ref(false);// 接收值
const props = defineProps({//子组件接收父组件传递过来的值tableData: Array,tablePropsList: Object,
});
//使用父组件传递过来的值
const { tableData, tablePropsList } = toRefs(props);// 获取当前页的配置表
const localTable = JSON.parse(localStorage.getItem("table"));
var configuration = [];
var configurationRules = [];if (localTable) {configuration = localTable[tablePropsList.value.id].configuration;configurationRules = localTable[tablePropsList.value.id].rules;
} else {// 没有的话就新建一个保存let obj = {[tablePropsList.value.id]: {configuration: [],rules: [],},};localStorage.setItem("table", JSON.stringify(obj));
}const tablePropList = ref([]);
// 处理数据(原始传入数据,本地存储的数据,导出的数据)
const switchTableData = (tableData, localStorageData, addData) => {// prop: 表格绑定字段, label:当前名, index:表格当前序列,width:表格当前宽度,align: 对齐方式 left左 center中 right右,isShow:是否显示 0显示,1隐藏tableData.forEach((e, index) => {if (localStorageData && localStorageData.length > 0) {localStorageData.forEach((ec) => {if (ec.prop == e.prop) {let obj = {prop: ec.prop,label: ec.label,index: ec.index,width: ec.width,isShow: ec.isShow,align: ec.align,fixed: ec.fixed,children: [],rules: ec.rules,propType: ec.propType,isSwitch: ec.isSwitch,};addData.push(obj);if (e.children) {switchTableData(e.children, ec.children, obj.children);}}});} else {let obj = {prop: e.prop,label: e.label,index: index,width: e.width ? e.width : 0,isShow: e.isShow ? e.isShow : "0",align: e.align ? e.align : "center",fixed: e.fixed ? e.fixed : "",children: [],rules: {},propType: e.propType ? e.propType : "string",isSwitch: e.isSwitch ? e.isSwitch : true,};addData.push(obj);if (e.children) {switchTableData(e.children, null, obj.children);}}});
};switchTableData(tablePropsList.value.props, configuration, tablePropList.value);// 给数组排序
const sortTableData = (type) => {// type 0 保存并确定 1 确定tablePropList.value.sort(function (a, b) {return a.index - b.index; // 根据升序排序});dialogVisible.value = false;if (type == 0) {let arr = JSON.parse(localStorage.getItem("table")) || {};arr[tablePropsList.value.id].configuration = tablePropList.value;localStorage.setItem("table", JSON.stringify(arr));}
};// 数据添加筛选规则
const rulesTableData = (type) => {// type 0 保存并确定 1 确定dialogRulesVisible.value = false;let rulesList = [];tablePropList.value.forEach((e) => {rulesList.push(e.rules);});if (type == 0) {let arr = JSON.parse(localStorage.getItem("table")) || {};arr[tablePropsList.value.id].rules = configurationRules;localStorage.setItem("table", JSON.stringify(arr));}//传递给父组件emit("tableRules", rulesList);
};// 导出功能
import * as XLSX from "xlsx";
const exportTableRef = ref(null);
const exportBtn = () => {const tableDom = exportTableRef.value?.$el;if (!tableDom) {return;}const wb = XLSX.utils.table_to_book(tableDom);XLSX.writeFile(wb, "表格数据.xlsx");
};
</script><style scoped>
.over-height {max-height: 60vh;overflow-y: auto;
}
.el-select,
.el-input {width: 200px;
}
.table-btn {float: right;margin-bottom: 2px;
}
.last-table {width: 94%;margin: 0 auto;
}
</style>

demo

<template><div><h2>直接使用</h2><!-- tableData 是渲染表单的原始数据,tablePropsList是表单的规则数据,tableRules 是表单返回的筛选数据,数据在tableRules(val)方法中取返回值 val--><tableVue:tableData="tableData":tablePropsList="tablePropsList"@tableRules="tableRules"/><h2>添加操作等栏目</h2><tableVue :tableData="tableData" :tablePropsList="tablePropsList"><!-- 该组件可继续添加表格数据 --><!-- 如果需要增加操作栏列等,可以按照以下格式添加 --><el-table-column fixed="right" label="Operations" width="120"><template #default="scope"><el-button link type="primary" size="small">Remove{{ scope.$index }}</el-button></template></el-table-column></tableVue></div>
</template>
<script setup>
import { ref } from "vue";
import tableVue from "./components/table.vue";
// 定义的数据
const tableData = ref([{id:1,date: "2016-05-03",name: "Aom1",address: "No. 189, Grove St, Los Angeles",count: 1,address3: "address3",address4: "address4",},{id:2,date: "2016-05-02",name: "BTom2",address: "No. 189, Grove St, Los Angeles",count: 1,address3: "address3",address4: "address4",},{id:3,date: "2016-05-04",name: "CTom",address: "No. 189, Grove St, Los Angeles",count: 1,address3: "address3",address4: "address4",},{id:4,date: "2016-05-01",name: "DTom",address: "No. 189, Grove St, Los Angeles",count: 1,address3: "address3",address4: "address4",},
]);// 需要定义关键字和关键字的label
const tablePropsList = ref({// id 唯一值id: "text-table",/*** 必填项* label为表格名* prop对应表格的参数* * 选填* width 表格宽度,0自适应,可填数字,默认自适应* isShow 是否显示 0 显示,1不显示,默认0* align 对其方式 left 左对齐, center居中对其,right:右对齐,默认center* fixed 是否固定 left 固定左侧,right 固定右侧,空值不固定,默认空* propType 数据类型,默认为空* isSwitch 是否可筛选 默认true*/props: [{ label: "姓名", prop: "name", propType: "string", isSwitch: true, isShow: "0"},{ label: "时间", prop: "date", propType: "string", isSwitch: true, isShow: "0" },{ label: "地址", prop: "address", propType: "string" , isSwitch: true, isShow: "0"},{ label: "数量", prop: "count", propType: "number", isSwitch: true, isShow: "0" },{label: "其他地址",prop: "address2",// children 为子数据children: [{ label: "地址3", prop: "address3" , propType: "string", isSwitch: true, isShow: "0" },{ label: "地址4", prop: "address4" , propType: "string", isSwitch: false , isShow: "0"},],},],
});// 接收子组件返回的筛选规则
const tableRules = (val) => {console.log("rules", val);
};
</script><style scoped>
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/37578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手写一个基于SpringBoot的MVC架构,默认实现CRUD和导入导出功能

文章目录 前言正文一、项目结构二、技术点三、部分核心代码3.1 core-tool 中的核心代码3.1.1 所有实体的通用父类 SuperEntity3.1.2 所有枚举的父接口 BaseEnum3.1.3 所有业务异常的父接口 BaseException 3.2 mvc-tool 中的核心代码3.2.1 CrudController 接口定义3.2.2 默认的C…

编译原理必考大题:子集法将NFA转换为DFA【详细讲解,真题实战】

写在最前&#xff0c;本文为实战向&#xff0c;解决问题的求法&#xff0c;理论基础见我的上一篇博客,当然了&#xff0c;只做题的话&#xff0c;看这个就够用了 文章目录 NFA转换为DFA如何求ε-闭包&#xff1f;如何求状态转换弧集?NFA转换为DFA的方法论真题实战例题一例题二…

MySQL学习(3):SQL语句之数据定义语言:DDL

1.SQL通用语法与分类 &#xff08;1&#xff09;通用语法 &#xff08;2&#xff09;分类 2.DDL 2.1数据库操作 show DATABASES; #查询所有数据库select DATABASE(); #查询当前数据库create DATABASE 数据库名称 [default charest 字符集] [collate 排列规则]; #default cha…

[NeurIPS2021] Deep Residual Learning in Spiking Neural Networks【文献精读、翻译】

深度残差学习在脉冲神经网络中的应用 Fang W, Yu Z, Chen Y, et al. Deep residual learning in spiking neural networks[J]. Advances in Neural Information Processing Systems, 2021, 34: 21056-21069. 摘要 深度脉冲神经网络 (SNNs) 因为使用离散的二进制激活和复杂的时…

讨论stl链表

讨论链表 list迭代器失效list的模拟实现创建结点类链表迭代器完成实现代码 list与vector 链表是一个序列容器&#xff0c;在任意位置都可以用常数时间插入或者删除&#xff0c;并且可以在两个方向进行迭代。 list迭代器失效 迭代器失效指迭代器所指向的结点无效&#xff0c;即该…

淘宝扭蛋机小程序开发:为消费者带来新的潮玩乐趣

在当下的消费市场&#xff0c;潮玩消费已经成为了年轻人的新宠&#xff0c;预计在近几年间潮玩市场的销售额将达到千亿元&#xff01;其中扭蛋机市场更是吸引了各个阶段的消费群体&#xff0c;在市场巨大的发展前景下&#xff0c;同时也吸引了众多投资者入局&#xff0c;市场竞…

SuperMap iDesktop

SuperMap iDesktop 介绍 SuperMap iDesktop是一款由超图公司推出的企业级插件式桌面GIS软件&#xff0c;它通过SuperMap iObjects .NET、桌面核心库和.NET Framework 4.0构建&#xff0c;集成了地图制作、空间分析、数据编辑、三维分析等多种功能于一体&#xff0c;为用户提供…

标准版回收站的商品怎么删除?

管理后台/维护/数据维护/清除数据 里面就可以清空回收站的商品

Flink作业执行之 4.JobGraph

Flink作业执行之 4.JobGraph 1. 入口 前文了解了由Transformation到StreamGraph的过程&#xff0c;StreamGraph即作业的逻辑拓扑结构。 生成逻辑结构后&#xff0c;接下来的操作往往是对逻辑结构的优化。在很多组件中都是这样的处理&#xff0c;如hive、spark等都会执行“逻辑…

os实训课程模拟考试(选择题复习)

目录 一、操作系统的基本功能和设计目标 &#xff08;1&#xff09;基础知识 &#xff08;2&#xff09;题目与答案 1、操作系统是一组 B &#xff08;单选&#xff09; 2、以下哪项不是操作系统关心的主要问题&#xff1f;D &#xff08;单选&#xff09; 3、下列关于…

使用SpringBoot整合filter

SpringBoot整合filter&#xff0c;和整合servlet类似&#xff0c;也有两种玩儿法 1、创建一个SpringBoot工程&#xff0c;在工程中创建一个filter过滤器&#xff0c;然后用注解WebFilter配置拦截的映射 2、启动类还是使用ServletComponentScan注解来扫描拦截器注解WebFilter 另…

Windows系统开启自带虚拟机功能Hyper-V

前言 最近有小伙伴咨询&#xff1a;Windows系统上有自带的虚拟机软件吗&#xff1f; 答案肯定是有的。它就是Hyper-V&#xff0c;但很多小伙伴都不知道怎么打开这个功能。 今天小白就带大家来看看如何正确打开这个Windows自带的虚拟机功能Hyper-V。 开始之前&#xff0c;你…

基于Spring Boot与Vue的智能房产匹配平台+文档

博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐&#xff1a;最热的500个选题…

学会python——在Excel中生成图表数据(python实例十五)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.生成表格数据 3.1 代码构思 3.2 代码示例 4.绘制图表 4.1 代码构思 4.2 代码示例 5.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 P…

Shell 脚本编程保姆级教程(下)

七、Shell 流程控制 7.1 if #!/bin/bash num1100 if test $[num1] 100 thenecho num1 是 100 fi 7.2 if else #!/bin/bash num1100 num2100 if test $[num1] -eq $[num2] thenecho 两个数相等&#xff01; elseecho 两个数不相等&#xff01; fi 7.3 if else-if else #!/…

电影APP——项目建议书参考

项目建议书 1. 前言1.1 实现目标1.2 项目应用范围1.3 项目名称 2. 概述2.1 国内外发展综述2.2 拟解决的问题2.2.1 业务问题2.2.2 技术需求 2.3 系统环境需求2.3.1 网络需求描述2.3.2 业务需求描述2.3.3 运行环境/用户描述 2.4 功能建议2.4.1应用场景描述2.4.2功能划分/功能模型…

性能之巅的巴比达内网穿透访问单位的web管理系统

在这个数字化飞速发展的时代&#xff0c;作为一名IT部门的小主管&#xff0c;我经常面临着一项挑战&#xff1a;如何在外网环境下高效、安全地访问我们单位内部部署的Web管理系统。这不仅仅是关乎我个人的工作效率&#xff0c;更是影响到整个团队能否快速响应市场需求的关键。直…

650V 1200V 碳化硅MOS TO247 封装 内阻30毫欧 40 80毫欧

650V 1200V 碳化硅MOS TO247 封装 内阻30毫欧 40 80毫欧

LangChain E-Mails with LLM

题意&#xff1a;通过LangChain使用大型语言模型&#xff08;LLM&#xff09;处理电子邮件 问题背景&#xff1a; I am quite new to LangChain and Python as im mainly doing C# but i am interested in using AI on my own data. So i wrote some python code using langch…