草庐IT

element-UI table动态增加列,动态增加行,动态合并行。选择编辑表头、行数据

@Carl 2023-06-08 原文

文章目录

主要内容

项目使用vue+element-UI实现
基础表格 element-ui官网查看。项目基于基础表格扩展了动态添加行、列。表头、行内数据动态编辑、选择、修改。还涉及到了动态添加行时,行动态合并。其中还运用到了 v-contextmenu. 插件,方便用户右键操作。

表格效果

7月1日

表格代码

<el-table :data="tableData"
                border
                :row-style="{fontSize:'1.25rem'}"
                :header-cell-style="{fontSize:'1.25rem'}"
                style="width:100%;"
                @header-contextmenu="headerContextmenu"
                @row-contextmenu="rowContextmenu"
                @cell-click="cellClick"
                :span-method="objectSpanMethod">
        <el-table-column v-for="(headerItem, headerIndex) in paramsHeader"
                         :key="headerIndex"
                         :index="headerIndex"
                         type="params">
			 <!-- 列,表头数据 -->
          <template slot="header">
            <span class="action-class"
                  @click='headerClick(headerItem,headerIndex)'>
              {{headerItem.header}}
            </span>
             <!-- 列,右键菜单数据选择-->
            <vue-context-menu :contextMenuData="paramsContextMenuData"
                              :transferIndex="paramsTransferIndex"
                              @addColumn="addParamsColumn(headerItem, headerIndex)"
                              @deleteColumn="deleteParamsColumn(headerItem, headerIndex)"></vue-context-menu>
          </template>
          
           <!-- 行数据-->
          <template slot-scope="scope">
            <span class="params-class">
              {{scope.row.params[headerIndex].name}}
            </span>
             <!-- 行,右键菜单数据选择-->
            <vue-context-menu :contextMenuData="paramsValueContextMenuData"
                              :transferIndex="paramsValueTransferIndex"
                              @clear="clearParamsRow(headerItem, headerIndex)"
                              @addRow="addParamsRow(headerItem, headerIndex)"
                              @deleteRow="deleteParamsRow(headerItem, headerIndex)"></vue-context-menu>
          </template>
        </el-table-column>

      </el-table>

数据格式需要

文章中部分数据定义未展示,请自行添加定义

表格数据格式

数据格式只适合本表格,如有优化请自行更改。数据中 id 用于行合并,请不要忽视

tableData: [
        {
          params: [
            {
              id: Math.random(),
              name: '无'
            }, {
              id: Math.random(),
              name: '无'
            }
          ]
        }, {
          params: [
            {
              id: Math.random(),
              name: '无'
            }, {
              id: Math.random(),
              name: '无'
            }
          ]
        }
      ],
      

右键菜单数据格式

菜单用于动态添加列,动态添加行。请自行修改

paramsContextMenuData: {
        // the contextmenu name(@1.4.1 updated)
        menuName: 'paramsHeader',
        // The coordinates of the display(菜单显示的位置)
        axis: {
          x: null,
          y: null
        },
        // Menu options (菜单选项)
        menulists: [{
          fnHandler: 'addColumn', // Binding events(绑定事件)
          icoName: 'el-icon-plus',
          btnName: '添加条件列' // The name of the menu option (菜单名称)
        }, {
          fnHandler: 'deleteColumn',
          icoName: 'el-icon-delete',
          btnName: '删除条件列'
        }]
      },

实现方法

表格右键点击菜单事件

用于获取 列index,行index 和展示右键菜单弹出位置。index主要用于动态增加行和列

headerContextmenu (column, event) {
      console.log(column)
      this.paramsTransferIndex = column.index
      event.preventDefault()
      var x = event.clientX
      var y = event.clientY
      if (column.type === 'params') {
        this.paramsContextMenuData.axis = {
          x, y
        }
      } else {
        this.valuationContextMenuData.axis = {
          x, y
        }
      }
    },
    
rowContextmenu (row, column, event) {
      this.paramsValueTransferIndex = column.index
      this.rowIndex = row.index
      this.columnIndex = column.index
      event.preventDefault()
      var x = event.clientX
      var y = event.clientY
      if (column.type === 'params') {
        this.paramsValueContextMenuData.axis = {
          x, y
        }
      } else {
      }
    },

表格单击事件

单击事件主要用于给表头或行赋值数据。可多种选择,作者用的是单击弹出弹框选择数据给行赋值。
表头点击事件没有用element-ui自带的事件,也可用,自行修改

// 表头点击事件
headerClick (headerItem, headerIndex) {
      this.paDialogVisible = true
      this.paramsIndex = headerIndex
    },
// 行点击事件
cellClick (row, column, cell, event) {
      this.rowIndex = row.index
      this.columnIndex = column.index
      if (column.type === 'params') {
        this.conDialogVisible = true
      }
    },

