与React-Router的主动链接?

Active link with React-Router?

提问人:Saad 提问时间:12/14/2016 最后编辑:Saad 更新时间:12/21/2022 访问量:193997

问:

我正在尝试 React-Router (v4),但我在启动导航时遇到了问题,因为其中一个是 .如果我单击任何标签,那么活动内容就会开始工作。但是,我希望 Home 在应用程序启动后立即处于活动状态,因为这是在路由上加载的组件。有什么办法可以做到这一点吗?LinkactiveLinkLink/

这是我当前的代码:

const Router = () => (
  <BrowserRouter>
    <div>
      <Nav>
        <Link activeClassName='is-active' to='/'>Home</Link> {/* I want this to start off as active */}
        <Link activeClassName='is-active' to='/about'>About</Link>
      </Nav>

      <Match pattern='/' exactly component={Home} />
      <Match pattern='/about' exactly component={About} />
      <Miss component={NoMatch} />
    </div>
  </BrowserRouter>
)
javascript 反应js ecmascript-6 反应路由器

评论


答:

272赞 worc 3/29/2017 #1

这是 React Router v4 的一个旧的、过时的答案


<Link>不再具有 or 属性。在 react-router v4 中,如果你想做条件样式,你必须使用 <NavLink>activeClassNameactiveStyle

const Router = () => (
  <BrowserRouter>
    <div>
      <Nav>
        <NavLink exact activeClassName='is-active' to='/'>Home</NavLink>
        <NavLink activeClassName='is-active' to='/about'>About</NavLink>
      </Nav>

      <Match pattern='/' exactly component={Home} />
      <Match pattern='/about' exactly component={About} />
      <Miss component={NoMatch} />
    </div>
  </BrowserRouter>
)

我在主页上添加了一个确切的属性,我相当确定没有它,主页链接将始终处于活动状态,因为会匹配您拥有的任何其他页面。<NavLink>//about

评论

5赞 wuno 4/30/2017
我今天忽略了这个答案,因为我认为使用NavLink乍一看可以避免这个问题。很难找到其他任何地方可以解释这一点。人们需要对这个答案投赞成票,因为他是完全正确的。你必须使用NavLink。也!exact={true} 也完全正确。否则,当您单击其他链接时,呈现的第一个链接将不会重新呈现,从而导致主页始终处于活动状态。我希望我能再给你投 10 次赞成票。
1赞 Wiktor Czajkowski 6/20/2018
如果是嵌套路由,则可能需要用于嵌套路由。exactNavLink
1赞 Brian Burns 7/1/2018
谢谢你的链接,@PetrAdam - 想知道为什么这不起作用!(解决方案是用 )。connectwithRouter
1赞 Pateta 4/10/2019
为了避免 redux 阻塞重新渲染,您可以为该方法提供选项。有关未更新视图的详细信息:https://github.com/reduxjs/react-redux/blob/master/docs/troubleshooting.mdpure: falseconnect()
1赞 Shamseer Ahammed 4/1/2020
exact={true} 在主页上 NavLink 是必须的,否则仪表板始终保持活动状态,很好的解释
36赞 Chilaxathor 11/30/2021 #2

React 路由器 v6:

来源: Active NavLink Classes with React Router

现在,您可以使用该属性,该属性现在接受一个函数并传递一个布尔属性,如下所示:classNameisActive

<NavLink
  to="users"
  className={({ isActive }) => (isActive ? 'active' : 'inactive')}
>
  Users
</NavLink>

你也可以添加多个类,因为 v6 已经发布:

<NavLink
  to="users"
  className={({ isActive }) =>
    isActive ? 'bg-green-500 font-bold' : 'bg-red-500 font-thin'
  }
>
  Users
</NavLink>

现场演示:使用 React Router 激活 NavLink 类

0赞 eneski 1/24/2022 #3

作为 @Nick 答案(React Router v6)的补充,对于那些需要在上层上下文中处于活动导航状态的人。

条件渲染可能是满足这一需求的用例。例如:如果它处于活动状态,则渲染填充图标,否则渲染常规图标。

这可以通过找到我们当前所在的路由来实现,然后我们可以执行条件渲染操作,但这会有点麻烦。

相反,我们可以编写一个函数来修改 's style prop 中的状态,如下所示。Navlink

  const [active, setActive] = useState('home')

  const activate = (isActive, path, activeStyle, nonActiveStyle) => {
    if (isActive) {
      setActive(path)
      return activeStyle
    }
    return nonActiveStyle
  }

  return (
    <nav>
      <NavLink
        to="/"
        style={(activeNav) => activate(activeNav.isActive, 'home')}
      >
        {active === 'home' ? <HomeFill /> : <Home />}
      </NavLink>
      <NavLink
        to="/profile"
        style={(activeNav) => activate(activeNav.isActive, 'profile')}
      >
        {active === 'profile' ? <ProfileFilled /> : <Profile />}
      </NavLink>
    </nav>
  )

