vue 相同列合并(复制粘贴可用)

vue 相同列合并(复制粘贴可用)


废话不多说,直接上代码

<template>
  <div class="content_home">
    <div class="content_home_start">
      <div class="conter_table">
        <el-row :gutter="11">
          <el-col :span="3">
            <el-select placeholder="地点"
              type="text"
              v-model="earecode"
              autocomplete="off"
            >
                <el-option
                  v-for="item in eareOptions"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value"
                  >
                </el-option>
            </el-select>
          </el-col>
          <!-- <el-col :span="3">
            <el-select v-model="findcolumn" placeholder="查询项">
              <el-option
                v-for="item in columnOptions"
                :key="item.value"
                :label="item.label"
                :value="item.value">
              </el-option>
            </el-select>
          </el-col>
          <el-col :span="3">
            <el-input v-model="findcontent" placeholder="查询内容">
            </el-input>
          </el-col> -->
          <el-col :span="2">
            <el-button type="primary"  style="width: 100%" @click="findRegPersonList">
              <i class="el-icon-search"></i>查询</el-button
            >
          </el-col>
        </el-row>
         <!--下方为日程列表-->
        <el-table
          :data="tableDataList"
          :span-method="spanMethod"
          border
          style="width: 70%; margin-top: 20px; margin-left;: 1000px">
          <el-table-column
            prop="eareid"
            type="selection"
            width="55">
          </el-table-column>
          <el-table-column
            prop="eareid"
            label="序号"
            type="index"
            width="50">
          </el-table-column>
          <el-table-column
            prop="earename"
            label="地市"
            width="180">
          </el-table-column>
          <el-table-column
            prop="examdays"
            label="考试天数"
            width="180">
          </el-table-column>
          <el-table-column
            prop="examdate"
            label="考试日期">
          </el-table-column>
          <el-table-column label="操作" align="center" width="320">
            <template slot-scope="scope">
              <el-button type="primary" plain size="mini" @click="showdetail(scope.row)">详细</el-button>
              <el-button type="primary" plain size="mini" v-if="scope.row.empowerType=='1' ||scope.row.empowerType=='0' " @click="closeEmpowerType(scope.row)">关闭授权</el-button>
              <el-button type="primary" plain size="mini" v-if="scope.row.empowerType=='2'" @click="openEmpowerType(scope.row)">开启授权</el-button>
            </template>
          </el-table-column>
        </el-table>
        <!-- 分页 -->
        <el-pagination
          style="margin-top: 15px;"
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :current-page="currentPage"
          :page-sizes="pageSizes"
          :page-size="pageSize"
          layout="total, sizes, prev, pager, next, jumper"
          :total="total"
        >
        </el-pagination>
      </div>
    </div>

  </div>
</template>

<script>
import { } from '@/api/person';

export default {
  name: 'pershenhe',
  components: {
    
  },
  data() {
    return {
      currentPage: 1,
      pageSizes: [2,5,10, 30, 50, 100, 200, 300],
      pageSize: 10,
      total: 0,
      perlist:[] ,
      columnOptions:[],//查询项
      eareOptions:[],//查询考点
      findcolumn:"",
      earecode:"" ,
      findcontent: "" ,
      
      tableDataList: [{
        eareid:'17',
        earename: '信阳',
        examdays: '4',
        examdate: '2023-07-01',
        empowerType:'0'
        }, {
          eareid:'17',
          earename: '信阳',
          examdays: '4',
          examdate: '2023-07-02',
          empowerType:'1'
        }, {
          eareid:'17',
          earename: '信阳',
          examdays: '4',
          examdate: '2023-07-07',
          empowerType:'2'
        }, {
          eareid:'17',
          earename: '信阳',
          examdays: '4',
          examdate: '2023-07-08',
          empowerType:'0'
        }, {
          eareid:'14',
          earename: '商丘',
          examdays: '3',
          examdate: '2023-07-01',
          empowerType:'0'
        }, {
          eareid:'14',
          earename: '商丘',
          examdays: '3',
          examdate: '2023-07-02',
          empowerType:'1'
        }, {
          eareid:'14',
          earename: '商丘',
          examdays: '3',
          examdate: '2023-07-07',
          empowerType:'2'
        }
        , {
          eareid:'15',
          earename: '周口',
          examdays: '1',
          examdate: '2023-07-01',
          empowerType:'1'
        }],

        spanMap: {},
    };
  },
  mounted() {
    this.getRegPersonList();
    this.getInitOptionsData();
    this.initSpanArr(this.tableDataList, 'earename');
    this.initSpanArr(this.tableDataList, 'examdays');
    
  },
  methods: {
    // 合并单元格
    spanMethod( {rowIndex, column: {property}} ){
      if(this.spanMap[property]){
        const _row = this.spanMap[property].spanArr[rowIndex];
      const _col = _row > 0 ? 1 : 0;
      return { // [0,0] 表示这一行不显示, [2,1]表示行的合并数
        rowspan: _row,
        colspan: _col,
      };
      }
    },
    // 单元格合并方法
    initSpanArr( data, column ){
      let contactDot = 0;
      this.spanMap[column] = {};
      this.spanMap[column].spanArr = [];
      data.forEach(( item, index ) => {
        if(index === 0){
        this.spanMap[column].spanArr.push(1); // 第一行数据 不合并
      } else {
        if(item[column] === data[index - 1][column]){
          this.spanMap[column].spanArr[contactDot] += 1; // 下一行,如果数据相同,合并行数加一
        this.spanMap[column].spanArr.push(0);
        } else{
          contactDot = index;
        this.spanMap[column].spanArr.push(1);
        }
      }
      });
    },
    
    // 关闭授权
    closeEmpowerType(row) {

    },

    // 开启授权
    openEmpowerType(row) {

    },

    // 展示授权详情
    showdetail(row) {
      console.log(row);
    },

    getSpanArr(data) {
      this.spanArrOrd = []
    },


    headClass() {
      // 表格table头第一行的背景
      return "text-align: center;background:#eef1f6;";
    },
    
    getInitOptionsData(){
        this.getEareSel();
        this.getColumnOp();
    },
    findRegPersonList(){
      this.currentPage = 1
      this.getRegPersonList()
    },
    getRegPersonList(){

    },
    handleSizeChange(val) {
      //改变每页条数的动作事件
      this.pageSize = val;
      this.currentPage = 1; //改变每页条数,从第一页开始
      this.getRegPersonList();
    },
    handleCurrentChange(val) {
      //改变页数的动作事件
      this.currentPage = val;
      this.getRegPersonList();
    },
    getEareSel(){
    //获取考点下拉选
      this.eareOptions=[{value:"",label:"请选择考点地区"},{value:"1",label:"省直"},{value:"2",label:"郑州市"},{value:"3",label:"开封市"},{value:"4",label:"洛阳市"},{value:"5",label:"平顶山市"},{value:"6",label:"新乡市"},
          {value:"7",label:"焦作市"},{value:"8",label:"濮阳市"},{value:"9",label:"鹤壁市"},{value:"10",label:"安阳市"},{value:"11",label:"三门峡市"},{value:"12",label:"许昌市"},
          {value:"13",label:"漯河市"},{value:"14",label:"商丘市"},{value:"15",label:"周口市"},{value:"16",label:"驻马店市"},{value:"17",label:"信阳市"},{value:"18",label:"南阳市"},
          {value:"19",label:"济源市"},{value:"28",label:"新蔡县"},{value:"35",label:"巩义市"},{value:"37",label:"永城市"},{value:"38",label:"固始"},{value:"39",label:"邓州市"},
          {value:"41",label:"兰考县"},{value:"42",label:"汝州市"},{value:"43",label:"滑县"},{value:"44",label:"长垣县"},{value:"45",label:"鹿邑县"},]
    },
    getColumnOp(){
      this.columnOptions=[{value:"",label:"请选择查询项"},{value:"username",label:"账户"},{value:"responsname",label:"负责人姓名"},{value:"respstelpone",label:"负责人联系方式"},
        {value:"operator",label:"操作人姓名"},{value:"operatortel",label:"操作人联系方式"}]
    },
    
  },
};
</script>

