vue+render+jsx实现可编辑动态多级表头table的实例代码


Posted in Javascript onApril 01, 2020

最近项目需要实现可编辑的动态多级表头表格,看了两天的文章,始终没有找到我想要的效果,在了解了render+jsx的基础用法后,自己基于element-ui封装了一个,数据格式参考element-ui table的数据。实现如下:

1.scoresTable

<script>
  import scoresColumn from "./scoresColumn";
  export default {
    components: {
      scoresColumn
    },
    render: function(h) {
      return <div className="table-control">
        <el-table ref="table"
             size="small"
             {...{attrs: {data:this.tableData}}}
             border
        >
          {
            this.tableTitles.map(title => {
              return <scoresColumn on-dataChange={this.dataChange} {...{attrs: {column:title,unitScores: this.unitScores}}}></scoresColumn>
            })
          }

        </el-table>
      </div>;
    },
    props: {
      tableTitles: {
        type: Array,
        default: () => []
      },
      tableData: {
        type: Array,
        default: () => []
      },
      unitScores: {
        type: Object,
        default: () => {}
      }
    },
    methods: {
      dataChange(id) {
        this.$emit('dataChange', id);
      }
    },
  }
</script>
<style>
 .el-table th, .el-table td {
  text-align: center;
 }
</style>

2.scoresColumn

