<template>

<div>

<el-table
    ref="tableData"

      :data="tableData"
      show-summary
      :max-height="520"
      :summary-method="summaryMethod"
      :default-sort="sortRule"
      @sort-change="sortChange"
    >
      <el-table-column
        v-if="analyseType==='5'"
        key="provice"
        header-align="center"
        label="省份"
        prop="typeName"
        min-width="140"
        fixed
      />
      <el-table-column
        v-else
        key="customerType"
        header-align="center"
        label="客户类型"
        prop="typeName"
        min-width="140"
        fixed
      />
      <template v-for="year in yearList">
        <el-table-column
          v-if="selectedAllColumns.length"
          :key="`${year}_all`"
          header-align="center"
          :label="`${year}`"
        >
          <el-table-column
            v-for="column in selectedAllColumns"
            :key="`${column.prop}_${year}`"
            :prop="`${column.prop}_${year}`"
            :label="column.columnLabel"
            :min-width="getHeaderWidth(column.columnLabel)"
            sortable="custom"
          >
            <template slot-scope="{row,column:scopeColumn}">
              <span
                v-if="column.columnLabel === '业绩(万元)'"
                class="link-style"
                @click="handleCeilClick(row,scopeColumn,year)"
              >
                {{ row[`${column.prop}_${year}`] }}
              </span>
              <span v-else>{{ formatCeilData(column.columnLabel,row[`${column.prop}_${year}`]) }}</span>
            </template>
          </el-table-column>
        </el-table-column>
        <el-table-column
          v-if="selectedCutoffColumns.length"
          :key="`${year}_cutoff`"
          header-align="center"
          :label="`${year},其中截止${deadline}`"
        >
          <el-table-column
            v-for="column in selectedCutoffColumns"
            :key="`${column.prop}_${year}`"
            :prop="`${column.prop}_${year}`"
            :label="column.columnLabel"
            :min-width="getHeaderWidth(column.columnLabel)"
            sortable="custom"
          >
            <template slot-scope="{row,column:scopeColumn}">
              <span
                v-if="column.columnLabel === '业绩(万元)'"
                class="link-style"
                @click="handleCeilClick(row,scopeColumn,year)"
              >
                {{ row[`${column.prop}_${year}`] }}
              </span>
              <span v-else>{{ formatCeilData(column.columnLabel,row[`${column.prop}_${year}`]) }}</span>
            </template>
          </el-table-column>
        </el-table-column>
      </template>
    </el-table>

</div>

</template>

<script>
 
