【问题标题】:How can I add 'active' class to currently active nav item? [duplicate]如何将“活动”类添加到当前活动的导航项? [复制]
【发布时间】:2021-11-19 20:07:07
【问题描述】:

所以我有这个侧边栏,它有通往应用程序不同页面的路线。在悬停时,我将li 设置为带有右边框和相同颜色的图标。现在我一直在尝试将活动类添加到当前活动的路径中,其样式与 li (右边框和图标颜色)相同。但我做不到。

我已经尝试过post 的解决方案,但似乎没有任何效果。我尝试使用来自react-router-domNavLink 并添加了activeClassName,但它不起作用。

这是代码的当前状态:

const Sidebar = () => {
    return (
        <div className={style.sidebarContainer} >

            <li className={style.navItem} >
                  <Link to='/' activeClassName="active" >
                        <PersonIcon />
                  </Link>
            </li>

            <li className={style.navItem}>
                  <Link to='/example1' activeClassName="active" >
                        <SettingsIcon />
                  </Link>
            </li>

            <li className={style.navItem}>
                  <Link to='/example2' activeClassName="active" >
                        <LightModeIcon />
                  </Link>
            </li>

        </div>
    )
}

这是样式表:

.sidebarContainer{
    background: black;
}

.sidebarContainer a{
    text-decoration: none;
    color: gray;
    width: 100%;
} 

.navItem {
    width: 100%;
    padding: 1rem 0;
    cursor: pointer;
    border-right: 4px solid transparent;
    transition: all 0.3s ease 0s !important;
    list-style: none;
    padding-left: 1.3rem;
    display: flex;
    align-items: center;
}

.navItem:hover {
    border-right: 4px solid red;
}

.navItem:hover svg {
    color: red;
}

.navItem svg {
    font-size: 1.6rem !important;
    transition: all 0.3s ease 0s !important;
}

它的外观如下:

【问题讨论】:

  • 您是否遇到任何后端或前端错误?

标签: css reactjs


【解决方案1】:

您需要将 Link 替换为 NavLink 。当与当前 URL 匹配时,NavLink 将向呈现的元素添加样式属性。

喜欢

           <li className={style.navItem} >
                  <NavLink to='/' activeClassName="active" >
                        <PersonIcon />
                  </NavLink>
            </li>

            <li className={style.navItem}>
                  <NavLink to='/example1' activeClassName="active" >
                        <SettingsIcon />
                  </NavLink>
            </li>

            <li className={style.navItem}>
                  <NavLink to='/example2' activeClassName="active" >
                        <LightModeIcon />
                  </NavLink>
            </li>

here 是文档链接

【讨论】:

    【解决方案2】:

    LinkNavLink 组件返回一个 a HTML 标记。所以当你在写下面的代码时,

    <Link to="/home">Home</Link>
    

    原来是 DOM 上的以下标记,

    <a href="/home">Home</a>
    

    所以active 类实际上添加了a 标签,而不是li 标签。

    <a href="/home" class="active">Home</a>
    

    考虑到这种方法,我们必须设置 CSS 样式。

    但我们有一个问题!由于我们使用css-modules,样式文件中的类将由库转换以确保本地范围。所以.navItem 类将被转换为_src_app_module__navLink 之类的东西。所以我们必须将我们的活动类作为style.active 传递给NavLink 组件,

    <NavLink to='/' activeClassName={style.active} >
       <PersonIcon />
    </NavLink>
    

    请使用NavLink 代替Link 组件

    您的 css 上的以下更新应该可以工作。

    .navItem a{
        width: 100%;
        padding: 1rem 0;
        cursor: pointer;
        border-right: 4px solid transparent;
        transition: all 0.3s ease 0s !important;
        list-style: none;
        padding-left: 1.3rem;
        display: flex;
        align-items: center;
    }
    
    .navItem a:hover,
    .navItem a.active {
        border-right: 4px solid red;
    }
    
    .navItem a:hover svg,
    .navItem a.active svg {
        color: red;
    }
    

    在这里我尽可能地复制了你的代码 - https://codesandbox.io/s/pedantic-field-kwj1t

    【讨论】:

    • 如果我不使用activeClassName 那么我必须在条件的帮助下手动添加active 类,对吧?因为我刚刚删除了activeClassName 并添加了您的代码。它没有用。但是后来我将活动添加到Link 之一,然后它起作用了。但如果我走另一条路,它不会改变。
    • 现在我尝试使用 NavLink 并删除了手册 active 类。它不起作用。
    • 当你使用 NavLink 组件时,active 类被 React Router 添加为默认值。如果你想使用不同的类,例如selected 然后你可以使用 activeClassName 属性。您是否按照我的回答更新了 CSS?它可能会失败,但想法是您必须定位 a 标签才能在导航上显示活动页面。
    • 我做到了。它没有工作
    • 好的,我找到了实际问题。由于我们使用的是 css 模块,因此我们的样式表中实际上没有 active 类可用。因为 css 模块将其转换为本地范围类名称。所以我们必须以style.active这种方式将活动类名传递给这个道具activeClassName。我试图在这里尽可能多地复制您的代码 - codesandbox.io/s/loving-williams-l4n7i。检查代码,你就会明白。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 2018-06-30
    • 1970-01-01
    相关资源
    最近更新 更多