【已解决】koca组件kui-table组件问题,合并单元格,表格存在未设置宽度列,新增数据,表格会显示异常

KOCA版本 :3.3.6-2
KOCA-ui版本 :3.7.3-3
模块版本
场景 :
问题 :
报错细节 :
尝试解决方案:1、把所有配置列设置宽度未出现异常;2、使用el-table未出现异常

原始数据页面:

点击新增复制第二条:

kui-table后一条合并数据显示异常,el-table显示正常

你好~能贴demo的代码出来方便排查一下嘛

<template>
  <div>
    <el-table
      :data="qzdata"
      border
      style="width: 100%"
      :span-method="objectSpanMethod"
    >
      <el-table-column
        fixed
        prop="weidu"
        label="维度"
        width="160"
      >
      </el-table-column>
      <el-table-column
        prop="gongshi"
        label="规则公式"
      >
      </el-table-column>
      <el-table-column
        prop="defen"
        label="得分"
        width="180"
      >
      </el-table-column>
      <el-table-column
        prop="quanzhong"
        label="权重"
        width="180"
      >
      </el-table-column>
             
      <el-table-column
        fixed="right"
        label="操作"
        width="100"
      >
        <template slot-scope="scope">
          <el-button type="text" size="small" @click="handleQzEdit(scope.row,scope.$index)">新增</el-button>
          <el-button type="text" size="small">编辑</el-button>
        </template>
      </el-table-column>
    </el-table>
    <ui-render-table
      ref="countTable"
      class="editClass"
      table-edit
      btn-type="icon"
      style="width: 100%;"
      :height="splitHeight"
      row-key="name"
      :data="qzdata"
      :columns="qzColumns"
      :span-method="objectSpanMethod"
      :create-button="false"
    ></ui-render-table>
  </div>
</template>

<script lang="ts">
import { Component, Vue, PropSync } from "vue-property-decorator";
import apiList from "@/projects/aml-securities/views/url.config";
import { ActionEnum } from "@/enum/globalEnum";
import { cloneDeep } from "lodash-es";

@Component({
  name: "addOrUpdateForm",
  components: {
  }
})
export default class addOrUpdateForm extends Vue {


  qzdata=[
    {
      weidu:"身份识别点",
      weiduId:0,
      gongshi:"1",
      defen:"1",
      quanzhong:"1",
    },
    {
      weidu:"身份识别点",
      weiduId:0,
      gongshi:"2",
      defen:"2",
      quanzhong:"2",
    },
    {
      weidu:"交易识别点",
      weiduId:1,
      gongshi:"3",
      defen:"3",
      quanzhong:"3",
    },
    {
      weidu:"交易识别点",
      weiduId:1,
      gongshi:"",
      defen:"",
      quanzhong:"",
    },
    {
      weidu:"行为识别点",
      weiduId:2,
      gongshi:"公式",
      defen:"",
      quanzhong:"",
    },
    {
      weidu:"行为识别点",
      weiduId:2,
      gongshi:"公式111",
      defen:"",
      quanzhong:"",
    },
  ]
 
  get qzColumns() {
    return [
      {
        prop: "weidu",
        label: "维度",
        align: "center",
        width: 160,
        // mergeFlag:true,
        render: (h, { row, index }) => h("div", {}, row.weidu),
      },
      {
        prop: "gongshi",
        label: "规则公式",
        // width: 700,
        headerAlign: "left",
        align: "left",
        showTooltip: true,
        // render: (h, { row, index }) => this.renderCell(h, row, index, "gongshi",)
      },
      {
        prop: "defen",
        label: "得分",
        align: "center",
        width: 180,
        // render: (h, { row, index }) => this.renderCell(h, row, index, "defen",)
      },
      {
        prop: "quanzhong",
        label: "权重",
        align: "center",
        width: 180,
        // render: (h, { row, index }) => this.renderCell(h, row, index, "quanzhong",)
      },
      {
        type: "action",
        label: "操作",
        width: 100,
        fixed: "right",
        btns: [
          {
            actionType: ActionEnum.ADD,
            tip: "新增规则",
            click: this.handleQzEdit
          },
          {
            actionType: ActionEnum.DELETE,
            isShowPopconfirm: true,   
            confirmTitle: "确定删除当前行数据",  
            tip: "删除",       
            click: this.handleQzDel
          },
        ]
      },
    ];
  }


