table完成动态表头与动态数据

2023-10-28

<template>
  <div class="app-container haplotype-detail default-scrollbar">
    <div>
      <el-form ref="historyForm" :model="historyForm" size="small">
        <div class="table-box" style="display:flex;" @contextmenu.prevent.capture>
          <el-table
            :header-cell-style="{background:'#f2f2f2'}"
            :data="historyForm.tableData"
            :loading="loading"
            style="width: 97%;"
            class="list-table default-scrollbar"
            size="mini"
            :cell-class-name="tableClassName"
            :height="elTableHeight"
            border
            @header-contextmenu="rightClickColShowFun"
            @row-contextmenu="rightClickRowShowFun"
          >
            <el-table-column label="序号" align="center" width="50">
              <template slot-scope="scope">
                {{ scope.$index+1 }}
              </template>
            </el-table-column>
            <el-table-column  v-for="(item,index) in historyForm.tableHeader" :key="index"  align="center" :prop="item.nameEn" class-name="cellDefault">
              <template  slot="header" slot-scope="scope">
                <el-tooltip  effect="light" placement="bottom" trigger="hover" :disabled="item.name?false:true">
                  <div slot="content" style="max-width:200px;">{{ item.name }}</div>
                  <el-input v-model="item.name" style="background:#ddd" class="headerBox"  @change="setColName(index,historyForm.tableHeader[index].name)" />
                </el-tooltip>
              </template>
              <template slot-scope="scope">
                <el-tooltip  effect="light" placement="bottom" trigger="hover" :disabled="scope.row[item.nameEn]?false:true">
                  <div slot="content" style="max-width:200px;">{{ scope.row[item.nameEn] }}</div>
                  <el-input v-model="scope.row[item.nameEn]" class="name-input" @input="setInputVal"></el-input>
                </el-tooltip>
              </template>
            </el-table-column>
          </el-table>
          <div class="add-column" @click="addColSetting">+</div>
        </div>

        <div class="add-line" @click="addParamsSetting">+</div>
      </el-form>
    </div>
  </div>
