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 tabs with Material UI.
Tabs
We can add tabs with the Tabs
component.
For example, we can write:
import React from "react";
import AppBar from "@material-ui/core/AppBar";
import Tabs from "@material-ui/core/Tabs";
import Tab from "@material-ui/core/Tab";
import Box from "@material-ui/core/Box";
function TabPanel(props) {
const { children, value, index, ...other } = props;
return (
<div {...other}>
{value === index && <Box p={3}>{children}</Box>}
</div>
);
}
export default function App() {
const [value, setValue] = React.useState(0);
const handleChange = (event, newValue) => {
setValue(newValue);
};
return (
<>
<AppBar position="static">
<Tabs value={value} onChange={handleChange}>
<Tab label="Item One" />
<Tab label="Item Two" />
<Tab label="Item Three" />
</Tabs>
</AppBar>
<TabPanel value={value} index={0}>
Item One
</TabPanel>
<TabPanel value={value} index={1}>
Item Two
</TabPanel>
<TabPanel value={value} index={2}>
Item Three
</TabPanel>
</>
);
}
We create our own TabPanel
to show the content that belongs to the given tab.
We pass in the value to the value
prop and compare that with the index
prop to check what to display.
In the TabPanel
component, we compare value
and index
to see if they’re the same.
If they’re, then we display the content.
Otherwise, we hide it.
label
has the text for the tab.
We’ll update the value
with the newValue
, which is the index of the tab.
Wrapped Labels
If we have long labels, then it may be cut off if it’s too long.
To make it wrap, we can add the wrapped
prop.
For example, we can write:
import React from "react";
import AppBar from "@material-ui/core/AppBar";
import Tabs from "@material-ui/core/Tabs";
import Tab from "@material-ui/core/Tab";
import Box from "@material-ui/core/Box";
function TabPanel(props) {
const { children, value, index, ...other } = props;
return <div {...other}>{value === index && <Box p={3}>{children}</Box>}</div>;
}
export default function App() {
const [value, setValue] = React.useState(0);
const handleChange = (event, newValue) => {
setValue(newValue);
};
return (
<>
<AppBar position="static">
<Tabs value={value} onChange={handleChange}>
<Tab
label="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
wrapped
/>
<Tab label="Item Two" />
<Tab label="Item Three" />
</Tabs>
</AppBar>
<TabPanel value={value} index={0}>
Item One
</TabPanel>
<TabPanel value={value} index={1}>
Item Two
</TabPanel>
<TabPanel value={value} index={2}>
Item Three
</TabPanel>
</>
);
}
The first Tab
has a long label
value.
Since we added the wrapped
prop, it’ll be wrapped.
Disabled Tab
To disable a tab, we can add the disabled
prop.
For instance, we can write:
import React from "react";
import AppBar from "@material-ui/core/AppBar";
import Tabs from "@material-ui/core/Tabs";
import Tab from "@material-ui/core/Tab";
import Box from "@material-ui/core/Box";
function TabPanel(props) {
const { children, value, index, ...other } = props;
return <div {...other}>{value === index && <Box p={3}>{children}</Box>}</div>;
}
export default function App() {
const [value, setValue] = React.useState(0);
const handleChange = (event, newValue) => {
setValue(newValue);
};
return (
<>
<AppBar position="static">
<Tabs value={value} onChange={handleChange}>
<Tab label="Item One" />
<Tab label="Item Two" />
<Tab label="Item Three" disabled />
</Tabs>
</AppBar>
<TabPanel value={value} index={0}>
Item One
</TabPanel>
<TabPanel value={value} index={1}>
Item Two
</TabPanel>
<TabPanel value={value} index={2}>
Item Three
</TabPanel>
</>
);
}
Then we can disable the 3rd tab.
Full-Width Tabs
We can make tabs full width with the variant
prop set to fullWidth
.
To do that, we write:
import React from "react";
import AppBar from "@material-ui/core/AppBar";
import Tabs from "@material-ui/core/Tabs";
import Tab from "@material-ui/core/Tab";
import Box from "@material-ui/core/Box";
function TabPanel(props) {
const { children, value, index, ...other } = props;
return <div {...other}>{value === index && <Box p={3}>{children}</Box>}</div>;
}
export default function App() {
const [value, setValue] = React.useState(0);
const handleChange = (event, newValue) => {
setValue(newValue);
};
return (
<>
<AppBar position="static">
<Tabs value={value} onChange={handleChange} variant="fullWidth">
<Tab label="Item One" />
<Tab label="Item Two" />
</Tabs>
</AppBar>
<TabPanel value={value} index={0}>
Item One
</TabPanel>
<TabPanel value={value} index={1}>
Item Two
</TabPanel>
</>
);
}
to make all tabs fill the space evenly.
Together, they take up the full width of the screen.
Conclusion
We can add tabs with the Tabs
component.
The content can be added to any element.
We can determine what to display by check the index of our content against the value that we set when clicking the tabs.