<style .scoped>
.content_home_start {
  padding: 10px;
  box-sizing: border-box;
  width: 100%;
  height: 100%;
}
.conter_table {
  margin-top: 10px;
  /* height: 600px; */
  /* padding: 35px 15px;
  border-radius: 5px;
  border: 1px solid gray;
  box-sizing: border-box; */
}
.el-dialog__body {
    padding: 2px 20px;
    color: #606266;
    font-size: 14px;
    word-break: break-all;
}
.el-row ::v-deep .el-input__inner{
  height: 40px;
}

.el-input--medium .el-input__inner {
    height: 40px;
    line-height: 40px;
}
</style>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要动态合并Element UI表格的单元格,可以使用表格的`span-method`属性。该属性接受一个方法作为参数,用于计算表格每个单元格应该跨越多少行或。 下面是一个示例代码,演示了如何动态合并表格的单元格: ```html <template> <el-table :data="tableData" :span-method="handleSpanMethod"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 18, address: '北京' }, { name: '李四', age: 20, address: '上海' }, { name: '王五', age: 22, address: '广州' }, { name: '赵六', age: 24, address: '深圳' } ] } }, methods: { handleSpanMethod({ row, column, rowIndex, columnIndex }) { if (columnIndex === 0) { // 如果是第一,则判断该单元格是否和上一行的单元格内容相同 if (rowIndex > 0 && row.name === this.tableData[rowIndex - 1].name) { // 如果相同,则返回一个对象,设置rowspan属性为0,表示该单元格不需要显示 return { rowspan: 0, colspan: 1 } } else { // 如果不同,则返回一个对象,设置rowspan属性为该单元格所在行相同内容单元格的数量 let count = 1 for (let i = rowIndex + 1; i < this.tableData.length; i++) { if (row.name === this.tableData[i].name) { count++ } else { break } } return { rowspan: count, colspan: 1 } } } else { // 如果不是第一,则返回一个对象,设置colspan属性为0,表示该单元格不需要显示 return { rowspan: 0, colspan: 0 } } } } } </script> ``` 在上述代码,我们定义了一个`handleSpanMethod`方法,用于计算表格每个单元格应该跨越多少行或。该方法接受一个参数,包含以下属性: - `row`:当前单元格所在行的数据对象 - `column`:当前单元格所在的配置对象 - `rowIndex`:当前单元格所在行的索引 - `columnIndex`:当前单元格所在的索引 在`handleSpanMethod`方法,我们首先判断当前单元格是否为第一,如果是第一则需要动态合并单元格。我们使用条件语句判断该单元格是否和上一行的单元格内容相同,如果相同则返回一个对象,设置`rowspan`属性为0,表示该单元格不需要显示;如果不同则返回一个对象,设置`rowspan`属性为该单元格所在行相同内容单元格的数量。如果当前单元格不是第一,则返回一个对象,设置`colspan`属性为0,表示该单元格不需要显示。 最后,在表格使用`span-method`属性,绑定`handleSpanMethod`方法即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值