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模板来展现json数据的代码
Oct 22 Javascript
jquery插件之定时查询待处理任务数量
May 01 Javascript
纯javascript代码实现计算器功能(三种方法)
Sep 07 Javascript
js实现的下拉框二级联动效果
Apr 30 Javascript
Javascript动画效果(1)
Oct 11 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
Mar 23 jQuery
详解vue服务端渲染(SSR)初探
Jun 19 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
Jul 10 Javascript
老生常谈js中的MVC
Jul 25 Javascript
小程序关于请求同步的总结
May 05 Javascript
深入理解 TypeScript Reflect Metadata
Dec 12 Javascript
Vue 电商后台管理项目阶段性总结(推荐)
Aug 22 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
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
PHP取二进制文件头快速判断文件类型的实现代码
2013/08/05 PHP
php命令行用法入门实例教程
2014/10/27 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
jquery 新手学习常见问题解决方法
2010/04/18 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
详解jquery uploadify 上传文件
2013/11/09 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
JavaScript将一个数组插入到另一个数组的方法
2015/03/19 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
Vue动态生成表格的行和列
2019/07/18 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
[02:20]DOTA2英雄基础教程 黑暗贤者
2013/12/19 DOTA
python self,cls,decorator的理解
2009/07/13 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
学习Python爬虫的几点建议
2020/08/05 Python
Django url 路由匹配过程详解
2021/01/22 Python
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
Oracle性能调优原则
2012/05/03 面试题
饭店工作计划书
2014/01/10 职场文书
和平主题的演讲稿
2014/01/12 职场文书
幼师自我鉴定
2014/02/01 职场文书
业务员简历自我评价
2014/03/06 职场文书
日化店促销方案
2014/03/26 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
优秀高中学生评语
2014/12/30 职场文书
导游词之五台山
2019/10/11 职场文书
sql查询结果列拼接成逗号分隔的字符串方法
2021/05/25 SQL Server
HTML中的表单元素介绍
2022/02/28 HTML / CSS
angular异步验证器防抖实例详解
2022/03/31 Javascript