教程:

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 (
<div>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons"></link> 注意,这个标签必须在<MaterialTable>标签旁引用
<MaterialTable>
...
</MaterialTable>
</div>
);
}
}

具体使用见:

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 (
<TableCell padding="none" key="key-selection-column" style={{ width: 48 }}>
{/* use createMuiTheme & MuiThemeProvider to change the style of tablebody_checkbox */}
<MuiThemeProvider theme={myTheme}>
<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)}
style={{
paddingLeft: 12 + this.props.level * 20,
}}
/>
</MuiThemeProvider>
</TableCell>
);
}
} class MyTableHeader extends MTableHeader{
renderSelectionHeader() {
return (
<TableCell
padding="none"
key="key-selection-column"
style={this.props.headerStyle}
>
{/* use createMuiTheme & MuiThemeProvider to change the style of tableheader_checkbox */}
<MuiThemeProvider theme={myTheme}>
<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)}
/>
</MuiThemeProvider>
</TableCell>
);
}
} // 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表格组件】material-table 基本用法 & 组件override的更多相关文章

  1. 基于React Native的Material Design风格的组件库 MRN

    基于React Native的Material Design风格的组件库.(为了平台统一体验,目前只打算支持安卓) 官方网站 http://mrn.js.org/ Github https://git ...

  2. Griddle, griddle-react 一个REACT 表格组件

    Griddle, griddle-react 一个REACT 表格组件: http://griddlegriddle.github.io/Griddle/index.html

  3. Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件

    封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...

  4. Bootstrap表格组件 Bootstrap Table

    Bootstrap Table是Bootstrap的一个组件 Bootstrap Table Demo:http://issues.wenzhixin.net.cn/bootstrap-table/i ...

  5. react第七单元(组件的高级用法-组件的组合(children的用法)-高阶组件-封装组件)

    第七单元(组件的高级用法-组件的组合(children的用法)-高阶组件-封装组件) #受控组件 简而言之,就是受到状态state控制的表单,表单的值改变则state值也改变,受控组件必须要搭配onc ...

  6. react初探(二)之父子组件通信、封装公共组件

    一.前言 在组件方面react和Vue一样的,核心思想玩的就是组件,下面举两个组件常用的情景. 场景一:假如我们现在有一个页面包含表格以及多个弹框,这种时候如果将这个页面的业务代码写在一个组件中,那么 ...

  7. Bootstrap Blazor 组件介绍 Table (二)自定义模板列功能介绍

    Bootstrap Blazor 是一套企业级 UI 组件库,适配移动端支持各种主流浏览器,已经在多个交付项目中使用.通过本套组件可以大大缩短开发周期,节约开发成本.目前已经开发.封装了 70 多个组 ...

  8. 【共享单车】—— React后台管理系统开发手记:UI菜单各个组件使用(Andt UI组件)

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  9. 链接进入react二级路由,引发的子组件二次挂载

    这个问题很怪,我两个二级路由从链接进入的时候,会挂载两次子组件. 从链接进入,是因为新页面在新标签页打开的. 有子组件是因为公共组件提取 同样的操作,有一些简单的二级路由页面,就不会挂载两次. 讲道理 ...

随机推荐

  1. ubuntu时钟不显示的解决方法

    原文链接:http://muzi.info/articles/529.html 有时候我们会看到我们电脑的状态栏那里并没有显示时间,一个原因是日期时间指示器没有工作,另一个可能的原因是用户禁用了时间显 ...

  2. 坑爹的A标签 href

    A标签 href在与click事件同时响应时,如果click事件有提交表单动作,href会阻拦表单提交,解决 1.去掉href 2.href="javascript:void();" ...

  3. cocos2dx3.2升级Android5的坑

    虽然已经转到服务端,但是对客户端的事情,偶尔还看看.公司的游戏用的是cocos2dx 3.2的版本, 然而在Android 5 上却无法运行. 先是没有触摸事件. 在stackoverflow上看到, ...

  4. java web hello world(二)基于Servlet理解监听

    java web最开始实现是通过Servlet实现,这里就来实现下,最原始的监听是如何实现的. 第一步,创建一个基本的web项目 ,参见(java web hello world(一)) 第二步,we ...

  5. CSS——你所不知的 CSS ::before 和 ::after 伪元素用法(转)

    你所不知的 CSS ::before 和 ::after 伪元素用法 CSS 有两个说不上常用的伪类 :before 和 :after,偶尔会被人用来添加些自定义格式什么的,但是它们的功用不仅于此.前 ...

  6. Entity Framework(三):使用特性(数据注解)创建表结构

    一.理解Code First及其约定和配置 传统设计应用的方式都是由下而上的,即我们习惯优先考虑数据库,然后使用这个以数据为中心的方法在数据之上构建应用程序.这种方法非常适合于数据密集的应用或者数据库 ...

  7. 利用CSS生成精美细线Table表格

    精美的表格是前端开发用到的一个组件,很多时候我们利用复杂的页面style代码,来生成这样的表格,造成了页面的修改性和可读性都非常差.这里推荐直接使用css来产生一个细线表格. 使用方法也很简单: 第一 ...

  8. 【noip模拟题】挖掘机(模拟题+精度)

    这题直接模拟. 可是我挂在了最后两个点上QAQ.唯一注意的是注意精度啊...用来double后边转成整数就忘记用longlong...sad #include <cstdio> #incl ...

  9. Python 资料性网站。

    伯乐在线:http://blog.jobbole.com/category/python/ http://blog.chinaunix.net/uid/22334392/cid-24327-list- ...

  10. openstacksdk resource2 打印__dict__

    在一个继承resource2的实体里,打印self.__dict__结果是: {'_body': <openstack.resource2._ComponentManager object at ...