300

I have the following:

enter image description here

How do I get rid of the blue underline? The code is below:

<Link to="first"><MenuItem style={{paddingLeft: 13, textDecoration: 'none'}}> Team 1 </MenuItem></Link>

The MenuItem component is from http://www.material-ui.com/#/components/menu

1
  • 18
    put textDecoration: 'none' on the <Link /> component not its children.
    – azium
    Commented Jun 7, 2016 at 4:31

37 Answers 37

386

I see you're using inline styles. textDecoration: 'none' is used in child, where in fact it should be used inside <Link> as such:

<Link to="first" style={{ textDecoration: 'none' }}>
  <MenuItem style={{ paddingLeft: 13 }}>Team 1</MenuItem>
</Link>

<Link> will essentially return a standard <a> tag, which is why we apply textDecoration rule there.

3
  • 10
    there a way to set global with textdecoration none ? in the app.css ?
    – stackdave
    Commented Oct 8, 2017 at 15:08
  • 5
    It works :). Be aware that if you copy paste the style to your .css (because, of course, you don't like inline styles) then is text-decoration: none; Commented Feb 17, 2018 at 18:16
  • <Button variant="link" style={{ textDecoration: "none" }}> Logout</Button>
    – jrg
    Commented Sep 29, 2023 at 20:59
185

I think the best way to use react-router-dom Link in a MenuItem (and other MaterialUI component such as buttons) is to pass the Link in the "component" prop

<Menu>
   <MenuItem component={Link} to={'/first'}>Team 1</MenuItem>
   <MenuItem component={Link} to={'/second'}>Team 2</MenuItem>
</Menu>

you need to pass the route path in the 'to' prop of the "MenuItem" (which will be passed down to the Link component). In this way you don't need to add any style as it will use the MenuItem style

8
  • 28
    Yours should definitely be the answer in 2019. Commented Jun 11, 2019 at 10:53
  • 6
    This is 100x better than the docs, they loooove lots of useless code
    – coiso
    Commented Apr 23, 2020 at 21:36
  • 8
    All other answers scare me
    – coiso
    Commented Apr 23, 2020 at 21:37
  • Although it's simplified, I think it may suffer from props collision. You may take this into your consideration. material-ui.com/guides/composition/#caveat-with-prop-forwarding
    – shiponcs
    Commented Jul 9, 2020 at 3:03
  • Or shouldn't be rather <MenuList> instead of <Menu> ...
    – drazewski
    Commented Sep 25, 2020 at 9:35
100

If you are using styled-components, you could do something like this:

import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import styled from 'styled-components';


const StyledLink = styled(Link)`
    text-decoration: none;

    &:focus, &:hover, &:visited, &:link, &:active {
        text-decoration: none;
    }
`;

export default (props) => <StyledLink {...props} />;
0
93

There's also another way to properly remove the styling of the link. You have to give it style of textDecoration='inherit' and color='inherit' you can either add those as styling to the link tag like:

<Link style={{ color: 'inherit', textDecoration: 'inherit'}}>

or to make it more general just create a css class like:

.text-link {
    color: inherit;
    text-decoration: inherit;
}

And then just <Link className='text-link'>

4
  • have you tried my solution stackoverflow.com/a/55693040/3000540 Commented Jul 2, 2019 at 10:52
  • 1
    This should be the accepted answer since it also removes the change in color. Also, is there a way to translate that CSS class into JSS? I had the same issue using material-ui and using the style prop helped. Commented Aug 18, 2020 at 19:18
  • this rather worked for me a:hover{ color: inherit; text-decoration: none; } Commented Jul 7, 2021 at 2:13
  • This works for me. And this way is easier than others. Thanks :) Commented Sep 18, 2021 at 14:20
17

You can add style={{ textDecoration: 'none' }} in your Link component to remove the underline. You can also add more css in the style block e.g. style={{ textDecoration: 'none', color: 'white' }}.

<h1>
  <Link style={{ textDecoration: 'none', color: 'white' }} to="/getting-started">
    Get Started
  </Link>
</h1> 
0
16
a:-webkit-any-link {
  text-decoration: none;
  color: inherit;
}
13

If someone is looking for material-ui's Link component. Just add the property underline and set it to none

<Link underline="none">...</Link>

0
10

There is the nuclear approach which is in your App.css (or counterpart)

a{
  text-decoration: none;
}

which prevents underline for all <a> tags which is the root cause of this problem

2
  • Not a solution for react and styled-jsx…
    – AntonAL
    Commented Mar 28, 2019 at 13:36
  • 1
    actually its a solution it worked for me as im using sass beside my react and using all above solutions did not trigger <link> component style .. Commented Apr 14, 2019 at 20:36
10

Material UI v5+

You should be able to globally customize MUI component styles, such as:

import { createTheme } from '@mui/material'

const theme = createTheme({
  components: {
    MuiLink: {
      styleOverrides: {
        root: {
          textDecoration: 'none',
        },
      },
    },
  },
})

const App = ({ currentAccount, neighborhoodsWithPropertyCount }) => (
  <ThemeProvider theme={theme}>
    <Router>
      <Routes>
        <Route path="/" element={<Home />} />
      </Routes>
    </Router>
  </ThemeProvider>
)

export default App

However, more often than not, you should actually be using the Link component from react-router-dom, in which case links would have no text decoration by default.

7

//CSS

.navigation_bar > ul > li {
      list-style: none;
      display: inline;
      margin: 2%;
    }

    .link {
      text-decoration: none;
    }

