el-table动态表头,动态数据处理

这篇博客讲述了在Vue.js中处理动态表格数据的挑战,特别是当后端返回的数据不完整时,如何对应表头并正确显示数据。博主通过示例代码展示了如何映射数据到动态生成的表格列,并使用JSON操作确保数据与表头位置匹配。文章强调了在前端开发中灵活处理动态数据的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在el-table中遇到一个有意思的数据处理,以下数据表头为动态的数据
在这里插入图片描述
在这里插入图片描述
此数据表头处理比较简单,难点在于表头对应的数据,当后端返回的数据只有部分时,如只有温度就返回温度,只有PM2.5就只返回PM2.5,而且后端没有返回其他没有的字段的默认值,此时我们就需要对数据进行处理对应好数据所在的位置不然则会出现PM2.5的值跑到了温度下面

<el-table>
	<el-table-column align="center" label="序号" type="index">
	</el-table-column>
	<el-table-column align="center" label="时间" prop="time">
	</el-table-column>
	<!-- 此处就是动态表头的处理 -->
	<el-table-column
	    align="center"
	    :label="item.attr_name"
	    v-for="(item, index) in deviceTypeInfo.attributes"
	    :key="item.id"
	>
	    <template slot-scope="scope">
	        <span>{{
	            scope.row.value[index]
	                ? scope.row.value[index].value
	                : " "
	        }}</span>
	    </template>
	 </el-table-column>
 </el-table>

对数据的处理如下

let data = Object.keys(res.data.data).map((key) => {
     return { time: key, value: res.data.data[key] };
	});
let newData = JSON.parse(JSON.stringify(data));
//此处微数据处理
newData.map((items, value) => {
     let attrArr = [];
     items.value.map((item) => {
         let indexAttr =
             this.deviceTypeInfo.attributes.findIndex((indexItem) =>
             	item.attribute.attr === indexItem.attr
         );
         //根据数据对应的deviceTypeInfo.attributes数组的下标进行数据处理
         attrArr[indexAttr] = item;
     });
     //将处理过的items.value重新赋值 此时数据则会对应到表头的所对应的位置
     items.value = JSON.parse(JSON.stringify(attrArr));
 });
  this.valueList = newData;
  this.total = res.data.total;
### 实现 `el-table-column` 动态表头的方法 为了实现 `el-table-column` 的动态表头功能,在 VueElement UI 中可以通过遍历数据结构来自动生成所需的列定义。具体来说,可以利用 `v-for` 指令来迭代一个对象数组或列表,从而创建多个 `<el-table-column>` 元素。 #### 基本原理 当拥有一个包含多条记录的数据集时,每一条记录代表一行表格的内容。如果希望这些行能够映射到不同的字段上,则需要先确定哪些字段应该作为表头展示出来。这通常涉及到获取第一条记录的所有键名,并以此为基础构建相应的列配置[^1]。 对于更复杂的情况,比如存在嵌套的对象或者想要自定义某些特定行为(如格式化单元格内容),则可能还需要额外处理逻辑以适应需求。 #### 示例代码 下面是一个简单的例子,展示了如何基于给定的数据源自动调整表头: ```html <template> <div id="app"> <!-- 当有 perf_yearly 数据时才渲染 --> <el-table class="statusInfo" v-if="perf_yearly.length > 0" :data="perf_yearly"> <!-- 特殊的第一列用于显示属性名称 --> <el-table-column label=""> <template slot-scope="scope">{{ perf_yearlyColumnList[scope.$index] }}</template> </el-table-column> <!-- 循环生成其他各年的列 --> <el-table-column v-for="(year, index) in yearList" :key="index" :label="year" :prop="year" /> </el-table> </div> </template> <script> export default { data() { return { perf_yearly: [], // 表格主体数据 perf_yearlyColumnList: ['属性A', '属性B'], // 属性名称列表 yearList: ['2020', '2021'] // 年份列表 }; } }; </script> ``` 此模板会根据 `yearList` 数组中的元素数量以及顺序依次添加新的列至右侧位置。同时,最左侧的一列为静态设计用来放置各个项目的描述信息[^2]。 需要注意的是,上述示例假设了 `perf_yearly` 是一个二维数组形式的数据集合,其中每一项都遵循相同的结构模式——即每个子项都是由若干个年度对应的数值构成的字典类型对象。 另外,关于设置列宽的问题,直接使用百分比的方式可能会遇到兼容性问题。此时建议采用 CSS Flexbox 或 Grid 布局来进行布局控制,而不是依赖于内联样式中的宽度属性[^3]。 最后,针对更加复杂的场景,例如带有分层结构的表头,同样也可以借助类似的循环机制配合预设好的 JSON 结构体完成定制化的开发工作[^4]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值