前言
最近接到一个动态渲染table的需求。感觉也挺有意思的,特此分享给大家。
技术栈是ivewUI
实现思路是key值与data值相匹配。
分析需求
- 根据用户选择的条件生成一个动态的
table,并且table的列和行都是动态的。
table数据根据用户选择的日期月份以及其他条件来进行生成。
- 最后一行对整列的数据进行统计。
- 统计行的数据点击后可跳转到对应的
echarts数据页面。
综合上面的需求我们可以知道 这个table的数据是由用户根据不同的条件查询而生成的,对于前端实现来说,我们应该从后端接口拿到数据进行处理,然后再展示在table中。
实现过程
由于当前项目使用的UI组件库是iview,因此我们可以使用iview中table组件来实现上面所示的需求。
在iview table组件中: 我们可以传递 columns和data这两个参数进行表格的渲染。
<Table :columns="columns" :data="data"></Table>
|
columns可以自定义列。 data则表示需要渲染的数据
由于行和列都是动态的,因此需要和后端沟通好接口数据。
我们可以让后端在接口中分别返回列的渲染数据。以及需要渲染的data数据。
const {data,code} = await api('/queryList',{}) if(code === '200'){
}
|
拿到数据后我们就可以进行渲染了:
const list = data?.rows const col = data?.columnList if(list?.length>0){ let obj ={} let result = [] list?.map(i =>{ for(const [key,value] of Object.entries(i.data)){ obj[key] = obj[key]? obj[key] + value : 0 + value } }) obj.tips = '总人数' obj.sign = true result = list?.map(i =>{ return { tips: i.name, ...i.data } }) result?.push(obj) col.map((i,index) =>{ if(index === 0){ col.push({ title:'班次/日期', key: 'tips', minWidth: 200, fixed:'left', align: 'center' render:(h,{row}) => row.tips?.split(',').map(m =>h('div',m)) }) } col.push({ title:`${i.time.substring(4)}\t(${(this.weekDay.find(m => m.code ===i.week)).message})`, minWidth:110, align:'center', key:`${i.time}`, render: (h,params) =>{ let {commercialDistrictCode='',stationId=''} = this.selectQuery if(params.row.sign){ return h('a', { on: { click: async () => { this.$router.push({ path:'' }) } } }, params.row[i.time]) } return h('div',params.row[i.time]) }, }) }else{ col.map((i,index) => { if (index == 0) { col.push({ title: `${this.$t('applePay.shift')}/${this.$t('applePay.date')}`, key: "tips", minWidth: 120, align: 'center' }) } col.push({ title: `${i.time.substring(4)}\t(${(this.weekDay.find(m => m.code === i.week)).message})`, minWidth: 150, align: 'center', key:`${i.time}` }) }) } this.$set(this.table,{columns:col,data: result || []})
|
上面的代码就实现了当用户选择不同条件查询数据时,页面能够根据后端返回数据去渲染动态的表格。
这个需求如果和后台沟通好了数据接口。实现起来还是比较容易的。最重要的就是:data中的值与表头中对应的key值相匹配。因此后台返回的rows数据结构中的key 一定需要与他返回给你的动态列的某个字段的值相匹配
附上实现效果图

最后
文章若有不足之处,还请大家批评指出。
感谢您观看此篇文章 希望能给个👍评论收藏三连!你的点赞就是我写作的动力。