• element的展开收起,合并表格


    如果两个因为后台接口只能提供两个接口,假数据做法如下

    // 什么管理 - 品牌方(采购商什么)
    <template>
      <div class="purchaseOrder">
        <!--展开行table-->
        <el-table
          ref="boxData"
          v-loading="loading"
          size="small"
          :data="boxData"
          tooltip-effect="dark"
          style=" 100%"
          max-height="600"
          @expand-change="expandChange"
        >
          <el-table-column type="expand">
            <template slot-scope="props">
              <!-- 子table -->
              <el-table
                size="small"
                :data="props.row.sonData"
                :cell-style="{ background: '#fff' }"
                style=" 100%"
                border
                stripe
                max-height="600"
                :span-method="objectSpanMethod"
              >
                <el-table-column
                  v-for="(item, index) in column2"
                  :key="index"
                  :label="item.title"
                  :prop="item.key"
                  align="center"
                  :fixed="item.fixed"
                  :min-width="item.width ? item.width : 120"
                >
                  <template slot-scope="scope">
                    <div v-if="item.key == 'handle_btn2'">
                      <el-button>操作按钮</el-button>
                    </div>
                    <div v-else>{{ scope.row[item.key] }}</div>
                  </template>
                </el-table-column>
              </el-table>
            </template>
          </el-table-column>
          <!-- 总table -->
          <el-table-column
            v-for="(item, index) in column1"
            :key="index"
            :label="item.title"
            :prop="item.key"
            align="center"
            :fixed="item.fixed"
            :min-width="item.width ? item.width : 120"
          >
            <template slot-scope="scope">
              <div v-if="item.key == 'company_name'">
                <span class="cBlue pointer" @click="handleSee(scope.row, 'see')">{{
                  scope.row.company_name
                }}</span>
              </div>
              <div v-else-if="item.key == 'is_usable'">
                <span>{{
                  scope.row.is_usable == 0
                    ? "禁用"
                    : scope.row.is_usable == 1
                    ? "启用"
                    : ""
                }}</span>
              </div>
              <div v-else-if="item.key == 'handle_btn'">
                <el-button type="text" @click="handleBtn(scope.row, 'edit')"
                  >修改</el-button
                >
                <el-button
                  v-if="scope.row.is_usable == 1"
                  type="text"
                  @click="handleIsUsable(scope.row, 0)"
                  >禁用</el-button
                >
                <el-button
                  v-if="scope.row.is_usable == 0"
                  type="text"
                  @click="handleIsUsable(scope.row, 1)"
                  >启用</el-button
                >
              </div>
              <div v-else>{{ scope.row[item.key] }}</div>
            </template>
          </el-table-column>
        </el-table>
      </div>
    </template>
    <script>
    // import paging from "@/components/pages/pagination.vue";
    
    export default {
      components: {
        // paging // 分页
      },
      data() {
        return {
          // 加载
          loading: true,
          // 表格数据
          boxData: [],
          sonData: [],
          tableHeight: 300,
          // 表格数据
          column1: [
            { title: "什么编号", key: "order_code",  120 },
            { title: "什么日期", key: "created_at",  90 },
            { title: "名称", key: "plan_name",  90 },
            { title: "操作", key: "handle_btn",  90 }
          ],
          column2: [
            { title: "品牌", key: "brand_name",  120 },
            { title: "产成品名称", key: "product_name",  90 },
            { title: "目录", key: "index",  90 },
            { title: "规格", key: "order_code",  90 },
            { title: "尺寸", key: "product_name",  90 },
            { title: "操作", key: "handle_btn2",  90 }
          ]
        };
      },
    
      computed: {},
      watch: {},
    
      mounted() {},
    
      created() {
        // 初始化 表格数据默认渲染
        this.handleSeach();
    
        // 实时屏幕高度
        let clientHeight = document.documentElement.clientHeight;
        this.tableHeight =
          clientHeight > 400 ? clientHeight - 330 : this.tableHeight;
      },
    
      methods: {
        // 点击搜索
        handleSeach() {
          // // 页码初始化
          // this.paging = {
          //   page: 1,
          //   limit: 10
          // };
          // this.loading = true;
          this.handleGetTable();
        },
    
        // 获取数据
        handleGetTable() {
          // // 接口获取数据
          // Api.customerList(param)
          //   .then(res => {
          //     const { code, data, msg, total } = res.data;
          //     this.total = total;
    
          this.loading = false;
    
          // 第一层假数据
          this.boxData = [
            { order_code: "111", plan_name: "什么名称" },
            { order_code: "2312222", plan_name: "什么名称" },
            { order_code: "32312222", plan_name: "什么名称" }
          ];
    
          // 给个空数组
          this.boxData.forEach((item, index) => {
            item.sonData = [];
          });
          // this.boxData = data;
          // 处理数据
          // this.handleData();
          // })
          // .catch(error => {
          //   this.loading = false;
          //   this.boxData = [];
          // });
        },
    
        // 处理数据
        expandChange(row, expandedRows) {
          // console.log(row, expandedRows, "点击展开push给boxData");
          // 接口获取里面数据
          this.sonData = [];
          this.sonData = [
            {
              order_code: "111",
              created_at: "2013-10-31",
              plan_name: "什么名称",
              materials: [
                {
                  brand_name: "仁和",
                  product_name: "产成品名称1"
                },
                {
                  brand_name: "仁和",
                  product_name: "产成品名称2"
                }
              ]
            },
            {
              order_code: "2312222",
              created_at: "2021-10-31",
              plan_name: "什么名称2",
              materials: [
                {
                  brand_name: "仁和2",
                  product_name: "产成品名称21"
                }
              ]
            },
            {
              order_code: "32312222",
              created_at: "2021-08-31",
              plan_name: "什么名称3",
              materials: [
                {
                  brand_name: "仁和31",
                  product_name: "产3成品名称31"
                },
                {
                  brand_name: "仁和32",
                  product_name: "产成品名称34"
                },
                {
                  brand_name: "仁和33",
                  product_name: "产成品名称31"
                }
              ]
            }
          ];
    
          // 先把二纬数组改成一位数组
          const handleData = [];
          if (this.sonData.length) {
            this.sonData.forEach(row => {
              // 处理company_users数组的每一个对象
              let handleItemData = Object.assign({}, row);
              if (row.materials.length) {
                row.materials.forEach((ele, index) => {
                  // 新增行录字段
                  ele.index = index + 1;
                  // 合为新对象
                  handleItemData = Object.assign({}, handleItemData, ele);
                  // 需要合并的条数 加一个新属性:合并的个数mergeNum, 第一项为合并个数 其他项-1
                  if (index == 0) {
                    handleItemData.mergeNum = row.materials.length
                      ? row.materials.length
                      : 0;
                  } else {
                    handleItemData.mergeNum = -1;
                  }
                  // push为一维数组
                  handleData.push(handleItemData);
    
                  setTimeout(() => {
                    this.loading = false;
                  }, 200);
                });
              } else {
                this.loading = false;
                // 没有值时 也要展示
                handleData.push(handleItemData);
                handleItemData.mergeNum = 1;
              }
            });
          } else {
            this.loading = false;
          }
    
          // table的数据才是为处理好的数据
          this.sonData = handleData;
          // return console.log(this.sonData, "处理后的");
    
          // 点开的某项都插入到boxData的某项
          this.boxData.forEach((item, index) => {
            if (item.order_code == row.order_code) {
              item.sonData = [];
    
              this.sonData.forEach((items, indexs) => {
                if (item.order_code == items.order_code) {
                  item.sonData.push(items);
                }
              });
            }
          });
    
          console.log(this.boxData, "处理后的");
        },
    
        // table表格  合并
        objectSpanMethod({ row, column, rowIndex, columnIndex }) {
          // 需要合并的
          if (columnIndex == 0 || columnIndex == 1) {
            if (row.mergeNum != -1) {
              return {
                rowspan: row.mergeNum,
                colspan: 1
              };
            } else {
              return {
                rowspan: 0,
                colspan: 0
              };
            }
          }
        }
      }
    };
    </script>
    
    <style lang="scss">
    .purchaseOrder {
      .el-table {
        margin-top: 10px;
      }
      // 暂时去掉hover
      .el-table tbody tr:hover > td {
        background: #fff;
      }
      .form-style {
      }
    }
    </style>
    <style lang="scss" scoped></style>

    参考合并https://blog.csdn.net/qq_38060231/article/details/108261350

  • 相关阅读:
    C++11并发之std::thread<转>
    YUV420格式解析<转>
    在windows、linux中开启nginx的Gzip压缩大大提高页面、图片加载速度<转>
    curl 超时设置<转>
    C++中map用法详解《转》
    同一台服务器配置多个tomcat服务的方法
    找出两个排好序的数组的中位数
    mysql中设置默认字符编码为utf-8
    大步小步攻击算法_完全版
    ACL登陆认证
  • 原文地址:https://www.cnblogs.com/wangduojing/p/15193213.html
Copyright © 2020-2023  润新知