<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. 小程序Excel导入导出数据库功能

    https://blog.csdn.net/yhcad/article/details/116204444 unit Umain;interfaceuses  Winapi.Windows, Wina ...

  2. vue2的响应式原理

    响应式的话,主要指的是这个状态改变以后,视图要去主动更新 这个过程,vue是通过两个步骤来实现的 1 数据的劫持 数据劫持也叫做数据拦截,通过Object.defineProperty来把对象中的每一 ...

  3. 执行celery --version报错

    python 3.7.4安装celery后执行celery --version报错 安装命令: pip install celery -i https://pypi.douban.com/simple ...

  4. mac 编译安装ffmpeg

    下载源码: https://ffmpeg.org/download.html 解压, ./configure --disable-x86asm --prefix=/usr/local/ffmpeg_m ...

  5. Centos7 更换yum软件源

    https://blog.csdn.net/zhinian1204/article/details/123975403

  6. taobao.tbk.sc.newuser.order.get( 淘宝客-服务商-新用户订单明细查询 )

    淘宝客订单表结构设计(mysql) CREATE TABLE `tbk_order` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `member_id` bi ...

  7. centos7 安装jupyter

    1.基本包安装 yum update -y yum install python-pip -y yum install bzip2 -y yum groupinstall "Developm ...

  8. 摩托罗拉IP PBX9000配置指南

    400通话时,按数字键进行选择无效 打开IPB通信板界面,SIP终端参数--应用设置--点击RFC2833数值,默认禁用变更为101,(如有多个勾选批量,填写批量数值)--提交--保存修改 未完待续

  9. fabric学习笔记3

    fabric学习笔记3 20201303张奕博 2023.1.11 Hyperledger Fabric架构设计 分布式帐本 区块链核心概念是分布式帐本,就像下面的图1所示,同样的帐本(全量的交易数据 ...

  10. 如何把接口返回文件流读取后写入Excel

    代码: res = res.content #接口返回的内容 with open(path,mode='wb') as file: #excel的路径 file.write(res)