export default {
  name: 'DataTable',
  props: {
    deadline: {
      type: String,
      default: ''
    },
    tableLebel: {
      type: String,
      default: ''
    },
    analyseType: {
      type: String,
      default: ''
    },
    systemDate: {
      type: String,
      default: ''
    }
  },
  data() {
    return {
      tableColumns: [], // 列指标
      selectedColumns: [], // 已选列指标
      tableData: [], // 表格数据
      yearList: [], // 年列表
      sortRule: { prop: null, order: null },
      sortData: [] // 拷贝的表格数据
 
    }
  },
  computed: {
    // 全量数据已选列
    selectedAllColumns() {
      const { selectedColumns } = this
      return selectedColumns.filter(({ cutoff }) => !cutoff)
    },
    // 限制数据已选列
    selectedCutoffColumns() {
      const { selectedColumns } = this
      return selectedColumns.filter(({ cutoff }) => cutoff)
    }
  },
  methods: {
    init(yearList, tableColumns, data) {

      this.totalRow = data.pop() || {}
      this.yearList = yearList
      this.tableColumns = tableColumns
      this.selectedColumns = [].concat(tableColumns)
      this.tableData = data || []
      this.sortData = data || []
      this.$nextTick(() => {
        const { tableData } = this.$refs
        if (tableData) {
          tableData && this.setScrollXY() // 解决滚动条不重置问题
          tableData && tableData.doLayout() // 解决表格固定列塌陷导致无数据显示
        }
      })
    },
 setScrollXY(scrollLeft = 0, scrollTop = 0) {
      const { $el } = this.$refs.tableData
      const wrapper = $el.querySelector('.el-table__body-wrapper') // 滚动的元素类名
      wrapper && Object.assign(wrapper, {
        scrollLeft,
        scrollTop
      })
    },
    // 表格列点击事件
    handleClick(row, column, year) {
      console.log(row, column, year)
    },
 // 表格合计保持在最后

    summaryMethod({ columns }) {
      const total = ['合计']
      for (let i = 1, l = columns.length; i < l; i++) {
        const { property } = columns[i]
        total[i] = this.formatCeilData(columns[i].label, this.totalRow[property])
      }
      return total
    },
    // 针对拼接百分比的单元格显示值格式化
    formatCeilData(columnLabel, val) {
      if (['业绩占比', '同期业绩增长率'].includes(columnLabel)) {
        if (![null, undefined, '', '/'].includes(val)) {
          return val + '%'
        }
      }
      return val
    },
  // 表格排序方法(/排最后)

    sortChange(column) {
      const { prop, order } = column
      if (order != null) {
        const data = []
        for (let i = 0; i < this.tableData.length; i++) {
          //tableData是el-tabel绑定的表格数据
          //判断如果是空的push在数字后面,有值的就放在前面,然后把排好的数组再赋值给表格data
          const value = this.tableData[i][prop]
          if ([null, '', '/', undefined].includes(value)) {
            data.push(this.tableData[i])
          } else {
            data.unshift(this.tableData[i])
          }
        }
        // 自定义排序方法  过滤掉 null undefined '' 等空值
        data.sort((a, b) => {
          const aValue = a[prop]
          const bValue = b[prop]
          if (aValue === bValue) {
            return 0;
          } else if ([null, '', '/', undefined].includes(aValue)) {
            return 1;
          } else if ([null, '', '/', undefined].includes(bValue)) {
            return -1;
          } else if (order === "ascending") {
            // 升序
            return Number(aValue) < Number(bValue) ? -1 : 1
          } else {
            // 降序
            return Number(aValue) < Number(bValue) ? 1 : -1
          }
        });
        this.tableData = data //最后把排序好的表格数据赋值给排序前的表格数据
      } else { //如果不排序了,就恢复到最初未排序的状态
        this.tableData = this.sortData // 用之前拷贝的数据还原默认排序
      }
      Object.assign(this.sortRule, {
        prop,
        order
      })
    },
    clear() {
      this.yearList = []
      this.tableColumns = []
      this.selectedColumns = []
      this.tableData = []
    },
    getHeaderWidth(str) {
      let strLength = computeStrOccupyLength(str)
      strLength = Math.ceil(strLength)
      return strLength * 15 + 30
    }
  }
}
</script>
<style lang="scss" scoped>
.link-style {
  color: #50308d;
  &:hover {
    text-decoration: underline;
    cursor: pointer;
  }
}
</style>

