• vue表格合并行的一个实例


        一、element控件实现

          在平常的应用中,需要用到合并单元格的操作,在Excel中,这种操作很好实现,但在实际项目中,常常需要借助element控件来实现。

          下面是element中的一个实例:

          

    实现的代码如下:

    <template>
      <div>
        <el-table
          :data="tableData"
          :span-method="arraySpanMethod"
          border
          style=" 100%">
          <el-table-column
            prop="id"
            label="ID"
            width="180">
          </el-table-column>
          <el-table-column
            prop="name"
            label="姓名">
          </el-table-column>
          <el-table-column
            prop="amount1"
            sortable
            label="数值 1">
          </el-table-column>
          <el-table-column
            prop="amount2"
            sortable
            label="数值 2">
          </el-table-column>
          <el-table-column
            prop="amount3"
            sortable
            label="数值 3">
          </el-table-column>
        </el-table>
    
        <el-table
          :data="tableData"
          :span-method="objectSpanMethod"
          border
          style=" 100%; margin-top: 20px">
          <el-table-column
            prop="id"
            label="ID"
            width="180">
          </el-table-column>
          <el-table-column
            prop="name"
            label="姓名">
          </el-table-column>
          <el-table-column
            prop="amount1"
            label="数值 1(元)">
          </el-table-column>
          <el-table-column
            prop="amount2"
            label="数值 2(元)">
          </el-table-column>
          <el-table-column
            prop="amount3"
            label="数值 3(元)">
          </el-table-column>
        </el-table>
      </div>
    </template>
    
    <script>
      export default {
        data() {
          return {
            tableData: [{
              id: '12987122',
              name: '王小虎',
              amount1: '234',
              amount2: '3.2',
              amount3: 10
            }, {
              id: '12987123',
              name: '王小虎',
              amount1: '165',
              amount2: '4.43',
              amount3: 12
            }, {
              id: '12987124',
              name: '王小虎',
              amount1: '324',
              amount2: '1.9',
              amount3: 9
            }, {
              id: '12987125',
              name: '王小虎',
              amount1: '621',
              amount2: '2.2',
              amount3: 17
            }, {
              id: '12987126',
              name: '王小虎',
              amount1: '539',
              amount2: '4.1',
              amount3: 15
            }]
          };
        },
        methods: {
          arraySpanMethod({ row, column, rowIndex, columnIndex }) {
            if (rowIndex % 2 === 0) {
              if (columnIndex === 0) {
                return [1, 2];
              } else if (columnIndex === 1) {
                return [0, 0];
              }
            }
          },
    
          objectSpanMethod({ row, column, rowIndex, columnIndex }) {
            if (columnIndex === 0) {
              if (rowIndex % 2 === 0) {
                return {
                  rowspan: 2,
                  colspan: 1
                };
              } else {
                return {
                  rowspan: 0,
                  colspan: 0
                };
              }
            }
          }
        }
      };
    </script>
    

         二、原生方法实现

    但是,这种局限性很大,要是需要合并的单元格和实例中的不匹配,那就不行了。比如说实际需求是下面的这种形式的表格:

    开始用element控件发现实现不了,然后最后用原生方法实现的,关键代码如下:

     <table>
          <thead>
            <th>数据类型</th>
            <th>名称</th>
            <th></th>
            <th></th>
          </thead>
          <tbody>
            <template v-for="(item,index) in tableData">
              <tr :key="index">
                <td :rowspan="item.rowSpanData.length">{{item.rowSpanName}}</td>
                <td >{{item.rowSpanData[0].value01}}</td>
                <td >{{item.rowSpanData[0].value02}}</td>
                <td >{{item.rowSpanData[0].value03}}</td>
              </tr>
              <tr v-for="(ele,inx) in item.rowSpanData.length-1" :key="index+'-'+inx">
                <td>{{item.rowSpanData[ele].value01}}</td>
                <td>{{item.rowSpanData[ele].value02}}</td>
                <td>{{item.rowSpanData[ele].value03}}</td>
              </tr>
            </template>
          </tbody>
        </table>
    

      

     tableData: [
            {
              rowSpanName: "基础数据",
              rowSpanData: [
                {
                  value01: "钻井层位()",
                  value02: "",
                  value03: ""
                },
                {
                  value01: "上层套管尺寸(in)",
                  value02: "",
                  value03: "" 
                },
                {
                  value01: "上层套管下深(m)",
                  value02: "",
                  value03: ""
                },
                 {
                  value01: "本层钻头尺寸(in)",
                  value02: "7.5",
                  value03: ""
                },
                 {
                  value01: "本层井深(m)",
                  value02: "5950",
                  value03: ""
                },
                 {
                  value01: "本层井底部垂深(m)",
                  value02: "",
                  value03: ""
                },
                 {
                  value01: "本层套管尺寸(in)",
                  value02: "4",
                  value03: ""
                },
               {
                  value01: "本层套管下深(m)",
                  value02: "5948.6",
                  value03: ""
                },
               {
                  value01: "浮箍下深(m)",
                  value02: "5928.6",
                  value03: ""
                },
               {
                  value01: "球座/阻流环下深(m)",
                  value02: "5928.6",
                  value03: ""
                },
               {
                  value01: "分级箍顶深(m)",
                  value02: "",
                  value03: ""
                },
               {
                  value01: "尾管挂顶深(m)",
                  value02: "3050",
                  value03: ""
                },
              ]
            },
            {
              rowSpanName: "地质分层",
              rowSpanData: [
                {
                  value01: "层位()",
                  value02: "",
                  value03: ""
                },
                {
                  value01: "底深(m)",
                  value02: "",
                  value03: ""
                },
                {
                  value01: "主要岩性描述()",
                  value02: "",
                  value03: ""
                }
              ]
            },
            {
              rowSpanName: "其他",
              rowSpanData: [
                {
                  value01: "目的层1顶深(m)",
                  value02: "",
                  value03: ""
                },
                {
                  value01: "目的层1顶深TVD(m)",
                  value02: "",
                  value03: ""
                }
              ]
            }
          ],
    
    <style scoped>
    table {
       600px;
      border: 1px solid #ccc;
      border-collapse: collapse;
    }
    thead th{
        text-align: left;
        background-color: #fafafa;
    }
    th,td {
      padding-left: 20px;
      border: 1px solid #e9eaec;
      line-height: 30px;
    }
    </style>

    实现的效果如下:

     

    以上就是实际需求中的一个例子,element控件应该也能实现第二种多行合并的表格,后面可以深入研究一下。

  • 相关阅读:
    差分序列
    蓝桥杯 操作格子
    线段树
    历届题目 密文搜索
    对局匹配(动态规划)
    历届试题 分巧克力(二分查找)
    第九届蓝桥杯B组决赛 调手表(完全背包)
    快速幂求余
    2019蓝桥杯国赛备赛题库
    ubuntu16.04安装cuda8.0试错锦集
  • 原文地址:https://www.cnblogs.com/DLB511/p/10852822.html
Copyright © 2020-2023  润新知