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 相关文章推荐
javascript如何使用bind指定接收者
May 04 Javascript
让IE8浏览器支持function.bind()方法
Oct 16 Javascript
js ajaxfileupload.js上传报错的解决方法
May 05 Javascript
BootStrap使用file-input插件上传图片的方法
Sep 05 Javascript
WdatePicker.js时间日期插件的使用方法
Jul 26 Javascript
ES6解构赋值的功能与用途实例分析
Oct 31 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
Jan 08 Javascript
vue实现验证码按钮倒计时功能
Apr 10 Javascript
vue-cli脚手架的安装教程图解
Sep 02 Javascript
Vue实现移动端页面切换效果【推荐】
Nov 13 Javascript
layui实现下拉框三级联动
Jul 26 Javascript
微信小程序如何获取用户头像和昵称
Sep 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执行linux系统命令的常用函数使用说明
2010/04/27 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
创建无限极分类树型结构的简单方法
2017/06/20 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
2018/05/29 PHP
javascript 数字格式化输出的实现代码
2013/12/10 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
JS判断浏览器是否支持某一个CSS3属性的方法
2014/10/17 Javascript
Bootstrap开发实战之响应式轮播图
2016/06/02 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
node+koa2+mysql+bootstrap搭建一个前端论坛
2018/05/06 Javascript
js input输入百分号保存数据库失败的解决方法
2018/05/26 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
vue+iview实现分页及查询功能
2020/11/17 Vue.js
全面解析Vue中的$nextTick
2020/12/24 Vue.js
Python的Twisted框架中使用Deferred对象来管理回调函数
2016/05/25 Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
2017/03/24 Python
Pycharm 创建 Django admin 用户名和密码的实例
2018/05/30 Python
numpy linalg模块的具体使用方法
2019/05/26 Python
详解使用Python下载文件的几种方法
2019/10/13 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
Pytest单元测试框架如何实现参数化
2020/09/05 Python
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
加拿大约会网站:EliteSingles.ca
2018/01/12 全球购物
产品设计开发计划书
2014/05/07 职场文书
社区党建工作方案
2014/06/10 职场文书
印刷技术专业自荐信
2014/09/18 职场文书
初中中等生评语
2014/12/29 职场文书
孔庙导游词
2015/02/04 职场文书
湘江北去观后感
2015/06/15 职场文书
教师节简报
2015/07/20 职场文书
JavaScript中isPrototypeOf函数
2021/11/07 Javascript