简体   繁体   中英

material-ui tabs with nextjs?

I have a project in material-ui, nextjs and typescript. I'm trying to get my navbar to work with nextjs:

 import * as React from 'react'; import AppBar from '@material-ui/core/AppBar'; import Link from "next/link"; import {Tab, Tabs} from "@material-ui/core"; export default function NavBar() { return ( <AppBar position="static"> <Tabs> <Tab label="Timer"><Link href="timer" /> </Tab> <Tab label="Home" to="/" component={Link} /> </Tabs> </AppBar> ); }

But it causes the build to fail. Is there something I'm missing?

Other solutions basically wrap the Next.js' Link around MUI's Tab . It probably breaks the compatibility between Tabs and Tab .

Why not style Link to fill the entire Tab ? Code for MUI v5:

<Tab
  onClick={(event) => {
    event.preventDefault()
  }}
  label={
    <Link href={opt['href']} passHref>
      <Typography
        component="a"
        sx={{
          position: 'absolute',
          top: 0,
          left: 0,
          right: 0,
          bottom: 0
        }}
      >
        {opt['label']}
      </Typography>
    </Link>
  }
  value={opt['value']}
/>

In this case, I believe you want to wrap the <Tab /> elements with the <Link /> ones.

<Tabs>
    <Link href="/timer" passHref>
      <Tab label="Timer" />
    </Link>
    <Link href="/" passHref>
      <Tab label="Home" />
    </Link>
</Tabs>

This might be better for SEO:

<Link href="/timer" passHref>
  <Tab component="a" label="Timer" />
</Link>

Reason is because Link doesn't add href to the child (even if it's an a component). passHref forces this, but preventDefault can't be put onClick as mentioned in the MUI docs as it won't change the URL.

Here is an example straight from MUI v.5.

https://codesandbox.io/s/d2dco?file=/demo.tsx

Create LinkTab component:

import Tabs from '@mui/material/Tabs';
import Tab from '@mui/material/Tab';

interface LinkTabProps {
  label?: string;
  href?: string;
}

function LinkTab(props: LinkTabProps) {
  return (
    <Tab
      component="a"
      onClick={(event: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {
        event.preventDefault();
      }}
      {...props}
    />
  );
}

Usage:

   <LinkTab label="register" href="/register" />
   <LinkTab label="login" href="/login" />

But to be honest <Tab label="login" href="/login" /> just works for me

Keep all MUI styles

import Link from "next/link";
import {Tab} from "@mui/material";
import {forwardRef} from "react";

const LinkTab = forwardRef(({href, ...rest}, ref) => (
  <Link href={href} passHref ref={ref}>
    <Tab component="a" {...rest}/>
  </Link>
))

export default LinkTab

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM