我正在尝试 React-Router(v4),并且从 Nav 开始有一个Link
是active
的问题。如果我点击任何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>
)
这是React Router v4的旧的,过时的答案
<Link>
不再具有activeClName
或activeStyle
属性。在 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
和您拥有的任何其他页面。

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>

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
路径匹配,就可以激活活动类。

作为 @ 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>
)
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(28条)