记录一下最近开发中遇到的一些问题,需求是将表格中一列数据的所有最大值单元格变成蓝色(值相同的也要变色),最小值单元格变成红色。表格总共有22列,列数较多,所以采用了循环的方式。
首先,来讲一下我的思路。
1.获取到每一列的数据
2.得到每列的最大值和最小值
3.得到当前列的属性所在行的索引
4.得到最大值和最小值所在列的索引(相当于知道了这个值得坐标)
5.改变单元格颜色(利用的是element-ui的表格中自带的方法)

<vp-table
      :data="tableData"
      border
      stripe
      fit
      height="600"
      style="width: 100%;"
      :cell-style="addStyle" //就是它
    >
addStyle({ row, column, rowIndex, columnIndex }) {
//四个参数中要确定两个才能给指定单元格添加样式
      if (columnIndex == 3) {
        let newObject = [];
        for (let i = 0; i < this.tableData.length; i++) {
        //terminalCustomers是我的表格中列索引为3的属性名,将后台返回的数组对象中属性名为terminalCustomers的利用for循环拿出来,并和纵坐标(rIdx)以对象的形式放到newObject中
          let attr = this.tableData[i].terminalCustomers; 
          let rIdx = i;
          // newObject中放的是当前属性下元素值和元素对应纵坐标
          newObject.push({
            attr: this.tableData[i].terminalCustomers,
            rIdx: i,
          });
        }
        // 将一列中的数据放到arr中
        let arr = [];
        for (var j = 0; j < newObject.length; j++) {
          arr.push(Number(newObject[j].attr));
        }
        //得到最大值和最小值
        let max = Math.max.apply(null, arr);//直接Math.max(arr)会报错
        let min = Math.min.apply(null, arr);

        let arr1 = [];
        let arr2 = [];
        
		//因为一列中可能有两个值是一样大的,他们的单元格样式都需要改变,所以遍历newObject这个数组对象,将相同属性值对应的总表表取出来放到一个空数组中
        for (let c = 0; c < newObject.length; c++) {
          //得到所有最大值所在行的所有索引
          if (Number(newObject[c].attr) == max) {
            arr1.push(newObject[c].rIdx);
            //得到所有最小值所在行的所有索引
          } else if (Number(newObject[c].attr) == min) {
            arr2.push(newObject[c].rIdx);
          }
        }
        //已知横坐标,对纵坐标进行遍历渲染,将最大值全部变色
        for (let m = 0; m < arr1.length; m++) {
          if (columnIndex == 3 && rowIndex == arr1[m]) {
            return `background:rgb(196,215,155)`;
          }
        }
        //将最小值全部变色
        for (let s = 0; s < arr2.length; s++) {
          if (columnIndex == 3 && rowIndex == arr2[s]) {
            return `background:rgb(230,184,183)`;
          }
        }
      }
     }

到此,就完成了。但是这种方法对于列数少的还好,列数多的情况下就增加了很多的代码量。
也有想过要封装起来,但是封装过程中遇到了很多问题。所有如果大神们有更好的方式或者封装方法,请留言告诉我。不胜感激!拜谢!

过了一段时间,我又来了。这种方法不要用了,推荐使用表格插件vxe-table,不要太好用。这种需求可以参考api:cell-style

Logo

前往低代码交流专区

更多推荐