el-table 多级表头,动态生成;一级表头,根据数据动态生成,二级固定。

一、表格需求:

实现一个动态表头,一级表头,根据数据动态生成,二级表头固定,每列的数据不一样,难点在于数据的处理。做这种表头需要两组数据,一组数据是实现表头的,另一组数据是内容渲染的。

 二、分析思路

想实现这种效果就得造数据,按照示例的话,我们在数据渲染是表头数据是这种结构,

         <el-table-column label="房型名称" align="center">
            <el-table-column
              v-for="(item1, index1) in tableColData"
              :key="index1"
              align="center"
              prop=""
              :label="item1.label"
            >
              <el-table-column
                v-for="(item2, index2) in item1.children"
                :key="index2"
                :prop="item2.prop"
                :label="item2.label"
                align="center"
              >
              </el-table-column>
            </el-table-column>
          </el-table-column>
//表头数据 
tableColData: [
        {
          label: "大床房元/间",
          children: [
            {
              prop: "livePerson0",
              label: "入住人数",
            },
            {
              prop: "roomNumber0",
              label: "客房数量",
            },
            {
              prop: "liveDays0",
              label: "入住天数",
            },
          ],
        },
        {
          label: "小床房元/间",
          children: [
            {
              prop: "livePerson1" 
              label: "入住人数",
            },
            {
              prop: "roomNumber1" 
              label: "客房数量",
            },
            {
              prop: "liveDays1"
              label: "入住天数",
            },
          ],
        },
          ...
      ],

 解决了表头数据,接下来就是得改造表数据了,改造数据内容,我们需要的表数据内容是这个样子的

      // 表数据
      tableList: [
        {
          livePerson0: 1,
          roomNumber0: 1,
          liveDays0: 1,
        },
        {
          livePerson1: 2,
          roomNumber1: 1,
          liveDays1: 10,
        },
      ],

接下来就是根据后端返回的数据内容改造成我们想要的表头数据和表数据了。

三、实现

后端返回给我的数据内容是这个样子的:

tableList: [
		{
			"month": "2023-05",
			"data": [
				{
					"room_type_name": "大床房",
					"total_live_days": 1,
					"total_price": 0.01,
					"project_id": 118,
					"price": 0.01,
					"total_room_number": 1,
					"room_type_id": 1,
					"total_live_person": 1
				}
			],
			"total_price": 0.01
		},
		{
			"month": "2023-06",
			"data": [
				{
					"room_type_name": "大床房",
					"total_live_days": 8,
					"total_price": 0.1,
					"project_id": 118,
					"price": 0.01,
					"total_room_number": 9,
					"room_type_id": 1,
					"total_live_person": 15
				},
				{
					"room_type_name": "总统房",
					"total_live_days": 1,
					"total_price": 0.01,
					"project_id": 118,
					"price": 0.01,
					"total_room_number": 1,
					"room_type_id": 3,
					"total_live_person": 1
				}
			],
			"total_price": 0.11
		},
		{
			"month": "2023-07",
			"data": [
				{
					"room_type_name": "大床房",
					"total_live_days": 2,
					"total_price": 0.04,
					"project_id": 121,
					"price": 0.01,
					"total_room_number": 2,
					"room_type_id": 1,
					"total_live_person": 4
				},
				{
					"room_type_name": "小床房",
					"total_live_days": 1,
					"total_price": 0.01,
					"project_id": 118,
					"price": 0.01,
					"total_room_number": 1,
					"room_type_id": 2,
					"total_live_person": 1
				}
			],
			"total_price": 0.05
		}
	]

自己改造的代码:

    getRoomType() {
      let roomTypeName = [];
      this.tableColData = [];
      this.tableList.forEach(item => {
        item.data.forEach(citem => {
          const index = roomTypeName.findIndex(
            i => i.room_type_name == citem.room_type_name
          );
          if (index == -1) {//去重,==-1找不到,就push进去
            roomTypeName.push(citem);
          }
        });
      });
      console.log(roomTypeName, "获取表头房间名称的动态数据");
      //   添加表头数据
      roomTypeName.forEach((item, index) => {
        this.tableColData.push({
          label: `${item.room_type_name}(${item.price}元/间)`,
          children: [
            {
              prop: "livePerson" + index,
              label: "入住人数"
            },
            {
              prop: "roomNumber" + index,
              label: "客房数量"
            },
            {
              prop: "liveDays" + index,
              label: "入住天数"
            }
          ]
        });
      });

      // 添加表数据
      this.tableList.forEach(data => {
        data.data.forEach(item => {
          roomTypeName.forEach((citem, cindex) => {
            if (item.room_type_name == citem.room_type_name) {
              data["livePerson" + cindex] = item.total_live_person;
              data["roomNumber" + cindex] = item.total_room_number;
              data["liveDays" + cindex] = item.total_live_days;
            }
          });
        });
      });
      console.log(this.tableList, "this.tableList");
    },

,其中,想动态生成属性值,也就是对对象里面的key值修,如:

objet:{

        name:1

}

可以使用 object["name2"]=2就可以修改为我们想要的

objet:{

        name:1,

        name:2

}

 最终我的表数据改造成这个样子,实现了我想要的需求。

 合计的计算,只要我们的表数据的字段值是动态的,如每列的数据prop0,prop1合计算起来就是正确的,不会说你这一列没有这个数据,他也帮你算进去

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要实现el-table多级表头动态改变表头数据,首先需要准备两组数据。一组数据用于实现表头的结构,另一组数据用于内容渲染。在el-table中,可以使用el-table-column标签嵌套的方式来实现多级表头。 在表头数据中,每个el-table-column代表一个表头列。可以使用label属性定义列名,prop属性定义对应的数据字段。如果有多级表头,可以通过嵌套el-table-column来实现。每个el-table-column可以设置子列,通过v-for循环遍历表头数据动态生成多级表头的结构。 在内容渲染时,可以使用prop属性来指定对应的数据字段进行渲染。根据你提供的示例,可以使用v-for循环遍历表头数据中的子列来渲染内容。 通过以上的设置,当表头数据发生改变时,el-table动态生成对应的多级表头结构,并且根据内容渲染的数据进行渲染。你可以根据具体需求动态改变表头数据,并且保证内容渲染的数据结构与表头数据对应即可实现el-table多级表头动态改变表头数据的效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [el-table 多级表头动态生成一级表头,根据数据动态生成二级固定。](https://blog.csdn.net/weixin_46753476/article/details/131282706)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [el-table多级表头,合并表头,设置样式](https://blog.csdn.net/weixin_52618969/article/details/130881560)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值