//JSX

 <div className="navigation_bar">
            <ul key="nav">
              <li>
                <Link className="link" to="/">
                  Home
                </Link>
              </li>
            </ul>
          </div>
5

Its pretty simple. Just add this style={{ textDecoration: 'none' }} inside of your <Link> tag

<Link to="first" style={{ textDecoration: 'none' }}>
   <MenuItem style={{ paddingLeft: 13 }}>
         Team 1
   </MenuItem>
4

The underline comes by default from the react-router-dom package. You can do the following to fix the issue.

<Link to="/route-path" style={{ textDecoration: 'none' }}> 
    // Rest of the code
</Link>
1
  • This will work, and to make life easier you can also make a re-useable component like <BaseStyleLink/> and use that so you don't have to repeatedly apply this styling across your whole app.
    – Matt S.
    Commented Nov 2, 2021 at 18:16
3

Working for me, just add className="nav-link" and activeStyle{{textDecoration:'underline'}}

<NavLink className="nav-link" to="/" exact activeStyle= 
  {{textDecoration:'underline'}}>My Record</NavLink>
3

Look here -> https://material-ui.com/guides/composition/#button.

This is the official material-ui guide. Maybe it'll be useful to you as it was for me.

However, in some cases, underline persists and you may want to use text-decoration: "none" for that. For a more cleaner approach, you can import and use makeStyles from material-ui/core.

import { makeStyles } from '@material-ui/core';

const useStyles = makeStyles(() => ({
    menu-btn: {
        textDecoration: 'none',
    },
}));

const classes = useStyles();

And then set className attribute to {classes.menu-btn} in your JSX code.

0
3

CSS Solution also for React

  1. Add className/class in the Link(React Router) tag only.(Most Important Part!! Add ClassName in Link tag not any other.)
  2. Add text-decoration: none in the css file.

Nav.js

  <Link to="/" className="link" >
    Get Started
  </Link>

Nav.css

.link{
text-decoration: none;
}
1
  • Remove the blue color. .link{ text-decoration: none; color : unset; } Commented Jul 15, 2022 at 10:00
2

jsx:

<Link className="link">
  test
</Link>

css:

.link{
    text-decoration: none;
}
1
1

To expand on @Grgur's answer, if you look in your inspector, you'll find that using Link components gives them the preset color value color: -webkit-link. You'll need to override this along with the textDecoration if you don't want it to look like a default hyperlink.

enter image description here

1
style={{ backgroundImage: "none" }}

Only this worked for me

1

I have resolve a problem maybe like your. I tried to inspect element in firefox. I will show you some results:

  1. It is only the element I have inspect. The "Link" component will be convert to "a" tag, and "to" props will be convert to the "href" property:

  1. And when I tick in :hov and option :hover and here is result:

As you see a:hover have text-decoration: underline. I only add to my css file:

a:hover {
 text-decoration: none;
}

and problem is resolved. But I also set text-decoration: none in some another classes (like you :D), that may be make some effects (I guess).

0
1
<Link
   to='/maxpain'
   replace
   style={{
           textDecoration: 'none'
          }}
   >
     <LinkText>Click here!</LinkText>
</Link>

Simple as that!

1

the <Link /> tag basically is <a> tag on render time, so you can just write

a { text-decoration: none; }

and it worked for me :) Good luck

1
  • This has been stated several times by others. You could improve your answer by citing documentation and providing formatted code samples.
    – Besworks
    Commented Apr 5, 2022 at 19:31
1

I found two main ways:

with MUI Link API

 import { Link } from '@mui/material';

 <Link
    href={`https://www.example.com/?symbol=${myValue}`}
    underline="none"
    color="inherit"
    target="_blank"
    rel="noopener noreferrer"
         >
    {myValue}
  </Link>

or with MUI sx props

  <Link
    href={`https://www.example.com/?symbol=${myValue}`}
    target="_blank"
    rel="noopener noreferrer"
    sx={{
      color: '#42a5f5'
      textDecoration: 'none',
      display: 'inline',
      fontWeight: 'light'
      mx: 0.5,
      fontSize: '0.80rem',
    }}
  >
    {value.toUpperCase()}
  </Link>
0
<Link to="/page">
    <Box sx={{ display: 'inline-block' }}>
        <PLink variant="primary">Page</PLink>
    </Box>
</Link>

In some cases when using another component inside the Gatsby <Link> component, adding a div with display: 'inline-block' around the inner component, prevents underlining (of 'Page' in the example).

0

Well you can simply use this piece of code in your scss file; This will remove that unwanted color change,

a:-webkit-any-link {
  &:hover {
    color: white;
  }
}

0

I had a problem where the Link element was changing my h4 to 'underline', setting text-decoration: 'none' did not work, my only solution was to use a button instead.

<Link to="/settings">
    <button>Settings</button>
</Link>
0

standard a-link and react-link are the same.

so if you are styling a-link, it will automatically style react-link.

a{ what ever styling you want }

0

Just

<Link
   to={`$path`}
   style={{ borderBottom: "none" }}> 
    .... 
</Link>
0

I find this question and no one of the answers really resolve the problem at all in a general case (e.g. if the elements isn't a MenuItem). I suggest:

import {useHistory} from "react-router-dom";
const MyComp = () => {
  const history = useHistory();
  return <div>
    <AnyComponent onclick={()=>history.push('/path/u/want')}
  </div>
}
0

I just added two lines and worked for me :)

{
 text-decoration: none; 
 color: black;
}
0
 a {
  text-decoration: none !important;
  color: black !important; 
  font-size: 20px;
}

used !important in App.css

Not the answer you're looking for? Browse other questions tagged or ask your own question.