- Published on
Complete Guide to MUI (Material UI) for React
- Authors
- Name
- Yinhuan Yuan
Introduction
Material UI (now known as MUI) has become one of the most popular UI component libraries for React.
- 1. Installation and Setup
- 2. Basic Components
- 3. Layout Components
- 4. Navigation
- 5. Inputs
- 6. Data Display
- 7. Feedback Components
- 8. Surfaces
- 9. Theming
- 10. Advanced Usage
- Conclusion
1. Installation and Setup
Basic Installation
npm install @mui/material @emotion/react @emotion/styled
npm install @mui/icons-material
Basic Setup
// index.jsx
import React from 'react'
import { ThemeProvider } from '@mui/material/styles'
import CssBaseline from '@mui/material/CssBaseline'
import theme from './theme'
function App() {
return (
<ThemeProvider theme={theme}>
<CssBaseline />
{/* Your app content */}
</ThemeProvider>
)
}
2. Basic Components
Button
import Button from '@mui/material/Button';
// Variants
<Button variant="text">Text</Button>
<Button variant="contained">Contained</Button>
<Button variant="outlined">Outlined</Button>
// Colors
<Button color="primary">Primary</Button>
<Button color="secondary">Secondary</Button>
<Button color="error">Error</Button>
// Sizes
<Button size="small">Small</Button>
<Button size="medium">Medium</Button>
<Button size="large">Large</Button>
Typography
import Typography from '@mui/material/Typography';
<Typography variant="h1">h1 Heading</Typography>
<Typography variant="h2">h2 Heading</Typography>
<Typography variant="body1">Regular text</Typography>
<Typography variant="body2">Smaller text</Typography>
<Typography variant="button">Button text</Typography>
Icons
import HomeIcon from '@mui/icons-material/Home'
import IconButton from '@mui/material/IconButton'
;<IconButton>
<HomeIcon />
</IconButton>
3. Layout Components
Container
import Container from '@mui/material/Container'
;<Container maxWidth="sm">{/* Content */}</Container>
Grid
import Grid from '@mui/material/Grid'
;<Grid container spacing={2}>
<Grid item xs={12} md={6}>
{/* Content */}
</Grid>
<Grid item xs={12} md={6}>
{/* Content */}
</Grid>
</Grid>
Box
import Box from '@mui/material/Box'
;<Box
sx={{
p: 2,
display: 'flex',
flexDirection: 'column',
gap: 2,
}}
>
{/* Content */}
</Box>
Stack
import Stack from '@mui/material/Stack'
;<Stack spacing={2} direction="row">
<Button variant="text">Text</Button>
<Button variant="contained">Contained</Button>
<Button variant="outlined">Outlined</Button>
</Stack>
4. Navigation
AppBar and Toolbar
import AppBar from '@mui/material/AppBar'
import Toolbar from '@mui/material/Toolbar'
import Typography from '@mui/material/Typography'
;<AppBar position="static">
<Toolbar>
<Typography variant="h6">My App</Typography>
</Toolbar>
</AppBar>
Drawer
import Drawer from '@mui/material/Drawer'
import List from '@mui/material/List'
import ListItem from '@mui/material/ListItem'
;<Drawer variant="permanent" anchor="left">
<List>
<ListItem button>
<ListItemText primary="Item 1" />
</ListItem>
</List>
</Drawer>
Tabs
import Tabs from '@mui/material/Tabs'
import Tab from '@mui/material/Tab'
function TabPanel({ children, value, index }) {
return <div hidden={value !== index}>{value === index && children}</div>
}
function TabsExample() {
const [value, setValue] = React.useState(0)
return (
<>
<Tabs value={value} onChange={(e, newValue) => setValue(newValue)}>
<Tab label="Item 1" />
<Tab label="Item 2" />
</Tabs>
<TabPanel value={value} index={0}>
Content 1
</TabPanel>
<TabPanel value={value} index={1}>
Content 2
</TabPanel>
</>
)
}
5. Inputs
TextField
import TextField from '@mui/material/TextField';
<TextField
label="Standard"
variant="standard"
/>
<TextField
label="Outlined"
variant="outlined"
/>
<TextField
label="Filled"
variant="filled"
/>
// With validation
<TextField
error={hasError}
helperText={hasError ? "Error message" : "Helper text"}
/>
Select
import Select from '@mui/material/Select'
import MenuItem from '@mui/material/MenuItem'
function SelectExample() {
const [value, setValue] = React.useState('')
return (
<Select value={value} onChange={(e) => setValue(e.target.value)}>
<MenuItem value={10}>Ten</MenuItem>
<MenuItem value={20}>Twenty</MenuItem>
</Select>
)
}
Checkbox and Radio
import Checkbox from '@mui/material/Checkbox';
import Radio from '@mui/material/Radio';
import RadioGroup from '@mui/material/RadioGroup';
import FormControlLabel from '@mui/material/FormControlLabel';
<FormControlLabel
control={<Checkbox />}
label="Label"
/>
<RadioGroup value={value} onChange={handleChange}>
<FormControlLabel value="a" control={<Radio />} label="Option A" />
<FormControlLabel value="b" control={<Radio />} label="Option B" />
</RadioGroup>
6. Data Display
Table
import Table from '@mui/material/Table'
import TableBody from '@mui/material/TableBody'
import TableCell from '@mui/material/TableCell'
import TableHead from '@mui/material/TableHead'
import TableRow from '@mui/material/TableRow'
;<Table>
<TableHead>
<TableRow>
<TableCell>Name</TableCell>
<TableCell>Age</TableCell>
</TableRow>
</TableHead>
<TableBody>
<TableRow>
<TableCell>John</TableCell>
<TableCell>25</TableCell>
</TableRow>
</TableBody>
</Table>
List
import List from '@mui/material/List'
import ListItem from '@mui/material/ListItem'
import ListItemText from '@mui/material/ListItemText'
import ListItemIcon from '@mui/material/ListItemIcon'
;<List>
<ListItem>
<ListItemIcon>
<HomeIcon />
</ListItemIcon>
<ListItemText primary="Primary text" secondary="Secondary text" />
</ListItem>
</List>
Card
import Card from '@mui/material/Card'
import CardContent from '@mui/material/CardContent'
import CardActions from '@mui/material/CardActions'
import CardMedia from '@mui/material/CardMedia'
;<Card>
<CardMedia
component="img"
height="140"
image="/static/images/cards/contemplative-reptile.jpg"
alt="green iguana"
/>
<CardContent>
<Typography gutterBottom variant="h5">
Card Title
</Typography>
<Typography variant="body2" color="text.secondary">
Card content
</Typography>
</CardContent>
<CardActions>
<Button size="small">Share</Button>
<Button size="small">Learn More</Button>
</CardActions>
</Card>
7. Feedback Components
Snackbar
import Snackbar from '@mui/material/Snackbar'
import Alert from '@mui/material/Alert'
function SnackbarExample() {
const [open, setOpen] = React.useState(false)
return (
<Snackbar open={open} autoHideDuration={6000} onClose={() => setOpen(false)}>
<Alert severity="success">This is a success message!</Alert>
</Snackbar>
)
}
Dialog
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'
function DialogExample() {
const [open, setOpen] = React.useState(false)
return (
<Dialog open={open} onClose={() => setOpen(false)}>
<DialogTitle>Dialog Title</DialogTitle>
<DialogContent>Dialog content</DialogContent>
<DialogActions>
<Button onClick={() => setOpen(false)}>Cancel</Button>
<Button onClick={() => setOpen(false)}>OK</Button>
</DialogActions>
</Dialog>
)
}
8. Surfaces
Paper
import Paper from '@mui/material/Paper'
;<Paper elevation={3} sx={{ p: 2 }}>
Content
</Paper>
Accordion
import Accordion from '@mui/material/Accordion'
import AccordionSummary from '@mui/material/AccordionSummary'
import AccordionDetails from '@mui/material/AccordionDetails'
import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
;<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography>Accordion 1</Typography>
</AccordionSummary>
<AccordionDetails>
<Typography>Content</Typography>
</AccordionDetails>
</Accordion>
9. Theming
Custom Theme
import { createTheme } from '@mui/material/styles'
const theme = createTheme({
palette: {
primary: {
main: '#1976d2',
},
secondary: {
main: '#dc004e',
},
},
typography: {
fontFamily: 'Roboto, Arial, sans-serif',
h1: {
fontSize: '2.5rem',
},
},
spacing: 8,
})
Using Theme in Styles
import { styled } from '@mui/material/styles'
const CustomButton = styled(Button)(({ theme }) => ({
padding: theme.spacing(2),
[theme.breakpoints.down('sm')]: {
fontSize: '0.875rem',
},
}))
10. Advanced Usage
Custom Component with Styles
import { styled } from '@mui/material/styles'
const CustomComponent = styled('div')(({ theme }) => ({
display: 'flex',
padding: theme.spacing(2),
backgroundColor: theme.palette.background.paper,
borderRadius: theme.shape.borderRadius,
'&:hover': {
backgroundColor: theme.palette.action.hover,
},
[theme.breakpoints.down('sm')]: {
flexDirection: 'column',
},
}))
Using sx Prop
<Box
sx={{
display: 'flex',
p: 2,
bgcolor: 'background.paper',
borderRadius: 1,
'&:hover': {
bgcolor: 'action.hover',
},
}}
>
Content
</Box>
Conclusion
This guide covers the most commonly used components and features of MUI. Remember to:
- Always check the official documentation for the most up-to-date API references
- Use the
sx
prop for one-off styling needs - Leverage the theme for consistent styling across your application
- Consider accessibility when building your components
The examples provided here serve as a starting point - MUI offers many more features and customization options that you can explore based on your specific needs.