Material UI
02 / 03

Form Controls, Data Display & Layout

Material UI: Forms, Data Display & Layout

Form Components

import TextField from '@mui/material/TextField'
import Select from '@mui/material/Select'
import MenuItem from '@mui/material/MenuItem'
import FormControl from '@mui/material/FormControl'
import InputLabel from '@mui/material/InputLabel'
import FormHelperText from '@mui/material/FormHelperText'
import Checkbox from '@mui/material/Checkbox'
import FormControlLabel from '@mui/material/FormControlLabel'
import Switch from '@mui/material/Switch'
import Autocomplete from '@mui/material/Autocomplete'
import Slider from '@mui/material/Slider'

// TextField (most versatile input)
<TextField
  label="Email"
  type="email"
  variant="outlined"   // outlined | filled | standard
  error={!!errors.email}
  helperText={errors.email?.message}
  fullWidth
  required
  {...register('email')}
/>

// Select
<FormControl fullWidth>
  <InputLabel>Role</InputLabel>
  <Select value={role} label="Role" onChange={e => setRole(e.target.value)}>
    <MenuItem value="admin">Admin</MenuItem>
    <MenuItem value="user">User</MenuItem>
  </Select>
  <FormHelperText>Select user role</FormHelperText>
</FormControl>

// Autocomplete (combobox with search)
<Autocomplete
  options={countries}
  getOptionLabel={o => o.name}
  renderInput={params => <TextField {...params} label="Country" />}
  onChange={(_, value) => setCountry(value)}
  multiple   // allow multiple selections
/>

Data Display

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'
import TablePagination from '@mui/material/TablePagination'
import List from '@mui/material/List'
import ListItem from '@mui/material/ListItem'
import ListItemText from '@mui/material/ListItemText'
import ListItemAvatar from '@mui/material/ListItemAvatar'
import Alert from '@mui/material/Alert'
import Skeleton from '@mui/material/Skeleton'

// Table with pagination
<Table>
  <TableHead>
    <TableRow>
      <TableCell>Name</TableCell>
      <TableCell align="right">Actions</TableCell>
    </TableRow>
  </TableHead>
  <TableBody>
    {rows.map(row => (
      <TableRow key={row.id} hover>
        <TableCell>{row.name}</TableCell>
        <TableCell align="right">
          <IconButton size="small"><EditIcon /></IconButton>
        </TableCell>
      </TableRow>
    ))}
  </TableBody>
</Table>
<TablePagination
  count={total}
  page={page}
  rowsPerPage={25}
  onPageChange={(_, p) => setPage(p)}
/>

// Alert / Snackbar
<Alert severity="error" onClose={handleClose}>Something went wrong</Alert>
<Alert severity="success" variant="filled">Changes saved!</Alert>

// Loading skeleton
<Skeleton variant="text" width={200} />
<Skeleton variant="rectangular" height={120} />

Layout Components

import Grid from '@mui/material/Grid'
import Container from '@mui/material/Container'
import Drawer from '@mui/material/Drawer'
import AppBar from '@mui/material/AppBar'
import Toolbar from '@mui/material/Toolbar'
import Divider from '@mui/material/Divider'

// Responsive grid (Grid v2 — MUI v5.9+)
<Grid container spacing={2}>
  <Grid item xs={12} md={6} lg={4}>
    <Paper sx={{ p: 2 }}>Card 1</Paper>
  </Grid>
  <Grid item xs={12} md={6} lg={4}>
    <Paper sx={{ p: 2 }}>Card 2</Paper>
  </Grid>
</Grid>

// Container (max-width + center)
<Container maxWidth="lg">
  <Typography variant="h4">Page Title</Typography>
</Container>

// Sidebar Drawer
<Drawer open={open} onClose={() => setOpen(false)} anchor="left">
  <Box sx={{ width: 240 }} role="presentation">
    <List>...</List>
  </Box>
</Drawer>

Keep your own version of these notes — editable, searchable, and organised by your stack.

Start free