reactjs - 使用反应在引导程序中突出显示当前页面
问题描述
我已经看到了多个与此相关的问题,并且我已经尝试了所有这些问题,但没有任何结果。因此,发布另一个看似重复的问题。
我正在尝试突出显示导航栏中的当前页面按钮。对于简单的示例,我没有将其路由到新页面,它可以工作。但是当我将它路由到不同的页面(一个单独的反应组件)时它不起作用。
这是我的代码:
应用程序.jsx:
class App extends Component {
render() {
return (
<BrowserRouter>
<div>
<Route exact={true} path='/' component={HomeApp}/>
<Route path='/form' component={SomeForm}/>
</div>
</BrowserRouter>
);
}
}
导航栏.jsx
class NavigationBar extends Component {
componentDidMount() {
toggleIcon();
}
render() {
return (<div id="topheader">
<nav className="navbar navbar-expand-lg navbar-light bg-light ">
<a className="navbar-brand" href="#">Whatever</a>
<button className="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav"
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span className="navbar-toggler-icon"></span>
</button>
<div className="collapse navbar-collapse" id="navbarNav">
<ul className="navbar-nav nav nav-pills ml-auto">
<li className="nav-item active">
<a className="nav-link" href="/">Home <span className="sr-only">(current)</span></a>
</li>
<li className="nav-item">
<a className="nav-link" href="/form">Submit Form</a>
</li>
<li className="nav-item">
<a className="nav-link" href="#">Sign Up</a>
</li>
<li className="nav-item">
<a className="nav-link " href="#">Login</a>
</li>
</ul>
</div>
</nav>
</div>
)
}
}
export default NavigationBar
导航.js
import $ from 'jquery';
export function toggleIcon() {
$( '#topheader .navbar-nav a' ).on( 'click', function () {
$( '#topheader .navbar-nav' ).find( 'li.active' ).removeClass( 'active' );
$( this ).parent( 'li' ).addClass( 'active' );
});
}
如图所示,当我单击Sign Up
或时突出显示有效Login
,因为它们没有被路由到任何其他组件。
但是当我单击Submit Form
哪个路由到SomeForm
组件时,突出显示返回到Home
按钮。
有关更多详细信息,我将发布内容HomeApp
和SomeForm
组件:
HomeApp.jsx
class HomeApp extends Component {
render() {
return (
<div className="container">
<NavigationBar/>
<Jumbotron/>
</div>
)
}
}
export default HomeApp
SomeForm.jsx
class SomeForm extends Component {
render() {
return (<>
<div className="container">
<NavigationBar>
</NavigationBar>
</div>
</>
)
}
}
export default SomeForm
解决方案
请遵循以下结构:
import { BrowserRouter, Switch, Route } from "react-router-dom"
class App extends React.Component{
render() {
return (
<BrowserRouter>
<div className="App">
<Navigation />
<Switch>
<Route exact path="/" component={Home} />
<Route exact path="/about" component={About} />
<Route exact path="/contact" component={MoreRoutes} />
</Switch>
</div>
</BrowserRouter>
)
}
}
并且您需要使用@Mikail Bayram 提到的NavLink,这将允许您也使用activeClassName,您的每条路线都需要该exact
道具,以便仅当路径完全匹配时才呈现路线。请注意,您可以随意调用active
课程。
您的导航应如下所示:
import { NavLink } from "react-router-dom"
const Navigation = () => (
<nav>
<ul>
<li>
<NavLink exact activeClassName="active" to="/">
Home
</NavLink>
</li>
<li>
<NavLink exact activeClassName="active" to="/about">
About
</NavLink>
</li>
<li>
<NavLink exact activeClassName="active" to="/contact">
Contact
</NavLink>
</li>
</ul>
</nav>
)
附带说明:你不应该将jQuery与 React结合使用
推荐阅读
- libxml2 - 如何将 libxml2 作为依赖项添加到 SwiftPM
- php - make loop 如何让数组中的值上瘾
- ethereum - abi:尝试在需要参数时解组空字符串
- asp.net - 将 USB 设备中的物理签名捕获到网页中
- css - 除了开发者模式外,如何实时编辑网站并插入 CSS 和 JS
- loops - Ansible 循环遍历以 count 为键的 dicts 列表
- node.js - 获取 TypeError:wsc.require 不是 hyco-ws npm 包的功能
- python-3.x - 如何将数组中的字符添加到一个字符串python中
- mysql - 数组推送在 promise node.js 中不起作用
- python - Django分页 - 所有页面中的for循环