热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【react表格组件】material-table基本用法&组件override

教程:https:mbrn.github.iomaterial-table#https:material-ui.comapitablegithub:https:

教程:

https://mbrn.github.io/material-table/#/

https://material-ui.com/api/table/

github:

https://github.com/mbrn/material-table

 

material-table是使用material-ui实现的react表格组件

 

1、基本使用方法:在react项目中导入该组件直接使用

安装

npm install material-table --save

使用

import MaterialTable from 'material-table'

class APP extends Component{
    render(){
        return (
        
注意,这个标签必须在标签旁引用 ...
); } }

具体使用见:

https://www.npmjs.com/package/material-table

https://mbrn.github.io/material-table/#/

 

2、override组件

想要override material-table组件起因是因为material-table自带的toobar和checkbox是红色,并且没有提供修改这个样式的接口,而我想要改成蓝色。

方法就是首先到github上clone下来material-table源码:

https://github.com/mbrn/material-table

阅读material-table源码,发现material-table的实现原理是 MaterialTable类里面调用了MTableToolbar,MTableHeader,MTableBodyRow等类。

因此我们要修改material-table里的toobar和每一行的checkbox的话,所要做的工作:

首先就是继承MTableHeader、MTableBodyRow实现自己的MyMTableHeader、MyMTableBodyRow类,以实现MTableHeader、MTableBodyRow中checkbox颜色的修改;然后继承MaterialTable类实现自己的MyMaterialTable类;并在MyMaterialTable类中调用MTableToolbar、MyMTableHeader、MyMTableBodyRow类,如下黄底色部分:

(注:没有重写MTableToolbar是因为MTableToolbar使用了css in js,不需要override MTableToolbar就可以改变它的颜色,具体介绍见下面)

import React, { Component } from 'react';



import { withStyles } from '@material-ui/core/styles'; import MaterialTable from 'material-table'; import MTableToolbar from 'material-table/dist/m-table-toolbar'; import blue from '@material-ui/core/colors/blue'; import { createMuiTheme, MuiThemeProvider } from '@material-ui/core/styles' import { Checkbox, TableCell } from '@material-ui/core'; import MTableBodyRow from 'material-table/dist/m-table-body-row'; import MTableHeader from 'material-table/dist/m-table-header'; https://material-ui.com/customization/themes/ const myTheme = createMuiTheme({ palette: { secondary:{ main: '#017FCB', // main: blue[400], // light: blue[400],  }, }, typography:{ useNextVariants: true, }, }); // override MTableBodyRow to change the color of tablebody_checkbox class MyMTableBodyRow extends MTableBodyRow{ renderSelectionColumn() { return (  {/* use createMuiTheme & MuiThemeProvider to change the style of tablebody_checkbox */}  <Checkbox checked={this.props.data.tableData.checked === true} OnClick={(e) => e.stopPropagation()} value={this.props.data.tableData.id.toString()} OnChange={(event) => this.props.onRowSelected(event, this.props.path)} color: #000000;">{{ paddingLeft: 12 + this.props.level * 20, }} />    ); } } class MyTableHeader extends MTableHeader{ renderSelectionHeader() { return ( <TableCell padding="none" key="key-selection-column" color: #0000ff;">this.props.headerStyle} > {/* use createMuiTheme & MuiThemeProvider to change the style of tableheader_checkbox */}  <Checkbox indeterminate={this.props.selectedCount > 0 && this.props.selectedCount <this.props.dataCount} checked={this.props.selectedCount === this.props.dataCount} OnChange={(event, checked) => this.props.onAllSelected && this.props.onAllSelected(checked)} />    ); } } // override MaterialTable to change toolbar & tablebody_checkbox & tableheader_checkbox class MyMaterialTable extends MaterialTable{ getProps(props){ const calculatedProps=super.getProps(props); // use css in js to change style of toolbar // change the calculatedProps.components.Toolbar in MaterialTable. // read the source code of material-table to get the variable name to change  calculatedProps.components.Toolbar=withStyles(styles)(MTableToolbar); calculatedProps.components.Row=MyMTableBodyRow; calculatedProps.components.Header=MyTableHeader; return calculatedProps; } } // change the background color of toolbar const styles = theme => ({ root: { paddingRight: theme.spacing.unit }, highlight: theme.palette.type === 'light' ? { color: theme.palette.secondary.main, // backgroundColor: blue[100], backgroundColor: '#98D3F2', } : { color: theme.palette.text.primary, backgroundColor: theme.palette.secondary.dark }, spacer: { flex: '1 1 10%' }, actions: { color: theme.palette.text.secondary, }, title: { flex: '0 0 auto' }, searchField: { paddingLeft: theme.spacing.unit * 2 } }); export default MyMaterialTable;

 

 对于继承MTableHeader和MTableBodyRow并修改其中的checkbox的样式,我们采用material-ui提供的theme进行修改:

