反应 Bootstrap 将导航栏 link 更改为活动状态
React Bootstrap change link of Navbar to active
我在页面上使用导航栏作为组件,它使用路由器来更改内容。到目前为止,一切正常。但是我无法弄清楚,当单击它们时,如何将导航栏中的链接状态设置为活动状态。我想,我必须将 Nav 元素的 activeKey 绑定到活动内容的 location.pathname。
这是我的导航栏组件:
import React from 'react';
import { Navbar, Nav } from 'react-bootstrap';
class Navbar extends React.Component{
constructor() {
super();
this.state = {
show: false
};
}
render(){
return(
<div>
<Navbar collapseOnSelect expand="lg" bg="dark" variant="dark">
<Navbar.Brand >Filmmusic</Navbar.Brand>
<Navbar.Toggle aria-controls="responsive-navbar-nav" />
<Navbar.Collapse id="responsive-navbar-nav">
<Nav activeKey="/" className="mr-auto">
<Nav.Link href="/">Home</Nav.Link>
<Nav.Link href="/about">About</Nav.Link>
<Nav.Link onClick = {()=>{this.handleModal()}}>Contact</Nav.Link>
</Nav>
<Nav>
<Nav.Link href="/impressum">Impressum</Nav.Link>
<Nav.Link href="/datenschutzerklaerung">Datenschutzerklärung</Nav.Link>
</Nav>
</Navbar.Collapse>
</Navbar>
</div>
)
}
}
export default Navbar;
你必须用 withRouter
HOC 包装你的 NavBar
组件。然后您可以进行这些更改:
render(){
const { location } = props; //add this
return(
<div>
<Navbar collapseOnSelect expand="lg" bg="dark" variant="dark">
<Navbar.Brand >Filmmusic</Navbar.Brand>
<Navbar.Toggle aria-controls="responsive-navbar-nav" />
<Navbar.Collapse id="responsive-navbar-nav">
<Nav activeKey={location.pathname} className="mr-auto"> //Update this
<Nav.Link href="/">Home</Nav.Link>
<Nav.Link href="/about">About</Nav.Link>
<Nav.Link onClick = {()=>{this.handleModal()}}>Contact</Nav.Link>
<Nav.Link href="/impressum">Impressum</Nav.Link>
<Nav.Link href="/datenschutzerklaerung">Datenschutzerklärung</Nav.Link>
</Nav>
</Navbar.Collapse>
</Navbar>
</div>
)
}
有关 withRouter HOC 的更多详细信息。
非常感谢!现在一切正常 :) 我将 Navbar 代码写入 index.js,而不是使用组件。我将所有组件都放在 Router 元素下面。这是我的 index.js:
的最终代码
import React from 'react';
import ReactDOM from 'react-dom';
import './App.css';
import 'bootstrap/dist/css/bootstrap.min.css';
import { BrowserRouter as Router, Route, Switch} from 'react-router-dom';
import { Home } from './components/Home';
import { About } from './components/About';
import { Contact } from './components/Contact';
import { NoMatch } from './components/NoMatch';
import { Impressum } from './components/Impressum';
import { Datenschutzerklaerung } from './components/Datenschutzerklaerung';
import { Layout } from './components/Layout';
import { Jumbotron } from './components/Jumbotron';
import Footer from './components/Footer';
import './fontawesome';
import { Navbar, Nav } from "react-bootstrap";
import { withRouter } from "react-router";
const Header = props => {
const { location } = props;
return (
<Navbar collapseOnSelect expand="lg" bg="dark" variant="dark">
<Navbar.Brand >Filmmusic</Navbar.Brand>
<Navbar.Toggle aria-controls="responsive-navbar-nav" />
<Navbar.Collapse id="responsive-navbar-nav">
<Nav activeKey={location.pathname} className="mr-auto">
<Nav.Link href="/">Home</Nav.Link>
<Nav.Link href="/about">About</Nav.Link>
<Nav.Link href="/contact">Contact</Nav.Link>
</Nav>
<Nav activeKey={location.pathname}>
<Nav.Link href="/impressum">Impressum</Nav.Link>
<Nav.Link href="/datenschutzerklaerung">Datenschutzerklärung</Nav.Link>
</Nav>
</Navbar.Collapse>
</Navbar>
);
};
const HeaderWithRouter = withRouter(Header);
class MyHeader extends React.Component {
render() {
return (
<React.Fragment>
<Router>
<HeaderWithRouter />
<Jumbotron />
<Switch>
<Route exact path="/" component={Home} />
<Layout>
<Route path="/about" component={About} />
<Route path="/contact" component={Contact} />
<Route path="/impressum" component={Impressum} />
<Route path="/datenschutzerklaerung" component={Datenschutzerklaerung} />
</Layout>
<Route component={NoMatch} />
</Switch>
</Router>
<Footer />
</React.Fragment>
);
}
}
ReactDOM.render(<MyHeader />, document.getElementById('root'));
如果您不想使用路由器并且需要更灵活地更改状态,您还可以使用 useState
挂钩:
export const Nav = () => {
const [active, setActive] = useState('default');
return (
<>
<Nav
className="sub-nav"
activeKey={active}
onSelect={(selectedKey) => setActive(selectedKey)}
>
<Nav.Item>
<Nav.Link eventKey="default">Default</Nav.Link>
</Nav.Item>
<Nav.Item>
<Nav.Link eventKey="link-1">Link 1</Nav.Link>
</Nav.Item>
<Nav.Item>
<Nav.Link eventKey="link-2">Link 2</Nav.Link>
</Nav.Item>
<Nav.Item>
<Nav.Link eventKey="disabled" disabled>
Disabled
</Nav.Link>
</Nav.Item>
</Nav>
</>
);
};
我在页面上使用导航栏作为组件,它使用路由器来更改内容。到目前为止,一切正常。但是我无法弄清楚,当单击它们时,如何将导航栏中的链接状态设置为活动状态。我想,我必须将 Nav 元素的 activeKey 绑定到活动内容的 location.pathname。
这是我的导航栏组件:
import React from 'react';
import { Navbar, Nav } from 'react-bootstrap';
class Navbar extends React.Component{
constructor() {
super();
this.state = {
show: false
};
}
render(){
return(
<div>
<Navbar collapseOnSelect expand="lg" bg="dark" variant="dark">
<Navbar.Brand >Filmmusic</Navbar.Brand>
<Navbar.Toggle aria-controls="responsive-navbar-nav" />
<Navbar.Collapse id="responsive-navbar-nav">
<Nav activeKey="/" className="mr-auto">
<Nav.Link href="/">Home</Nav.Link>
<Nav.Link href="/about">About</Nav.Link>
<Nav.Link onClick = {()=>{this.handleModal()}}>Contact</Nav.Link>
</Nav>
<Nav>
<Nav.Link href="/impressum">Impressum</Nav.Link>
<Nav.Link href="/datenschutzerklaerung">Datenschutzerklärung</Nav.Link>
</Nav>
</Navbar.Collapse>
</Navbar>
</div>
)
}
}
export default Navbar;
你必须用 withRouter
HOC 包装你的 NavBar
组件。然后您可以进行这些更改:
render(){
const { location } = props; //add this
return(
<div>
<Navbar collapseOnSelect expand="lg" bg="dark" variant="dark">
<Navbar.Brand >Filmmusic</Navbar.Brand>
<Navbar.Toggle aria-controls="responsive-navbar-nav" />
<Navbar.Collapse id="responsive-navbar-nav">
<Nav activeKey={location.pathname} className="mr-auto"> //Update this
<Nav.Link href="/">Home</Nav.Link>
<Nav.Link href="/about">About</Nav.Link>
<Nav.Link onClick = {()=>{this.handleModal()}}>Contact</Nav.Link>
<Nav.Link href="/impressum">Impressum</Nav.Link>
<Nav.Link href="/datenschutzerklaerung">Datenschutzerklärung</Nav.Link>
</Nav>
</Navbar.Collapse>
</Navbar>
</div>
)
}
有关 withRouter HOC 的更多详细信息。
非常感谢!现在一切正常 :) 我将 Navbar 代码写入 index.js,而不是使用组件。我将所有组件都放在 Router 元素下面。这是我的 index.js:
的最终代码import React from 'react';
import ReactDOM from 'react-dom';
import './App.css';
import 'bootstrap/dist/css/bootstrap.min.css';
import { BrowserRouter as Router, Route, Switch} from 'react-router-dom';
import { Home } from './components/Home';
import { About } from './components/About';
import { Contact } from './components/Contact';
import { NoMatch } from './components/NoMatch';
import { Impressum } from './components/Impressum';
import { Datenschutzerklaerung } from './components/Datenschutzerklaerung';
import { Layout } from './components/Layout';
import { Jumbotron } from './components/Jumbotron';
import Footer from './components/Footer';
import './fontawesome';
import { Navbar, Nav } from "react-bootstrap";
import { withRouter } from "react-router";
const Header = props => {
const { location } = props;
return (
<Navbar collapseOnSelect expand="lg" bg="dark" variant="dark">
<Navbar.Brand >Filmmusic</Navbar.Brand>
<Navbar.Toggle aria-controls="responsive-navbar-nav" />
<Navbar.Collapse id="responsive-navbar-nav">
<Nav activeKey={location.pathname} className="mr-auto">
<Nav.Link href="/">Home</Nav.Link>
<Nav.Link href="/about">About</Nav.Link>
<Nav.Link href="/contact">Contact</Nav.Link>
</Nav>
<Nav activeKey={location.pathname}>
<Nav.Link href="/impressum">Impressum</Nav.Link>
<Nav.Link href="/datenschutzerklaerung">Datenschutzerklärung</Nav.Link>
</Nav>
</Navbar.Collapse>
</Navbar>
);
};
const HeaderWithRouter = withRouter(Header);
class MyHeader extends React.Component {
render() {
return (
<React.Fragment>
<Router>
<HeaderWithRouter />
<Jumbotron />
<Switch>
<Route exact path="/" component={Home} />
<Layout>
<Route path="/about" component={About} />
<Route path="/contact" component={Contact} />
<Route path="/impressum" component={Impressum} />
<Route path="/datenschutzerklaerung" component={Datenschutzerklaerung} />
</Layout>
<Route component={NoMatch} />
</Switch>
</Router>
<Footer />
</React.Fragment>
);
}
}
ReactDOM.render(<MyHeader />, document.getElementById('root'));
如果您不想使用路由器并且需要更灵活地更改状态,您还可以使用 useState
挂钩:
export const Nav = () => {
const [active, setActive] = useState('default');
return (
<>
<Nav
className="sub-nav"
activeKey={active}
onSelect={(selectedKey) => setActive(selectedKey)}
>
<Nav.Item>
<Nav.Link eventKey="default">Default</Nav.Link>
</Nav.Item>
<Nav.Item>
<Nav.Link eventKey="link-1">Link 1</Nav.Link>
</Nav.Item>
<Nav.Item>
<Nav.Link eventKey="link-2">Link 2</Nav.Link>
</Nav.Item>
<Nav.Item>
<Nav.Link eventKey="disabled" disabled>
Disabled
</Nav.Link>
</Nav.Item>
</Nav>
</>
);
};