<script>
  export default {
    data() {
     return {
       style: {
         'min-width': "70",
         'resizable': true,
         'show-overflow-tooltip': true
       },
     }
    },
    props: {
     column: {
       type: Object
     },
     unitScores: {
       type: Object,
       default: () => {}
     }
    },
    name: "scoresColumn",
    render: function (h) {
      let scopedSlots = {
        default: (scope) => {
          let col = scope.column.property;
          let value = scope.row[col];
          return <div id={col+scope.$index} >
            <p onClick={this.clickHandle}>{value}</p>
          </div>;
        }
      };
      if (this.column.children === undefined)
        if (this.column.label == '序号' || this.column.label == '姓名') {
          return <el-table-column fixed
            {...{style: this.style, scopedSlots: {
                default: (scope) => {
                  let value = scope.row[scope.column.property];
                  return <p>{value}</p>;
                }
              }}}
            prop={this.column.prop} label={this.column.label}>
          </el-table-column>
        }else {
          return <el-table-column
             {...{style: this.style, scopedSlots: {
                default: (scope) => {
                  let value = scope.row[scope.column.property];
                  if (/\((?=\d)|(^总计$)/g.test(this.column.label)) {
                    let col = scope.column.property;
                    return <div id={col+scope.$index} >
                      <p onClick={this.clickHandle}>{value}</p>
                     </div>;
                  }else return <p>{value}</p>;
                }
               }}}
             prop={this.column.prop} label={this.column.label}>
          </el-table-column>
        }
      let buildTitles = (childList) => {
        let children = [];
        childList.map(child => {
          if (child.children != undefined && child.children.length > 0) {
            children.push(<el-table-column {...{style: this.style}} label={child.label}>
              {buildTitles(child.children)}
            </el-table-column>)
          } else {
            children.push(
              <el-table-column {...{style: this.style, scopedSlots: scopedSlots}}
                       label={child.label} prop={child.prop}>
              </el-table-column>)
          }
        });
        return children;
      };
      return <el-table-column
        {...{style: this.style}}
        label={this.column.label}
        prop={this.column.prop}>
        {buildTitles(this.column.children)}
      </el-table-column>;
    },
    methods: {
      blurHandler(e) {
        let parent = e.target.parentNode;
        let child = parent.firstElementChild;
        let p = document.createElement('p');
        let value = child.value.match(/^\d*(\.{1}\d+)?/)[0];
        if (value == '' || value == null) {
          value = 0;
        }
        p.innerHTML = value;
        p.addEventListener('click', this.clickHandle, false);
        child.replaceWith(p);
        this.$emit('dataChange', parent.id);
      },
      clickHandle(e) {
        let parent = e.target.parentNode;
        let child = parent.firstElementChild;
        let input = document.createElement('input');
        input.style.lineHeight = '23px';
        input.style.textAlign = 'center';
        input.style.fontSize = '12px';
        input.style.height = '23px'
        input.style.width = '100%';
        input.value = child.innerHTML;
        input.addEventListener('blur', this.blurHandler, true);
        input.addEventListener('keyup', this.keyUpHandler, false);
        child.replaceWith(input);
        input.focus();
      },
      keyUpHandler(e) {
        let input = e.target;
        let parent = input.parentNode;
        let property = parent.id.replace(/\d/g, '');
        let value = input.value.replace(/[^\d\.]/g,'');
        if (Math.min(this.unitScores[property],value) != value) {
          value = this.unitScores[property];
        }
        input.value = value;
      }
    }
  }
</script>
<style scoped>
</style>

3.实现效果

vue+render+jsx实现可编辑动态多级表头table的实例代码
vue+render+jsx实现可编辑动态多级表头table的实例代码

总结

到此这篇关于vue+render+jsx实现可编辑动态多级表头table的文章就介绍到这了,更多相关vue render jsx 多级表头table内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jQuery 可以拖动的div实现代码 脚本之家修正版
Jun 26 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
Jan 08 Javascript
jquery 判断滚动条到达了底部和顶端的方法
Apr 02 Javascript
jquery中map函数与each函数的区别实例介绍
Jun 23 Javascript
jQuery实现表格展开与折叠的方法
May 04 Javascript
Angular的Bootstrap(引导)和Compiler(编译)机制
Jun 20 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
Aug 24 Javascript
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
Feb 09 Javascript
Bootstrap模态框插入视频的实现代码
Jun 25 Javascript
Vue render函数实战之实现tabs选项卡组件
Apr 22 Javascript
el-select 下拉框多选实现全选的实现
Aug 02 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
Mar 16 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
Mar 31 #Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
Mar 31 #Javascript
Vue-router 报错NavigationDuplicated的解决方法
Mar 31 #Javascript
js实现整体缩放页面适配移动端
Mar 31 #Javascript
react国际化化插件react-i18n-auto使用详解
Mar 31 #Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
Mar 31 #Javascript
功能完善的小程序日历组件的实现
Mar 31 #Javascript
You might like
discuz authcode 经典php加密解密函数解析
2020/07/12 PHP
php漏洞之跨网站请求伪造与防止伪造方法
2013/08/15 PHP
PHP根据两点间的经纬度计算距离
2014/10/31 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
JS+XML 省份和城市之间的联动实现代码
2009/10/14 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
jquery Validation表单验证使用详解
2020/09/12 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
详谈$.data()的用法和作用
2017/02/13 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
微信小程序视图控件与bindtap之间的问题的解决
2019/04/08 Javascript
vue 动态添加class,三个以上的条件做判断方式
2020/11/02 Javascript
修改NPM全局模式的默认安装路径的方法
2020/12/15 Javascript
Python根据区号生成手机号码的方法
2015/07/08 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
Centos下实现安装Python3.6和Python2共存
2018/08/15 Python
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
TensorBoard 计算图的查看方式
2020/02/15 Python
Keras之fit_generator与train_on_batch用法
2020/06/17 Python
python中sys模块是做什么用的
2020/08/16 Python
Crucial英睿达法国官网:内存条及SSD固态硬盘升级
2018/07/13 全球购物
包装类的功能、种类、常用方法
2012/01/27 面试题
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
大学军训感言600字
2014/02/25 职场文书
松材线虫病防治方案
2014/06/15 职场文书
药品营销策划方案
2014/06/15 职场文书
无刑事犯罪记录证明范本
2014/09/29 职场文书
保管员岗位职责
2015/02/14 职场文书
2016关于学习党章的心得体会
2016/01/15 职场文书
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python
java版 简单三子棋游戏
2022/05/04 Java/Android