【问题标题】:React Bootstrap change link of Navbar to activeReact Bootstrap 将导航栏的链接更改为活动
【发布时间】:2020-07-03 19:12:51
【问题描述】:

我使用导航栏作为页面上的组件,它使用路由器来更改内容。到目前为止,一切正常。但我不知道,当他们被点击时,如何将导航栏中的链接状态设置为活动状态。我想,我必须将 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;

【问题讨论】:

    标签: reactjs hyperlink navbar


    【解决方案1】:

    非常感谢!现在一切正常:) 我将导航栏代码写入 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'));
    

    【讨论】:

      【解决方案2】:

      你必须用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的细节。

      【讨论】:

      • 感谢使用 withRouter 的提示。我必须在 index.js 文件中实现导航栏,对吗?我试过了,就像这里显示的 codesandbox.io/s/718p1ovkm1?file=/src/index.js:86-132 但我收到了这个错误消息:错误:不变失败:你不应该在 之外使用
      • 是的,你必须先用BrowserRouter 包装你的NavBar 组件,然后再用withRouter 包装它。正如您提到的那样,您是否注意到他们在Router 中将HeaderWithRouter 包裹在App 组件中的一件事。
      【解决方案3】:

      如果您不想使用路由器并且需要更灵活地更改状态,也可以使用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>
          </>
        );
      };
      

      【讨论】:

        猜你喜欢
        • 2013-08-13
        • 1970-01-01
        • 2012-08-02
        • 2020-09-11
        • 1970-01-01
        • 2021-02-13
        • 1970-01-01
        • 2023-04-08
        • 2018-07-21
        相关资源
        最近更新 更多