动态添加行、列

// 添加列
    addParamsColumn (headerItem, headerIndex) {
      // 添加列
      this.paramsHeader.push(
        {
          header: '请选择参数或变量'
        }
      )
      // 同时添加行
      this.paramsHeader.forEach((header, headerIdnex) => {
        this.decisionTableData.forEach((deci, deciIndex) => {
          deci.params.push({
            id: Math.random(),
            name: '无'
          })
        })
      })
    },
    // 添加行
    addParamsRow (headerItem, headerIndex) {
      this.decisionLoading = true
      var paramsData = []
      var valuation = []
      if (headerIndex === 0) {
        this.paramsHeader.forEach(el => {
          paramsData.push({
            id: Math.random(),
            name: '无'
          })
        })
        this.valuationHeader.forEach(va => {
          valuation.push({
            value: '无'
          })
        })
        this.decisionTableData.push({
          params: paramsData,
          valuation: valuation
        })
      } else {
        var id = null
        var numIn = headerIndex - 1
        if (numIn > 0) {
          for (var i = 0; i < this.paramsHeader.length; i++) {
            if (i <= numIn) {
              for (var n = 0; n <= numIn; n++) {
                id = this.decisionTableData[this.rowIndex].params[n].id
                if (i === n) {
                  paramsData.push({
                    id: id,
                    name: '无'
                  })
                }
              }
            } else {
              paramsData.push({
                id: Math.random(),
                name: '无',
                value: '无'
              })
            }
          }
          this.valuationHeader.forEach(va => {
            valuation.push({
              value: '无'
            })
          })
          this.decisionTableData.splice(this.rowIndex, 0, {
            params: paramsData,
            valuation: valuation
          })
        } else {
          id = this.decisionTableData[this.rowIndex].params[numIn].id
          this.paramsHeader.forEach((el, index) => {
            if (numIn === index) {
              paramsData.push({
                id: id,
                name: '无',
                value: '无'
              })
            } else {
              paramsData.push({
                id: Math.random(),
                name: '无',
                value: '无'
              })
            }
          })
          this.valuationHeader.forEach(va => {
            valuation.push({
              value: '无'
            })
          })
          this.decisionTableData.splice(this.rowIndex, 0, {
            params: paramsData,
            valuation: valuation
          })
        }
      }
      this.rowspan(this.decisionTableData)
    },

表格每行单击事件

valueAcTyClick (item, dropdown, droIndex, headerIndex, scopeIndex) {
      console.log(dropdown)
      this.decisionLoading = true
      this.columnIndex = headerIndex
      this.rowIndex = scopeIndex
      if (dropdown.value === 'Input') {
        this.vaDialogVisible = true
        this.valuationType = dropdown.value
        this.valuationTitle = '输入值'
      } else if (dropdown.value === 'Parameter') {
        this.vaDialogVisible = true
        this.valuationType = dropdown.value
        this.valuationTitle = '选择变量'
      } else {
        // 清控单元格数据
        var clearIndex = this.decisionTableData.indexOf(item)
        this.decisionTableData[clearIndex].valuation[headerIndex].value = '无'
        this.decisionLoading = false
      }

行合并事件

根据每行id进行合并

objectSpanMethod ({ row, column, rowIndex, columnIndex }) {
      // 表格合并行
      for (var i = 0; i < this.spanArr.length; i++) {
        var rowNum = this.spanArr[i].rowNum
        var columNum = this.spanArr[i].columNum
        var mergeNum = this.spanArr[i].mergeNum
        if (columnIndex === columNum) {
          if (rowIndex === rowNum) {
            return {
              rowspan: mergeNum,
              colspan: 1
            }
          } else {
            if (rowIndex !== 0 && rowIndex <= (rowNum + mergeNum - 1)) {
              return {
                rowspan: 0,
                colspan: 0
              }
            }
          }
        }
      }

      // })
    },

引用

v-contextmenu
element-ui

有关element-UI table动态增加列,动态增加行,动态合并行。选择编辑表头、行数据的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  3. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  4. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

  5. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  6. ruby - 在 Ruby 中动态创建数组 - 2

    有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.

  7. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  8. Ruby 哈希直接访问与合并 - 2

    有什么区别:@attr[:field]=new_value和@attr.merge(:field=>new_value) 最佳答案 如果您使用的是merge!而不是merge,则没有区别。唯一的区别是您可以在合并参数中使用多个字段(意思是:另一个散列)。例子:h1={"a"=>100,"b"=>200}h2={"b"=>254,"c"=>300}h3=h1.merge(h2)putsh1#=>{"a"=>100,"b"=>200}putsh3#=>{"a"=>100,"b"=>254,"c"=>300}h1.merge!(h2)pu

  9. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

  10. ruby-on-rails - Rails 单选按钮 - 模型中多列的一种选择 - 2

    我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模

随机推荐