  get splitHeight() {
    return 300;
  }
  // 合并单元格判断
  getSpanArr (data: any, spanKey: any) {
    console.log(spanKey);
    const spanArr = [];
    let pos: any = "";
    for (let i = 0; i < data.length; i++) {
      if (i === 0) {
        spanArr.push(1);
        pos = 0;
      } else {
        if (data[i][spanKey] === data[i - 1][spanKey]) {
          spanArr[pos] += 1;
          spanArr.push(0);
        } else {
          spanArr.push(1);
          pos = i;
        }
      }
    }
    return spanArr;
  }
  //  权重分合并单元格
  objectSpanMethod({ row, column, rowIndex, columnIndex }) {
    if (columnIndex === 0) {
      console.log(column.property);
      const spanArr = this.getSpanArr(this.qzdata, column.property);
      const _row = spanArr[rowIndex];
      const _col = _row > 0 ? 1 : 0;
      console.log([_row,_col]);
      return [_row,_col];
      // {
      //   rowspan: _row,
      //   colspan: _col
      // };
    }else{
      return[1,1];
    }
  }
  //  权重分操作-新增
  handleQzEdit(row, index) {
    this.qzdata.splice(index + 1, 0, {
      ...cloneDeep(row),
      gongshi:"复制公式" + index,
      defen:"复制得分" + index,
      quanzhong:"复制权重" + index,
    });
  }
  //  权重分操作-删除
  handleQzDel(row, index) {
    this.qzdata.splice(index, 1);
  }
  
  renderCell(h, row, index, prop) {
    const type = prop == "gongshi" ? "kui-select" : "kui-input";
    return h(type, {
      props: {
        value: row[prop],
        placeholder: prop,
        width: "100%",
        "show-tooltip": false,
        labelKey: "label",
        valueKey: "value",
      },
      on: {
        input: (val) => {
          row[prop] = val;
        },
        change: async (val) => {
        }
      },
    });


  }

}
</script>
<style lang="scss" scoped>


</style>

你好~ui-render-table是资管ui组件,不是koca-ui的kui-table组件,可以用kui-table代替el-table试试看

所以取找资管得就可以了?

kui-table也出现了合并异常
如图


<template>
  <div>
    <div>
      el-table
    </div>
    <el-table :data="formModel.weightList" border class="editClass" style="width: 100%" :span-method="objectSpanMethod">
      <el-table-column prop="ruleType" align="center" label="维度" dict="90100020" width="160">
      </el-table-column>
      <el-table-column prop="ruleId" label="规则公式">
        <template slot-scope="{row,$index}">
          <kui-select
            v-model="row.ruleId"
            placeholder="ruleId"
            style="width:100%"
            label-key="label"
            value-key="value"
          ></kui-select>
        </template>

      </el-table-column>
      <el-table-column prop="score" label="得分" align="center" width="180">

        <template slot-scope="{row}">
          <kui-input v-model="row.score" placeholder="score" style="width:100%"></kui-input>
        </template>
      </el-table-column>
      <el-table-column prop="weightValue" label="权重" align="center" width="180">
        <template slot-scope="{row}">
          <kui-input v-model="row.weightValue" placeholder="weightValue" style="width:100%"></kui-input>
        </template>
      </el-table-column>
      <el-table-column fixed="right" label="操作" align="center" width="100">
        <template slot-scope="scope">
          <div class="table-action is-icon">
            <kui-tooltip content="新增规则">
              <div class="el-tooltip table-btn-icon" @click="handleQzEdit(scope.row, scope.$index)">
                <i class="cfui-icon-plus"></i>
              </div>
            </kui-tooltip>
            <el-popconfirm
              title="确定删除当前行数据?"
              placement="top"
              popper-class="table-action-popconfirm"
              @confirm="handleQzDel(scope.row, scope.$index)"
            >
              <div slot="reference" class="el-tooltip table-btn-icon is-delete">

                <i class="cfui-icon-delete"></i>
              </div>
            </el-popconfirm>
          </div>
        </template>
      </el-table-column>
    </el-table>
    <div>kui-table</div>
    <kui-table
      :data="formModel.weightList"
      border
      class="editClass"
      style="width: 100%"
      :span-method="objectSpanMethod"
    >
      <kui-table-column prop="ruleType" align="center" label="维度" width="160">
      </kui-table-column>
      <kui-table-column prop="ruleId" label="规则公式">
        <template slot-scope="{row,scope}">
          <kui-select
            v-model="row.ruleId"
            :placeholder="'ruleId' + scope.$index"
            style="width:100%"
            label-key="label"
            value-key="value"
          ></kui-select>
        </template>

      </kui-table-column>
      <kui-table-column prop="score" label="得分" align="center" width="180">

        <template slot-scope="{row}">
          <kui-input v-model="row.score" placeholder="score" style="width:100%"></kui-input>
        </template>
      </kui-table-column>
      <kui-table-column prop="weightValue" label="权重" align="center" width="180">
        <template slot-scope="{row}">
          <kui-input v-model="row.weightValue" placeholder="weightValue" style="width:100%"></kui-input>
        </template>
      </kui-table-column>
      <kui-table-column fixed="right" label="操作" align="center" width="100">
        <template slot-scope="scope">
          <div class="table-action is-icon">
            <kui-tooltip content="新增规则">
              <div class="el-tooltip table-btn-icon" @click="handleQzEdit(scope.row, scope.scope.$index)">
                <i class="cfui-icon-plus"></i>
              </div>
            </kui-tooltip>
            <el-popconfirm
              title="确定删除当前行数据?"
              placement="top"
              popper-class="table-action-popconfirm"
              @confirm="handleQzDel(scope.row, scope.$index)"
            >
              <div slot="reference" class="el-tooltip table-btn-icon is-delete">

                <i class="cfui-icon-delete"></i>
              </div>
            </el-popconfirm>
          </div>
        </template>
      </kui-table-column>
    </kui-table>

  </div>