theme使用教程:

https://material-ui.com/customization/themes/

theme使用实例:

 

 对于不继承MTableToolbar,直接在MaterialTable中调用MTableToolbar时指定修改MTableToolbar的样式,我们使用css in js,见上面红字部分

个人认为通过withStyles()函数实现的css in js的优点:可以在子组件外部对子组件样式进行修改

css in js 优缺点:

看了这些框架后,可以发现CSS-in-JS的优势还是挺多的:

  • 因为有了生成的唯一class名称,避免了全局污染的问题
  • 唯一的class名称也解决了命名规则混乱的问题
  • Javascript和CSS之间可以变量共享,比如一些基础的颜色和尺寸,这样再当需要在Javascript里计算一些高度的时候,可以取到和dom相关的一些padding,margin数值,统一管理
  • 只生成页面需要用到的代码,缩减了最终包的大小,提升了性能
  • CSS的单元测试增加了样式重构的安全性

但是CSS-in-JS也存在着一些不足和争议:

  • 有些观点觉得JS和CSS的关系没这么近,把CSS写进JS里引入了新的一套依赖,增加了复杂度,新人加入项目后需要学习的东西就更多了,也让学习曲线更加陡了
  • 对前端框架确实有些依赖性,更适合于组件化的框架,如React等
  • Debug的时候需要花更多的功夫才能找到对应的样式代码
  • 覆盖第三方插件样式时会有权重不够的问题
  • Lint工具对于Javascript内部的CSS代码样式支持的还不够
作者:ThoughtWorks中国
链接:https://www.jianshu.com/p/cefd3ae73255
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

 

 注意调用父类方法的语法:

调用父类构造方法:

super();

调用父类一般方法:

super.fatherfunc();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(另推荐一个组件 docz)


推荐阅读
  • React 小白初入门
    推荐学习:React官方文档:https:react.docschina.orgReact菜鸟教程:https:www.runoob.c ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 随着前端技术的发展,越来越多的开发者开始使用react、vue等web框架,但很少有人深入理解这些框架的源码。然而,这些框架底层都是由原生的javascript构建而成。对于初学前端的人来说,可能会认为javascript很容易上手,但实际上只是因为它被高度封装了。与能够使用封装类的人相比,能够理解框架原理的人则处于另一个层面。本文将深入剖析jquery源码,探寻框架底层的原理,帮助读者更好地理解web框架的运行机制。 ... [详细]
  • CentOS7.8下编译muduo库找不到Boost库报错的解决方法
    本文介绍了在CentOS7.8下编译muduo库时出现找不到Boost库报错的问题,并提供了解决方法。文章详细介绍了从Github上下载muduo和muduo-tutorial源代码的步骤,并指导如何编译muduo库。最后,作者提供了陈硕老师的Github链接和muduo库的简介。 ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • RN即ReactNative基于React框架针对移动端的跨平台框架,在学习RN前建议最好熟悉下html,css,js,当然如果比较急,那就直接上手吧,毕竟用学习前面基础的时间,R ... [详细]
  • Sublime P4语法高亮设置
    Github插件链接:p4-syntax-highlighter首先安装PackageControl。进入Package界面,我的目录:U ... [详细]
  • ReactJSUIAnt设计空组件原文:https://w ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • 初始化初始化本地空版本库,仓库,英文名repositorymkdirtest&&cdtestgitinit克隆项目到本地gitclone远程同 ... [详细]
  • 先记住几个专用名词,如下:Workspace:工作区IndexStage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、新建代码库#在当前目录新建一个G ... [详细]
  • 修正我的GitHub commit 数据
    早晨上班,滴滴搭车里,我在掘金这个帖子看到大家晒自己的Github活跃记录,我也晒了下自己的记录。不过太少了。有遗漏的commits状况这也让我知道,自己觉得自己很忙的,实际上提交 ... [详细]
  • 这篇文章给大家介绍怎么从源码启动和编译IoTSharp ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。IoTSharp项目是 ... [详细]
  • npminstall-Dbabelcorebabelpreset-envbabelplugin-transform-runtimebabelpolyfillbabel-loader ... [详细]
author-avatar
妈妈的话CPC-8_645
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有