vue+element 表格动态列添加点击事件与排序(/或者空值排最后)的更多相关文章

  1. Jquery 动态添加元素 添加点击事件

    给动态添加的元素添加js事件,不能直接添加js事件,需要借助on( )方法,给选择器指定的子元素添加事件处理函数,并非选择器本身: 1. 语法 $(selector).on(event,childSe ...

  2. vue echarts 给双饼图添加点击事件

    在用 echarts 画旭双饼图( https://www.echartsjs.com/examples/zh/editor.html?c=pie-nest )的时候,经常会伴随着点击事件 如果想要在 ...

  3. [Swift通天遁地]一、超级工具-(1)动态标签:给UILabel文字中的Flag和url添加点击事件

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)

    Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成) 动态表单生成 ElementUI官网引导 Element表单生成 Element动态增减表单,在线代码 关键配置 templa ...

  5. ThinkPHP框架下,给jq动态添加的标签添加点击事件移除标签

    jq移除标签主要就是$("#要移除的id").remove();不再赘述,这里要提醒的是jq中动态添加标签后怎样添加点击事件.一般的jq添加点击事件是用这种方法$("#i ...

  6. jquery无法为动态生成的元素添加点击事件的解决方法

    遇到 jquery无法为动态生成的元素添加点击事件,谷歌一下,整理一下解决方法如下: (<li>中间的元素是动态生成的), 现在想为<i>添加点击事件, 例子如下: <d ...

  7. jquery:为动态加载的元素添加点击事件

    jquery:为动态加载的元素添加点击事件 最近在做项目的时候遇到了这样一个问题,给用ajax动态加载出来的内容添加点击事件,但是怎么都触发不了,经过查询试验总结出正确的写法 在jquery1.7之前 ...

  8. 【Unity】用代码给按钮动态添加点击事件

    问题:多数情况下用UGUI的Button控件身上的OnClick()列表可以指明该按钮点击后触发的回调.现在想要调用自定义脚本里的方法,当这个脚本挂在Button所属的Canvas身上时,传入Canv ...

  9. a标签添加点击事件

      a标签添加点击事件 CreateTime--2017年8月8日09:11:34 Author:Marydon 一.基础用法 方式一:(不推荐使用) <a href="javascr ...

  10. jquery为动态添加元素绑定点击事件

    on()方法添加的事件处理程序适用于当前及未来的元素(比如由脚本创建的新元素) $("#mainbody").on("click",".link&qu ...

随机推荐

  1. debian安装mate桌面环境的方法(图)

    debian安装mate桌面环境的方法(图) 2018年11月11日   |   浏览: 5199   |  来源:www.yangshengliang.com   debian安装时是可以选择桌面环 ...

  2. 日常遇到bug小记

    archery查询后显示缺少空格: https://github.com/hhyo/Archery/pull/1449 archery-mongo数据库查询skip不生效: https://githu ...

  3. gitea安装部署

    安装gitea前需要先安装好git,具体参考https://www.cnblogs.com/magicMaQaQ/p/16062312.html 1.安装数据库,gitea支持多种数据库,这里选择my ...

  4. File.createTempFile()

    File.createTempFile()的两个参数,是前缀和后缀,临时文件的文件名,会在前缀和后缀中各截取一部分,再拼接上随机数进行生成: 推荐手动指定目录,尽量指定到项目路径下,默认的磁盘位置,有 ...

  5. 解决 ant design vue Carousel 图片不能点击的问题

    pointer-events: none 的作用如下: // 阻止用户的点击动作产生任何效果 // 阻止缺省鼠标指针的显示 // 阻止CSS里的hover和active状态的变化触发事件 // 阻止J ...

  6. 【翻译】了解Flink-对DataStream API的介绍 -- Learn Flink-Intro to the DataStream API

    目录 流式可以传输什么? Java元组和POJO 元组 POJO Scala元组和case classes 一个完整的例子 流执行环境 基本的stream sources 基本的stream sink ...

  7. C语言学习--指针数组

    #include<stdio.h> //指针数组, 数组里面的每一个元素都是指针 int main() { int a = 10; int b = 20; int c = 30; // i ...

  8. CG3Y/ CG3Z 程序迁移

    /usr/sap/trans/cofiles/K900075.S4Q 固定值  文件目录(AL11)下去找 C:\Users\lenovo\Desktop\publici\K900075.S4Q /u ...

  9. MVC对session或cookie保存的值在js中做处理

    在cshtml中保存数据 eg: @Html.Hidden("sessionUserName", Session["userName"]) @Html.Hidd ...

  10. leecode 22 括号生成

    22. 括号生成 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合. 示例 1: 输入:n = 3 输出:["((()))"," ...