评论

0赞 bastianwegge 4/12/2022
我尊重您想增强这一点,但您提供的代码没有解释,也没有真正起作用。这将使某人在不需要的状态下寻找答案。也许有办法改善你的答案?
0赞 Bambier 1/25/2022 #4

在我的情况下,自动将类设置为项目,所以我使用以下方法<NavLink />active

myComponet.js

<ListItem component={NavLink} to="/somewhere" className="myactive" > something </ListItem>

myStyle.css

a.active.myactive {
 // some styles
}
12赞 Live Software Developer 2/10/2022 #5
import { NavLink, useMatch, useResolvedPath } from 'react-router-dom';

const CustomNavLink = ({ to, title }) => {
   let resolved = useResolvedPath(to);
   let match = useMatch({ path: resolved.pathname, end: true });

   return (
      <NavLink to={to} className={`d-flex align-items-center py-2 px-4 ${match ? 'cta-btn' : 'c-n-b-link'}`} >
        <span className='ms-1 f-w-600'>{title}</span>
      </NavLink>
)
}

对于上面的自定义组件将返回一个导航链接,只要路径与给定路径匹配,就可以激活活动类。React router V6to

评论

0赞 bastianwegge 4/12/2022
谢谢你的回答!此组件还可用于解决“深度嵌套活动”链接问题:)
0赞 Live Software Developer 6/19/2022
刚刚意识到有一个活动类,所以如果你传入你自己的类,喜欢和目标,你可以在链接处于活动状态时设置链接的样式。这是来自Navlink.activemynavlinkclassmynavlinkclass.activeNavlinkReact router dom V6
1赞 holem 11/12/2022
如果希望菜单项(例如,)在所有嵌套 URL () 上处于活动状态,则必须设置为 。/example/example/any/nestedendfalse
0赞 KARTHIKEYAN.A 6/22/2022 #6

在我使用以下命令来启用活动链接react-router-dom Version 5.3.0

类:

active: {
        // background: 'linear-gradient(180deg, #008b32 0%, #cddc39 100%)',
        // backgroundColor: 'slategray',
        borderBottom: '1px solid white',
        borderRadius: '6px',
        boxShadow: 'rgba(6, 24, 44, 0.4) 0px 0px 0px 2px , rgba(6, 24, 44, 0.65) 0px 4px 6px -1px , rgba(255, 255, 255, 0.08) 0px 1px 0px inset',
        color: 'white',
        fontSize: '14px',
        listStyle: 'none',
        marginLeft: '16px',
        padding: '5px',
        textDecoration: 'none',
        textTransform: 'uppercase',
        transition: 'all 0.1s cubic-bezier(0.42, 0.02, 0.06, 0.05) 0.1s',
    },
    link: {
        '&:hover': {
            borderBottom: '1px solid white',
            borderRadius: '6px',
            boxShadow: 'rgba(6, 24, 44, 0.4) 0px 0px 0px 2px , rgba(6, 24, 44, 0.65) 0px 4px 6px -1px , rgba(255, 255, 255, 0.08) 0px 1px 0px inset',
            color: 'white',
            padding: '5px',
            transition: 'all 0.1s cubic-bezier(0.42, 0.02, 0.06, 0.05) 0.1s',
        },
        color: '#ddf1f9',
        fontSize: '14px',
        listStyle: 'none',
        marginLeft: '16px',
        textDecoration: 'none',
        textTransform: 'uppercase'
    },

NavLink.js

import React from "react";
import { useLocation } from "react-router-dom";


const NavLinks = classes => {
    const pathname = useLocation().pathname
    return (
        <nav>
            <ul className={classes.navlinks}>
                <li>
                    <Link
                        className={`${pathname === '/' ? classes.active : classes.link}`}
                        to='/'
                    >
                        Login
                    </Link>
                </li>
                <li>
                    <Link
                        className={`${pathname === '/dashboard' ? classes.active : classes.link}`}
                        to='/dashboard'
                    >
                        Dashboard
                    </Link>
                </li>
            </ul>
        </nav>
    )
}
1赞 Philippe Fanaro 12/21/2022 #7

受到 @Live Software Developer 的启发,在 v6 中,我相信这样做要简单得多(下面的输入来自 TypeScript):

const CustomNavLink: React.FC<{ to: string; text: string }> = ({
  to,
  text,
}) => {
  return (
    <NavLink
      to={to}
      className={({ isActive }) => (isActive ? "active" : "inactive")}
    >
      {text}
    </NavLink>
  );
};