avue-crud下实现动态表头

本文详细记录了解决Avue框架中如何动态展示CRUD表头label的问题,包括如何从后台获取并解析数据,使用eval和option.column.push实现列名的动态拼接,以及解决列名堆积问题的方法。
摘要由CSDN通过智能技术生成

昨天还在写jsp,今天的项目功能要用avue-crud框架实现动态的展示column,包括column中的label与prop,prop还好说,框架的常规操作,但是这个label的动态改变真是头大的要命,翻遍网上的资料,从官网到手册,从百度到必应,无一例外都是介绍crud参数的内容,最终还是边摸索边思考实现了,下面把探索过程全面奉上。

1.其实我这里做的是个统计功能,label列就2列,比较简单,复杂表头的实现网上有很多,可以去借鉴,这里直说label的动态展示。

2.废话不多说,直接先上js实现方法:

handleQuery(form, done) {
            const page = this.page;
            const params = {};
            this.loading = true;
            getHeader(Object.assign(params, form)).then(res => {
              this.option.column = [];
              const result = crypto.decryptAES(res.data, crypto.aesKey);
              const data = JSON.parse(result).data.cols;
              // 得到后台拼接的信息
              let objs =  eval("("+data+")");
              this.option.column.push(objs);
              this.option.column.push({label: "人数", prop: "value", align: 'left'});
            });
            getList(page.currentPage, page.pageSize, Object.assign(params, form)).then(res => {
              const result = crypto.decryptAES(res.data, crypto.aesKey);
              const data = JSON.parse(result).data.records;
              this.page.total = JSON.parse(result).data.total;
              this.data = data;
              this.loading = false;
              this.selectionClear();
              done();
            });
          },

3.方法代码分析:

handleQuery这个方法是avue-form中的自带的属性,这里我的页面结构是avue-form下面接一个avue-crud,其实本来是接个饼图,统计项太多不好实现,所以就加个crud。

动态表头,首先需要从后台获取表头,也就是column中的label,然后拼接到前端的column中。

后台方法如下:

传统的的页面上option中的column写法是这样:

column: [
          {label: "动态表头", prop: "测试"}
          
        ],

 在后台返回一串类似于页面的写法的返回值。

然后重点来了,拿到返回值后,使用前端框架的eval()函数处理一下。eval函数释义:

eval() 

eval() 的参数是一个字符串。如果字符串表示的是表达式,eval() 会对表达式进行求值。如果参数表示一个或多个 JavaScript 语句,那么eval() 就会执行这些语句。

使用this.option.column.push方法,将返回值或自定义的column列拼装到我们的目标option中。

 到这里,label的动态拼装已经完成,页面上点击查询执行handleQuery方法此时已经可以看到列名的动态变化。后面只需跟上常规crud获取内容的方法:

这里我写的getlist方法和onLoad方法中一致 ,毕竟上面只是多一个获取列名字段的方法。

当我做到这里,我认为动态展示列名,内容的方法已经被我攻克后,自信满满的去调试,结果很意外,的确每次都可以展示我想要的列名,但是每次push进去的column列会一直堆积在option,造成了页面上列名堆列名,内容展示混乱,大概是下面的效果:

这让我很苦恼, 虽然我直接就看出来这是this.option.column.push所导致的,我应该每次push之前都清空下column,再push新的内容,就像Java中循环list时若想每次只拿到想要的结果,就要new一个对象来当盘子,那么在这avue中,什么方式能实现呢,离谱的是this.option.column有push,但是没发现有关于delete或者remove的方法,也可能是我前端菜鸡不知道,反正因为研究删除函数浪费了很久,最后我抱着试试看的想法,既然column是定义在option中的一个数组,那么直接每次获取表头前,我将this.option.column整个赋空,然后操作不就行了。

果然,加入this.option.column = [];后,我实现了每次查询都正取展示列名与内容的操作

 

4.总结一下流程就是

发送获取动态列名数据的请求,后端拼装成column列表的写法

前端给调用this.option.column.push之前,先给整个column赋空,然后push获取的值

发送获取prop内容的请求,像以往一样给prop赋值即可

总结后发现很简单,很普通,但是为此花费的时间真不少,而且百度和必应上面能搜到的关于此类的文章我真的没见过,可能这是个基础操作没什么好写的,工作中解决的问题记录一下,对我来说还是很重要的。

对于avue-crud动态表头有好的实现方法,欢迎大佬们的指点,前端二把刀非常感谢。

Avue-Table 是 Vue 3 中的一个表格组件库,提供了丰富的功能和高度可定制的选项,其中包括导出数据的功能。Avue-Crud 是基于 Avue-Table 的一个扩展,集成了常用的 CRUD(创建、读取、更新、删除)操作。 如果你想要在 Avue-Crud 中导出包含多级表头的数据,首先你需要确保你的数据结构支持嵌套的表头,例如: ```json [ { "header": "父级表头1", "children": [ {"header": "子级表头1.1"}, {"header": "子级表头1.2"} ] }, { "header": "父级表头2", "children": [ {"header": "子级表头2.1"} ] } ] ``` 在 Avue-Crud 的配置中,你可以设置列配置为这种嵌套格式,并在导出时按照这个结构生成表格。具体步骤可能包括: 1. 在 `columns` 数组中定义多级表头,每个层级都有对应的 `header` 和可选的 `children` 列。 2. 当导出按钮被点击时,遍历这些列,构建多层表格结构,并将其转换为 CSV 或者其他格式的数据。 3. 使用第三方库如 `xlsx` 或者 `csv-writer` 来处理数据导出。 由于这涉及到具体的代码实现,这里提供一个简版的示例,实际使用时可能会更复杂: ```javascript exportCsv({ data, columns }) { // 假设你的数据和列配置已经准备好了 const headers = buildMultilevelHeaders(columns); const csvContent = createCSVContent(headers, data); // 导出至文件或返回给前端下载 // ... } function buildMultilevelHeaders(columns) { let result = []; for (const column of columns) { if (column.children) { result.push(column.header); result = result.concat(buildMultilevelHeaders(column.children)); } else { result.push(column.header); } } return result; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值