与 React-Router的活动链路

我正在尝试 React-Router(v4),并且从 Nav 开始有一个Link是active的问题。如果我点击任何Link标签,那么活动的东西开始工作。但是,我想让 HomeLink在应用程序启动后立即激活

我正在尝试 React-Router(v4),并且从 Nav 开始有一个Linkactive的问题。如果我点击任何Link标签,那么活动的东西开始工作。但是,我想让 HomeLink在应用程序启动后立即激活

这是我当前的代码:

const Router = () => (
  <BrowserRouter>
    <div>
      <Nav>
        <Link activeClName='is-active' to='/'>Home</Link> {/* I want this to start off as active */}
        <Link activeClName='is-active' to='/about'>About</Link>
      </Nav>
      <Match pattern='/' exactly component={Home} />
      <Match pattern='/about' exactly component={About} />
      <Miss component={NoMatch} />
    </div>
  </BrowserRouter>
)
266

这是React Router v4的旧的,过时的答案

<Link>不再具有activeClNameactiveStyle属性。在 react-router v4 中,如果要进行条件样式设置,则必须使用<NavLink>

const Router = () => (
  <BrowserRouter>
    <div>
      <Nav>
        <NavLink exact activeClName='is-active' to='/'>Home</NavLink>
        <NavLink activeClName='is-active' to='/about'>About</NavLink>
      </Nav>
      <Match pattern='/' exactly component={Home} />
      <Match pattern='/about' exactly component={About} />
      <Miss component={NoMatch} />
    </div>
  </BrowserRouter>
)

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

24

React 路由器 v6:

Source:Active NavLink Cles with React Router

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

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

您也可以添加多个类,因为v6是:

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

现场演示:Active NavLink Cles with React Router

2
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} clName={`d-flex align-items-center py-2 px-4 ${match ? 'cta-btn' : 'c-n-b-link'}`} >
        <span clName='ms-1 f-w-600'>{title}</span>
      </NavLink>
)
}

对于React router V6上述自定义组件将返回一个 navlink,只要路径与给定的to路径匹配,就可以激活活动类。

0

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

条件渲染可能是需要的用例。例如:如果它是活动的,则渲染填充的图标,否则渲染常规图标。

这可以通过找到我们目前所处的路线来实现,然后我们可以进行条件渲染操作,但是这会有点麻烦。

相反,我们可以编写一个函数来修改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>
  )

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(798)
从基类到不同派生类的多重继承强制转换(the inheritance games show cast)
上一篇
如何使用 CSS制作具有固定标题的可滚动表
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(28条)