</template>
<script>
export default {
  name: 'HaplotypeDetail',
  data() {
    return {
      elTableHeight: 0,
      // 遮罩层
      loading: true,
      // 表单参数-表格内容数据
      historyForm: {
        // 表头列表数组
        tableHeader: [
          {
            name: '类型(自属性)',
            nameEn: 'typeSelf'
          },
          {
            name: '类型(生产属性)',
            nameEn: 'typeProduct'
          },
          {
            name: '类型(设备属性)',
            nameEn: 'typeEquipment'
          },
          {
            name: '类型(质量追溯属性)',
            nameEn: 'typeQuality'
          }
        ],
        tableData: [
          { index: 0, typeSelf: '集团', typeProduct: '', typeEquipment: '', typeQuality: '' },
          { index: 1, typeSelf: '公司', typeProduct: '', typeEquipment: '', typeQuality: '' },
          { index: 2, typeSelf: '厂区', typeProduct: '厂区', typeEquipment: '厂区', typeQuality: '厂区' },
          { index: 3, typeSelf: '车间', typeProduct: '车间', typeEquipment: '车间', typeQuality: '车间' },
          { index: 4, typeSelf: '线体', typeProduct: '线体', typeEquipment: '线体', typeQuality: '线体' },
          { index: 5, typeSelf: '工艺区', typeProduct: '工艺区', typeEquipment: '工艺区', typeQuality: '工艺区' },
          { index: 6, typeSelf: 'PLC区', typeProduct: 'PLC区', typeEquipment: 'PLC区', typeQuality: 'PLC区' },
          { index: 7, typeSelf: '安全区', typeProduct: '安全区', typeEquipment: '安全区', typeQuality: '安全区' },
          { index: 8, typeSelf: '工位', typeProduct: '工位', typeEquipment: '工位', typeQuality: '工位' },
          { index: 9, typeSelf: '设备组', typeProduct: '设备组', typeEquipment: '设备组', typeQuality: '设备组' },
          { index: 10, typeSelf: '设备', typeProduct: '设备', typeEquipment: '设备', typeQuality: '设备' },
          { index: 11, typeSelf: '附属设备LV1', typeProduct: '附属设备LV1', typeEquipment: '附属设备LV1', typeQuality: '附属设备LV1' },
          { index: 12, typeSelf: '附属设备LV2', typeProduct: '附属设备LV2', typeEquipment: '附属设备LV2', typeQuality: '附属设备LV2' },
          { index: 13, typeSelf: '附属设备LV3', typeProduct: '附属设备LV3', typeEquipment: '附属设备LV3', typeQuality: '附属设备LV3' }
        ]
      },
      isAddCol: true,
      currentClickRow: null,
      currentClickCol: null
    }
  },
  mounted: function() {
    // 高度调整
    this.$nextTick(() => {
      this.elTableHeight = document.body.clientHeight - 130
      console.log(document.body.clientHeight)
      console.log(this.elTableHeight)
    })
  },
  methods: {
    // 新增行
    addParamsSetting() {
      let item = {
        typeEquipment: '',
        typeProduct: '',
        typeQuality: '',
        typeSelf: ''
      }
      for (let i in this.historyForm.tableHeader) {
        if (i > 3) {
          item[this.historyForm.tableHeader[i].nameEn] = ''
        }
      }
      this.historyForm.tableData.push(item)
      console.log(this.historyForm.tableData)
    },
    // 删除当前行
    deleteRow(index) {
      this.historyForm.tableData.splice(index, 1)
    },
    // 在数据最后新增一列
    addColSetting() {
      for (let i in this.historyForm.tableHeader) {
        if (this.historyForm.tableHeader[i].name === '') {
          this.isAddCol = false
        } else {
          this.isAddCol = true
        }
      }
      if (this.isAddCol) {
        this.addColList()
      } else {
        this.$message.success('还有未填写的列')
      }
    },
    // 新增列
    addColList() {
      let index = this.historyForm.tableHeader.length - 1
      this.historyForm.tableHeader.push({ name: '', nameEn: 'selfName' + index })
      let list = this.historyForm.tableData
      for (let i = 0; i < list.length; i++) {
        this.$set(list[i]['selfName' + index], '')
      }
    },
    // 修改表头名fun
    setColName(index, val) {
      let head = this.historyForm.tableHeader
      this.$set(head[index], 'name', val)
      this.$forceUpdate()
      console.log(head)
    },
    // 输入内容数据的fun
    setInputVal(e) {
      for (let i in this.historyForm.tableHeader) {
        if (this.historyForm.tableHeader[i].name === '') {
          this.isAddCol = false
        } else {
          this.isAddCol = true
        }
      }
      if (!this.isAddCol) {
        this.$message.success('请先填写完成所有表头内容,且确保无误!')
      }
    },
    // 右键单击选中行-确认是否删除行
    rightClickRowShowFun(row, column, event) {
      this.currentClickRow = row.index
      this.$confirm('此操作将永久删除当前行, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.deleteRow(this.currentClickRow)
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        })
      })
    },
    // 右键单击选中行-确认是否删除列
    rightClickColShowFun(column, event) {
      this.currentClickCol = column.index
      if (this.currentClickCol <= 3) {
        this.$message({
          type: 'info',
          message: '当前列不支持删除!'
        })
      } else {
        this.$confirm('此操作将永久删除当前列, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          this.deleteCol(this.currentClickCol)
        }).catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          })
        })
      }
    },
    // 给数据的row、column赋index,便于进行删除行、删除列
    tableClassName({ row, column, rowIndex, columnIndex }) {
      row.index = rowIndex
      column.index = columnIndex - 1
    },
    // 删除当前列
    deleteCol(index) {
      let nameCur = this.historyForm.tableHeader[index].nameEn
      for (const key in this.historyForm.tableData) {
        // 删除nameEn属性
        let data = this.historyForm.tableData[key]
        console.log(data[nameCur])
        delete data[nameCur]
      }
      console.log(this.historyForm.tableData)
      this.historyForm.tableHeader.splice(index, 1)
    }
  }
}
</script>
<style lang="scss" scoped>
.haplotype-detail{
   .add-column, .add-line{
        background:#f2f2f2;
        width:30px;
        cursor:pointer;
        font-size:30px;
        color:#00c561;
        justify-content: center;
        flex-direction: column;
        align-items: center;
        display: flex;
   }
   .add-line{
    height:30px;
    width:97%;
   }
   .headerBox{
    padding:0px;
   }
}
</style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

table完成动态表头与动态数据 的相关文章

