element table 组件

功能:1.根据底部运行低、高。。。的颜色来展示表格数据在那个颜色

测试(http://10.0.16.47:8001/#/login

           2.实现表头拖拽                

<div style="position:relative" :style="{ height: height + 'px' }">

    <el-table

      v-loading="loading"

      element-loading-text="拼命加载中"

      element-loading-spinner="el-icon-loading"

      element-loading-background="rgba(0, 0, 0, 0.8)"

      :data="tableData"

      stripe

      border

      :height="height"

      class="drag_table"

      @sort-change="handleSortChange"

      @row-contextmenu="rowContextmenu"

      @header-dragend="headerDragend"

      @row-dblclick="handleRowDblClick"

    >

      <column-tree v-for="(item,index) in tableColumnsCopy" :key="index" :column-data="item" :key-index="index" :drag-state="dragState" @spliceHead="spliceHead" @spliceHeadRight="spliceHeadRight" @cleanDragState="cleanDragState" />

    </el-table>

    <el-pagination

      :current-page="currentPage"

      :page-sizes="pageSizes"

      :page-size="pageSize"

      layout="total, sizes, prev, pager, next, jumper"

      :total="total"

      @size-change="handleSizeChange"

      @current-change="handleCurrentChange"

    />

  </div>

script

import ColumnTree from './ColumnTree'

export default {

  name: 'DynamicTable',

  components: {

    ColumnTree

  },

  props: {

    tableColumns: {

      // 表头

      type: Array,

      default: function() {

        return []

      }

    },

    tableData: {

      // 表格数据

      type: Array,

      default: function() {

        return []

      }

    },

    height: {

      // 表格高度

      type: Number,

      default: 800

    },

    pageSizes: {

      // 每页显示个数选择器的选项设置

      type: Array,

      default: function() {

        return [20, 50, 100, 200]

      }

    },

    pageSize: {

      // 每页显示条目个数,支持 .sync 修饰符

      type: Number,

      default: 20

    },

    total: {

      // 总条数

      type: Number,

      default: 0

    },

    showTableExtensions: {

      // 是否显示表格扩展功能

      type: Boolean,

      default: false

    },

    loading: {

      // 显示正在加载状态

      type: Boolean,

      default: false

    }

  },

  data() {

    return {

      data: [],

      pagination: {

        Page: 1,

        PageSize: this.pageSize,

        SortName: '',

        SortType: ''

      },

      pageOrder: 'ascending', // 排序

      currentPage: 1, // 当前页

      sortColumn: '', // 排序字段

      tableColumnsCopy: [],

      key: 1, // table key

      dragState: {

        startIndex: -1, // 拖动起始元素的index

        endIndex: -1, // 拖动结束元素的index

        afterMoveIndex: -1, // 拖动后元素的index

        dragging: false, // 是否正在拖动

        direction: null, // 拖动方向

        moveTableOutsideBack: false // 拖出到table外之后又拖回来

      }

    }

  },

  computed: {},

  watch: {

    tableColumns: {

      handler: function(val) {

        this.tableColumnsCopy = val

      },

      immediate: true

    },

    tableData(val) {

      // console.log(val)

      // const idArr = [];

      // val.forEach(element => {

      //   for (var item in element) {

      //     const cell = element[item];

      //     if (cell && typeof cell === "object") {

      //       idArr.push(cell.RealValue);

      //     }

      //   }

      // });

    }

  },

  created() {},

  methods: {

    objectSpanMethod({ row, column, rowIndex, columnIndex }) {

      // console.log(row, column, rowIndex, columnIndex)

      if (columnIndex < 2) {

        if (rowIndex % 2 === 0) {

          return {

            rowspan: 2,

            colspan: 1

          }

        } else {

          return {

            rowspan: 0,

            colspan: 0

          }

        }

      }

    },

    spliceHead(start, end) {

      this.tableColumnsCopy.splice(end, 0, this.tableColumnsCopy[start])

      this.tableColumnsCopy.splice(start + 1, 1)

    },

    spliceHeadRight(start, end) {

      this.tableColumnsCopy.splice(end + 1, 0, this.tableColumnsCopy[start])

      this.tableColumnsCopy.splice(start, 1)

    },

    cleanDragState() {

      // 再次初始化拖动状态

      this.dragState = {

        startIndex: -1, // 拖到的起始index

        endIndex: -1,

        afterMoveIndex: -1,

        dragging: false, // 是否拖到

        direction: null, // 拖到方向

        moveTableOutsideBack: false

      }

    },

    // 改变页尺寸时触发

    handleSizeChange(val) {

      this.pagination.PageSize = val

      this.emitPagination()

    },

    // 改变当前页时触发

    handleCurrentChange(val) {

      // this.pagination.Page = val

      // this.emitPagination()

      this.$emit('handleCurrentChange', val)

    },

    // 自定义排序

    handleSortChange(data) {

      this.pagination.SortName = data.prop

      if (data.column) {

        // 有排序

        this.pagination.SortType = data.order === 'ascending' ? 'asc' : 'desc'

        this.emitPagination()

      } else {

        // 无排序,使用默认排序

        this.pagination.SortType = 'asc'

        this.pagination.SortName = ''

        this.emitPagination()

      }

    },

    // 表格双击事件

    handleRowDblClick(row, column, event) {

      this.$emit('handleRowDblClick', row, column.property, event)

    },

    // 数据刷新

    emitPagination() {

      // 父组件处理分页,向其传递分页参数

      this.$emit('handlePageChange', this.pagination)

    },

    rowContextmenu(row, event, MouseEvent) {

      // 父组件处理右键菜单,向其传递右键菜单参数

      this.$emit('getContextMenu', row, event, MouseEvent)

    },

    headerDragend(newWidth, oldWidth, column) {

      // 用户改变表头宽度时触发

      this.$emit('headerDragend', { width: newWidth, prop: column.property })

    }

  }

}

表头组件columnTree

<el-table-column

    :label="columnData.name"

    :prop="columnData.columnName ? columnData.columnName : ''"

    :width="columnData.width"

    :column-key="keyIndex.toString()"

    :resizable="columnData.draggle"

    header-align="center"

    align="center"

    :render-header="renderHead"

  >

    <template v-slot="{ row }">

      <div v-if="row[columnData.columnName] === undefined">

        <div

          v-for="(item, index) in row.pointDetailList"

          v-show="item.columnName === columnData.columnName"

          :key="item.value + index"

          class="dd"

          :class="getDynamicCellClass(item)"

        >

          {{ item.value }}

        </div>

      </div>

      <div v-else>{{ row[columnData.columnName] }}</div>

    </template>

  </el-table-column>

script中实现拖拽事件

export default {

  name: 'ColumnTree',

  // draggle: false

  props: {

    columnData: {

      // 表头

      type: Object,

      default: function() {

        return null

      }

    },

    keyIndex: {

      type: Number,

      default: 0

    },

    dragState: {

      type: Object,

      default: () => {}

    }

  },

  methods: {

    renderHead(createElement, { column, $index }) {

      // 这里可以根据$index的值来对自身需求进行修改,

      return createElement(

        'span',

        {

          class: ['thead-cell'],

          style: {

            display: 'block',

            width: '100%',

            cursor: 'move'

          },

          on: {

            mousedown: ($event) => {

              this.handleMouseDown($event, column)

            },

            mouseup: ($event) => {

              this.handleMouseUp($event, column)

            },

            mousemove: ($event) => {

              this.handleMouseMove($event, column)

            }

          }

        },

        [

          createElement('a', column.label, {

            class: ['labelColor']

          }),

          // 给每个表头添加一个class=virtual 是画虚线的类名。

          createElement('span', {

            class: ['virtual']

          })

        ]

      )

    },

    // 按下鼠标开始拖动

    handleMouseDown(e, column) {

      // 判断是鼠标左键

      if (e.button === 0 && column.resizable) {

        this.dragState.dragging = true

        this.dragState.startIndex = parseInt(column.columnKey)

        // console.log(`开始移动的位置 ${this.dragState.startIndex}`)

        // 给当前要拖动列的th设置class

        document.querySelectorAll('.drag_table table thead tr th')[this.dragState.startIndex].className += ' ' + 'dragging_column'

        // 给拖动时的虚拟容器添加宽高

        const table = document.getElementsByClassName('drag_table')[0]

        const virtual = document.getElementsByClassName('virtual')

        // 设置新插入的span.virtual的标签 每一列的宽度、高度

        for (const item of virtual) {

          item.style.height = table.clientHeight - 1 + 'px'

          item.style.width = item.parentElement.parentElement.clientWidth + 'px'

        }

        this.dragState.moveTableOutsideBack = false

      }

    },

    // 拖动中

    handleMouseMove(e, column) {

      // 判断是鼠标左键

      if (e.button === 0 && column.resizable) {

        if (this.dragState.dragging) {

          const currentIndex = parseInt(column.columnKey) // 拖动的当前列index

          // console.log(`移动到了${currentIndex}`)

          if (currentIndex - this.dragState.startIndex !== 0) {

            this.dragState.direction =

              currentIndex - this.dragState.startIndex < 0 ? 'left' : 'right' // 判断拖动方向

          } else {

            this.dragState.direction = null

          }

        } else {

          return false

        }

      }

    },

    // 鼠标放开结束拖动

    handleMouseUp(e, column) {

      this.dragState.endIndex = parseInt(column.columnKey) // 记录结束列index

      // 判断是鼠标左键

      if (e.button === 0 && column.resizable) {

        // 拖出当前table外之后又拖回来,不再进行易位操作(拖出去时已处理)

        if (this.dragState.moveTableOutsideBack) {

          return false

        } else {

          // console.log(`结束移动的位置 ${this.dragState.endIndex}`)

          if (this.dragState.startIndex !== this.dragState.endIndex) {

            this.dragColumn(this.dragState)

          }

          this.dragColumn(this.dragState.startIndex, this.dragState.endIndex, this.dragState.direction)

          this.finishDragInit()

        }

      }

    },

    // 拖动易位

    dragColumn(startIndex, endIndex, direction) {

      // console.log(`从${startIndex}移动到了${endIndex}`)

      // 排除掉鼠标点击table外面,然后拖入进table报错

      if (startIndex < 0) {

        return

      }

      // 判断是向左移动还是向右移动

      // 把移动的列插在某个列前面或者后面,然后在删除移动的列

      if (direction === 'left') {

        this.$emit('spliceHead', startIndex, endIndex)

      } else {

        this.$emit('spliceHeadRight', startIndex, endIndex)

      }

    },

    // 拖动完成后的初始化

    finishDragInit() {

      // 给当前要拖动列的th取消class

      for (var item of document.querySelectorAll('.drag_table table thead tr th')) {

        item.className = String(item.className).split('dragging_column').join('')

      }

      this.$emit('cleanDragState')

      // document.removeEventListener('mouseup', this.handleMouseUp)

    },

    headerCellClassName({

      column,

      columnIndex

    }) {

      return columnIndex === this.dragState.afterMoveIndex ? `drag_active_${this.dragState.direction}` : ''

    },

    // 动态给表头单元格th添加class,实现拖动中的背景

    cellClassName({

      column,

      columnIndex

    }) {

      return (columnIndex === this.dragState.startIndex ? `dragging_column` : '')

    },

    getDynamicCellClass(cellData) {

      if (cellData.columnName !== undefined) {

        const realValue = parseFloat(cellData.value)

        const HiHi = cellData.accidentHigh // 事故高

        const Hi = cellData.accidentLower // 事故低

        const Lo = cellData.runningHigh // 运行高

        const LoLo = cellData.runningLower // 运行低

        if (realValue < Hi) {

          return { LoLo: true }

        } else if (realValue > Hi && realValue < LoLo) {

          return { Lo: true }

        } else if (realValue > LoLo && realValue < Lo) {

          return { Normal: true }

        } else if (realValue > Lo && realValue < HiHi) {

          return { Hi: true }

        } else if (realValue > HiHi) {

          return { HiHi: true }

        } else {

          return { Normal: true }

        }

      }

    }

  }

}

运行参数的颜色css来设定

<style lang='scss' scoped>

.LoLo {

  color: var(--LoLo-color);

  font-weight: bolder;

  font-size: 18px;

}

.Lo {

  color: var(--Lo-color);

  font-weight: bolder;

  font-size: 18px;

}

.Normal {

  color: var(--Normal-color);

  font-weight: bolder;

  font-size: 18px;

}

.Hi {

  color: var(--Hi-color);

  font-weight: bolder;

  font-size: 18px;

}

.HiHi {

  color: var(--HiHi-color);

  font-weight: bolder;

  font-size: 18px;

}

.CommAlarm {

  color: var(--comm-alarm-color);

  font-weight: bolder;

  font-size: 18px;

}

.dd {

  animation: shake 1s;

  -o-animation: shake 1s;

  -webkit-animation: shake 1s;

  -moz-animation: shake 1s;

}

@keyframes shake {

  0%,100% {-webkit-transform: translateX(0); }

  10%,30%,50%,70%, 90% {

    -webkit-transform: translateX(-5px);

  } 20%,40%,60%,80% {

    -webkit-transform: translateX(5px);

  }

}

}

而在入口文件index.css中定义颜色

:root {

  --LoLo-color: #e1bb36;

  --Lo-color: #7dc5eb;

  --Normal-color: #5BE126;

  --Hi-color: #f7680a;

  --HiHi-color: #df1d1e;

  --comm-alarm-color: #df1d1e;

  --accident-lower: #DAE126;

  --accident-high: #E13C26;

  --running-low: #26DAE1;

  --running-high: #E17126;

  --bolt: #89A4C0;

}

min.js 中引入 import '@/styles/index.scss'

这样功能就实现了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容