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 相关文章推荐
js防止DIV布局滚动时闪动的解决方法
Oct 30 Javascript
AngularJS仿苹果滑屏删除控件
Jan 18 Javascript
原生js获取元素样式的简单方法
Aug 06 Javascript
ES6中的数组扩展方法
Aug 26 Javascript
使用开源工具制作网页验证码的方法
Oct 17 Javascript
js实现按座位号抽奖
Apr 05 Javascript
js编写选项卡效果
May 23 Javascript
Vue如何从1.0迁移到2.0
Oct 19 Javascript
浅谈react性能优化的方法
Sep 05 Javascript
微信二次分享报错invalid signature问题及解决方法
Apr 01 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
Aug 20 Javascript
js实现验证码干扰(动态)
Feb 23 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
用PHP将数据导入到Foxmail
2006/10/09 PHP
Email+URL的判断和自动转换函数
2006/10/09 PHP
整理的一些实用WordPress后台MySQL操作命令
2013/01/07 PHP
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
php实现微信公众号主动推送消息
2015/12/31 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
JQuery从头学起第二讲
2010/07/04 Javascript
解决IE6的PNG透明JS插件使用介绍
2013/04/17 Javascript
基于JavaScript自定义构造函数的详解说明
2013/04/24 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
js随机生成网页背景颜色的方法
2015/02/26 Javascript
js定义类的几种方法(推荐)
2016/06/08 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
jQuery使用方法
2017/02/04 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
Nodejs对postgresql基本操作的封装方法
2019/02/20 NodeJs
Python学习笔记之While循环用法分析
2019/08/14 Python
Flask框架学习笔记之模板操作实例详解
2019/08/15 Python
提高python代码运行效率的一些建议
2020/09/29 Python
python实现一个简单RPC框架的示例
2020/10/28 Python
python爬取招聘要求等信息实例
2020/11/20 Python
python的setattr函数实例用法
2020/12/16 Python
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
2016/12/06 HTML / CSS
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
VELTRA台湾:世界自由行专家
2017/08/15 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
公共事业管理本科生求职信
2013/10/07 职场文书
国际商务系学生个人的自我评价
2013/11/26 职场文书
会计学生自我鉴定
2014/02/06 职场文书
文案策划专业自荐信
2014/07/07 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
观后感格式
2015/06/19 职场文书
2016年教师节感言
2015/12/09 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python