我无法使用 react-router 在 React 中设置活动路由的样式

MET*_*EAD 2 css reactjs

我打算使用 react-router 在 React 中设置活动路由的样式。我正在使用 NavLink 这样做。请看下面的代码:

组件.JS

import React from 'react';
import classes from './navBar.module.css';
import {NavLink} from 'react-router-dom'

const NavBar = (props) => {
    return (
        <div className={classes.navBarStyle}>
            <p className={classes.navBarTitle}>EMPOYEE DATABASE</p>
            <nav className={classes.nav}>
               <ul className = {classes.navUl}>
                   <li><NavLink to="/" exact>HOME</NavLink></li>
                   <li><NavLink to="/addEmployee">ADD</NavLink></li>
               </ul>
            </nav>
        </div>
    )
}

export default NavBar;
Run Code Online (Sandbox Code Playgroud)

组件.module.css

.nav {
    height: 100%;   
}

.navUl {
    list-style-type: none;
    margin: 0;
    padding: 0;
    height: 100%;
    display: flex;
}

.navUl li {
    height: 100%;
}

.navUl li a{
    text-decoration: none;
    color: inherit;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 20px;
}


.navUl li a:hover{
    background-color: rgb(235, 91, 25);
}

/* STYLING THE ACTIVE ROUTE HERE */
.navUl li a.active {
    background-color: rgb(119, 47, 14);
    border-bottom: 2px solid white;
}
Run Code Online (Sandbox Code Playgroud)

I can see the class = "active"getting embedded inside the anchor tag when a particular route is selected.

在此处输入图片说明

因此,我打算使用 进行样式设置a.active,但它没有按照 css 文件中的指定样式进行设置。我在 CSS 中没有看到任何特定问题,甚至样式也没有出现在 chrome 开发人员工具中。讽刺是a:hover有效的,但a.active不是。我哪里错了?

小智 8

它不起作用的原因是因为您正在使用 CSS 模块并且它会破坏类的名称以将其本地范围限定到您的 JSX 文件。您的课程在编译后不再.active被调用.active。它将以类似.navUl_active__10Mm9(作为示例)为前缀和后缀。然后,您的 JSX 将无法选择该类,因为它仍在寻找.active. 您可以通过使用导入的类作为activeClassName.

您可以保持 CSS 不变:

.navUl li a.active {
   background-color: rgb(119, 47, 14);
   border-bottom: 2px solid white;
}
Run Code Online (Sandbox Code Playgroud)

以同样的方式导入你的 CSS:

import classes from './navBar.module.css';
Run Code Online (Sandbox Code Playgroud)

添加导入的样式:

<li><NavLink activeClassName={classes.active} to="/" exact>HOME</NavLink></li>
<li><NavLink activeClassName={classes.active} to="/addEmployee">ADD</NavLink></li>
Run Code Online (Sandbox Code Playgroud)

在这里,您的 JSX 将使用 CSS 类编译成的任何内容。


ulo*_*lou 5

I think I found a bit better approach, using :global. Class active is default react router active link class.

// AppNav.module.scss
.AppNavLink {
  text-decoration : none;

  &:global.active {
    border : 1px solid deeppink;
  }
}
Run Code Online (Sandbox Code Playgroud)

Thanks to this, you don't have to add any extra js/html code anywhere.