</template>
  
<script lang="ts">
import { deepCopy } from "@/libs/utils/utils";
import { Component, Vue, PropSync, Watch } from "vue-property-decorator";
@Component({
  name: "addOrUpdateForm",
  components: {
  }
})
export default class addOrUpdateForm extends Vue {
    
    // 新增、修改表单对象
    formModel = {
      modelName: "",
      modelDesc: "",
      modelType: "1",
      list: [{
        value: 0, label: "疑似内幕交易",
        isCurrent: true,
        data: []

      }, {
        value: 1, label: "疑似场外配资",
        data: []
      }, {
        value: 2, label: "疑似欺诈发行股票",
        data: []
      }, {
        value: 3, label: "疑似非法集资",
        data: []
      }, {
        value: 4, label: "疑似贪腐",
        data: []
      }, {
        value: 5, label: "疑似挪用资金",
        data: []
      }],
      ruleList: [],
      weightList: [
        {
          ruleType: "1",
          ruleId: "",
          score: "",
          weightValue: ""
        },
        {
          ruleType: "2",
          ruleId: "",
          score: "",
          weightValue: ""
        }, 
        { 
          ruleType: "3", 
          ruleId: "", 
          score: "", 
          weightValue: "" 
        }
      ]

    };
   

    // 合并单元格判断
    getSpanArr(data: any, spanKey: any) {
      const spanArr = [];
      let pos: any = "";
      for (let i = 0; i < data.length; i++) {
        if (i === 0) {
          spanArr.push(1);
          pos = 0;
        } else {
          if (data[i][spanKey] === data[i - 1][spanKey]) {
            spanArr[pos] += 1;
            spanArr.push(0);
          } else {
            spanArr.push(1);
            pos = i;
          }
        }
      }
      return spanArr;
    }
    //  权重分合并单元格
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 0) {
        const spanArr = this.getSpanArr(this.formModel.weightList, column.property);
        const _row = spanArr[rowIndex];
        const _col = _row > 0 ? 1 : 0;
        return [_row, _col];
      } else {
        return [1, 1];
      }
    }
    //  权重分操作-新增
    handleQzEdit(row, index) {
      console.log(index);
      this.formModel.weightList.splice(index + 1, 0, {
        ...deepCopy(row),
        ruleId: "fuzhi" + index,
        score: "",
        weightValue: "",
      });
      this.$forceUpdate();
    }
    //  权重分操作-删除
    handleQzDel(row, index) {
      this.formModel.weightList.splice(index, 1);
    }




}
</script>
<style lang="scss" scoped></style>

升级到最新的koca-ui 3.7.5没有此问题

1 个赞