随机推荐

  • C#中字符串判断EndsWith和Contains的效率比较

    关于字符串的判断 EndsWith和Contains下面做了两个简单的例子 运行后测试了一下所耗时间 public void TestContains DateTime starTime DateTime Now string str 20
  • Pip install 和Conda install 的区别和使用场景

    文章目录 一 Conda 和Pip的区别 总结 二 Pip install和Conda install的区别 1 默认安装路径不同 1 python包 2 非python包 相关问题 解决 2 conda list列表数量 gt pip l
  • mysql中替换字段的部分内容

    如果想替换表中所有记录的某一个字段的指定字符串内容 可以使用mysql提供的replace 函数来实现 表记录如下 我想将address字段的湖北这部分内容替换成拼音hubei 那么sql语句如下 update user set addre
  • ConvTranspose2d(反卷积操作)

    nn ConvTranspose2d 反卷积操作 1 公式 class torch nn ConvTranspose2d in channels out channels kernel size stride 1 padding 0 out
  • Python 教程

    一 Python环境下载 百度网盘链接 https pan baidu com s 12MnzyIZZuKBiveebPdtJ3w 提取码 0st4 二 Python安装步骤 1 点击python 3 8 1 amd64 exe 2 选择安
  • Python中模块、包、库、框架的理解

    一 模块 module 以 py 文件开头的都叫做模块 模块中有定义的变量 函数 类 模块的名称为 py文件的名称 作为全局变量 name 的值 如果是模块A自己py A py则 name main 如果是被其他模块import之后使用的话
  • 机器学习实战之决策树最有特征的选取

    在学习了jack cui机器学习博客后 为了给自己留下一个理解的笔记 本人比较笨 以后方便查看 他的博客地址在下方 写得很好 点击打开链接 决策树机器学习的一种分类方法 拿相亲来说 决策树模型就是上面这一个 长方形为这个人的某个特征 决策树
  • sql把逗号分割的字符串转换为可放入in的条件语句的字符数列

    mysql 不能直接使用in子句 会当做一个字符来处理 使用FIND IN SET 字段 变量 orcal在in子句中加入 SELECT REGEXP SUBSTR 变量 1 LEVEL FROM DUAL CONNECT BY REGEX
  • element-ui的分页如何实现

    element ui的分页如何实现 表格需要绑定的属性
  • mysql 中enum用法

    enum最大长度65535 也就是可以存65535个预定义值 enum底层存的是十进制整数 严格按顺序1 2 3 4 5 排列 固千万不要用enum来存数字 用例 一件商品从付款到收货的流程的5个流程 未付款 已付款 已发货 已送达 已收货
  • Prometheus(三)Grafana部署及部署告警

    文章目录 一 Grafana部署及模板展示 1 Grafan部署步骤 二 打标签 1 重新打标定义 在job上定义 2 relabel config 重新打标配置 三 prometheus告警功能 1 告警功能概述 2 告警规则 3 通知告
  • 定时器使用总结

    gd32定时器使用总结 本次项目中较多模块使用了定时器 对定时器的不同使用方法进行总结补充 模块一 回充红外 通过定时器的计数器模块记录红外发射出来的脉冲宽度 void ir timer init uint16 t prescaler ui
  • 数据仓库与数据挖掘课后思考题整理

    数据仓库与数据挖掘课后思考题整理 文章目录 数据仓库与数据挖掘课后思考题整理 1 数据仓库概述 思考题 2 数据仓库及其设计 思考题 实践题 3 OLAP技术 思考题 课后书面作业 4 数据挖掘概述 思考题 5 关联分析 思考题 实践题 7
  • mysql:Error executing row event: ‘Table ‘hk_db.jf_share_task_item‘ doesn‘t exist‘

    场景 在主从同步的时候报错 这种情况 1 确实这个表不存在 2 在hk db这个库的目录下 缺失了这张表的 frm文件 或者 idb文件 cd xx hk db ll grep jf share task item rw r 1 mysql
  • YOLO(You Only Look Once)算法详解+NMS算法

    https blog csdn net u014380165 article details 72616238 NMS算法 https blog csdn net shuzfan article details 52711706
  • USB_HID协议基础

    目录 一 HID类设备相关概念 1 USB HID名词解释 2 HID类设备数据传输特性
  • 深度学习优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)

    作者丨ycszen 来源 https zhuanlan zhihu com p 22252270 编辑丨极市平台 导读 本文仅对一些常见的优化方法进行直观介绍和简单的比较 前言 本文仅对一些常见的优化方法进行直观介绍和简单的比较 各种优化方
  • SpringBoot 自动配置原理详解

    自动配置类原理 一些公用或通用性的类或第三方的配置类 不需要每个项目都重复的编写 将他们抽取成自动配置类 使用的时候只需要引入即可 代码实现 public class A14 public static void main String a
  • 计算机三四级网络技术,全国计算机等级考试四级网络技术论述题真题3

    1 2003年 网络安全策略设计的重要内容之一是 确定当网络安全受到威胁时应采取的应急措施 当我们发现网络受到非法侵入与攻击时 所能采取的行动方案基本上有两种 保护方式与跟踪方式 请根据你对网络安全方面知识的了解 讨论以下几个问题 1 当网
  • table完成动态表头与动态数据