Material UI is a Material Design library made for React.
It’s a set of React components that have Material Design styles.
In this article, we’ll look at how to add tables with Material UI.
Customized Tables
We can customize the styling of table components with the withStyles
function.
For example, we can write:
import React from "react";
import { withStyles } from "@material-ui/core/styles";
import Table from "@material-ui/core/Table";
import TableBody from "@material-ui/core/TableBody";
import TableCell from "@material-ui/core/TableCell";
import TableContainer from "@material-ui/core/TableContainer";
import TableHead from "@material-ui/core/TableHead";
import TableRow from "@material-ui/core/TableRow";
import Paper from "@material-ui/core/Paper";
const StyledTableCell = withStyles(theme => ({
head: {
backgroundColor: theme.palette.common.black,
color: theme.palette.common.white
},
body: {
fontSize: 12
}
}))(TableCell);
const StyledTableRow = withStyles(theme => ({
root: {
"&:nth-of-type(odd)": {
backgroundColor: theme.palette.action.hover
}
}
}))(TableRow);
function createData(name, age) {
return { name, age };
}
const rows = [createData("james", 15), createData("mary", 23)];
export default function App() {
return (
<TableContainer component={Paper}>
<Table>
<TableHead>
<TableRow>
<StyledTableCell>name</StyledTableCell>
<StyledTableCell align="right">age</StyledTableCell>
</TableRow>
</TableHead>
<TableBody>
{rows.map(row => (
<StyledTableRow key={row.name}>
<StyledTableCell component="th" scope="row">
{row.name}
</StyledTableCell>
<StyledTableCell align="right">{row.age}</StyledTableCell>
</StyledTableRow>
))}
</TableBody>
</Table>
</TableContainer>
);
}
We created our own table cell and table row components.
All we did is pass all the styles into the withStyles
function.
Then we put them all in the App
component.
Fixed Header
We can make the header fixed with the stickyHeader
prop.
For example, we can write:
import React from "react";
import Table from "@material-ui/core/Table";
import TableBody from "@material-ui/core/TableBody";
import TableCell from "@material-ui/core/TableCell";
import TableContainer from "@material-ui/core/TableContainer";
import TableHead from "@material-ui/core/TableHead";
import TableRow from "@material-ui/core/TableRow";
import Paper from "@material-ui/core/Paper";
import { makeStyles } from "@material-ui/core/styles";
const useStyles = makeStyles({
container: {
maxHeight: 200
}
});
function createData(name, age) {
return { name, age };
}
const rows = [
createData("james", 15),
createData("mary", 15),
createData("alex", 15),
createData("may", 15),
createData("sam", 15),
createData("john", 15),
createData("mary", 23)
];
export default function App() {
const classes = useStyles();
return (
<TableContainer component={Paper} className={classes.container}>
<Table stickyHeader>
<TableHead>
<TableRow>
<TableCell>name</TableCell>
<TableCell align="right">age</TableCell>
</TableRow>
</TableHead>
<TableBody>
{rows.map(row => (
<TableRow key={row.name}>
<TableCell component="th" scope="row">
{row.name}
</TableCell>
<TableCell align="right">{row.age}</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</TableContainer>
);
}
We have the makeStyles
function to style the table with the height.
This way, we get a sticky header.
Then we create the rows for the table.
And then to make the table sticky we have the stickyHeader
prop for the Table
.
Now when we scroll the content, we’ll see the header stay on top.
Collapsible Table
We can make a table with a collapsible column table with the TableRow
component.
Inside it, we add our TableCell
with the Collapse
component inside it.
To do that, we can write:
import React from "react";
import PropTypes from "prop-types";
import { makeStyles } from "@material-ui/core/styles";
import Box from "@material-ui/core/Box";
import Collapse from "@material-ui/core/Collapse";
import IconButton from "@material-ui/core/IconButton";
import Table from "@material-ui/core/Table";
import TableBody from "@material-ui/core/TableBody";
import TableCell from "@material-ui/core/TableCell";
import TableContainer from "@material-ui/core/TableContainer";
import TableHead from "@material-ui/core/TableHead";
import TableRow from "@material-ui/core/TableRow";
import Typography from "@material-ui/core/Typography";
import Paper from "@material-ui/core/Paper";
import KeyboardArrowDownIcon from "@material-ui/icons/KeyboardArrowDown";
import KeyboardArrowUpIcon from "@material-ui/icons/KeyboardArrowUp";
function createData(name, age, history) {
return { name, age, history };
}
const rows = [createData("james", 15, [{ date: "2020-01-01" }])];
function Row(props) {
const { row } = props;
const [open, setOpen] = React.useState(false);
return (
<React.Fragment>
<TableRow>
<TableCell>
<IconButton
aria-label="expand row"
size="small"
onClick={() => setOpen(!open)}
>
{open ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />}
</IconButton>
</TableCell>
<TableCell component="th" scope="row">
{row.name}
</TableCell>
<TableCell>{row.age}</TableCell>
</TableRow>
<TableRow>
<TableCell style={{ paddingBottom: 0, paddingTop: 0 }} colSpan={6}>
<Collapse in={open} timeout="auto" unmountOnExit>
<Box margin={1}>
<Typography variant="h6" gutterBottom component="div">
History
</Typography>
<Table size="small">
<TableHead>
<TableRow>
<TableCell>Date</TableCell>
</TableRow>
</TableHead>
<TableBody>
{row.history.map(historyRow => (
<TableRow key={historyRow.date}>
<TableCell component="th" scope="row">
{historyRow.date}
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</Box>
</Collapse>
</TableCell>
</TableRow>
</React.Fragment>
);
}
export default function App() {
return (
<TableContainer component={Paper}>
<Table>
<TableHead>
<TableRow>
<TableCell />
<TableCell>name</TableCell>
<TableCell>age</TableCell>
</TableRow>
</TableHead>
<TableBody>
{rows.map(row => (
<Row key={row.name} row={row} />
))}
</TableBody>
</Table>
</TableContainer>
);
}
We created a Row
component and then TableCell
.
Inside it, we have the Collapse
component that we can click to toggle a table on or off.
And inside that, we have a Table
with more stuff inside it.
Conclusion
We can add table components with customized styles.
Also, we have can make a table with another table nested inside that we can expand or collapse.
One reply on “Material UI — Customize Tables”
Hi. A good example of using styles. How do you do it in a theme. Using createTheme to customize fontSize text color etc.