Search code examples
bootstrap-4react-bootstrapreact-bootstrap-nav

React-Bootstrap menus do not show the current selection


For example, in the next image, the menu selected was about, the address string shows it, but the menu tab is still showing home

enter image description here

I am a newbie with Bootstrap

The code is this:

import React, { useState } from 'react';

import { Nav, NavDropdown } from 'react-bootstrap';

import 'bootstrap/dist/css/bootstrap.min.css';

export default function NavSample() {
    const [key, setKey] = useState('home');

    const handleSelect = (key) => {
        setKey(key);
    };

    return (
        <Nav variant="pills" activeKey="home" onSelect={handleSelect} defaultActiveKey="home">
            <Nav.Item>
                <Nav.Link eventKey="home" href="/home">
                    Home
                </Nav.Link>
            </Nav.Item>
            <Nav.Item>
                <Nav.Link eventKey="about" href="/about" title="about">
                    About
                </Nav.Link>
            </Nav.Item>
            <Nav.Item>
                <Nav.Link eventKey="contact" href="/contact">Contact</Nav.Link>
            </Nav.Item>
            <NavDropdown title="Pricing" id="nav-dropdown">
                <NavDropdown.Item eventKey="Basic pricing" href="/pricing/basic pricing">Basic</NavDropdown.Item>
                <NavDropdown.Item eventKey="Corporate Pricing" href="/pricing/corporate pricing">Corporates</NavDropdown.Item>
                <NavDropdown.Divider />
                <NavDropdown.Item eventKey="Enterprise Pricing" href="/pricing/enterprise pricing">Enterprise</NavDropdown.Item>
            </NavDropdown>
        </Nav>
    );
}

What am I missing?

Rafael


Solution

  • So to deal with state resets you need to use React router for your routes instead of just hrefs

    You need to install react-router-dom and react-router-bootstrap packages as well.

    Here's a working example:

    import 'bootstrap/dist/css/bootstrap.min.css';
    
    import React, { useState } from 'react';
    import { Nav, NavDropdown } from 'react-bootstrap';
    import { BrowserRouter as Router } from 'react-router-dom';
    import { LinkContainer } from 'react-router-bootstrap';
    
    export default function NavTabs({ active_key }) {
      const [key, setKey] = useState(active_key);
    
      const handleSelect = (key) => {
        console.log(`selected ${key}`);
        setKey(key);
      };
    
      console.log(`Rendering with ${key}`);
      return (
        <Router>
          <Nav variant="pills" activeKey={key} onSelect={handleSelect}>
            <LinkContainer to="/home">
              <Nav.Link eventKey="home">Home</Nav.Link>
            </LinkContainer>
            <LinkContainer to="/about">
              <Nav.Link eventKey="about" title="about">
                About
              </Nav.Link>
            </LinkContainer>
            <LinkContainer to="/contacts">
              <Nav.Link eventKey="contact">Contact</Nav.Link>
            </LinkContainer>
            <NavDropdown title="Pricing" id="nav-dropdown">
              <NavDropdown.Item eventKey="Basic pricing" href="/pricing/basic pricing">
                Basic
              </NavDropdown.Item>
              <NavDropdown.Item eventKey="Corporate Pricing" href="/pricing/corporate pricing">
                Corporates
              </NavDropdown.Item>
              <NavDropdown.Divider />
              <NavDropdown.Item eventKey="Enterprise Pricing" href="/pricing/enterprise pricing">
                Enterprise
              </NavDropdown.Item>
            </NavDropdown>
          </Nav>
        </Router>
      );
    }
    

    and when you use this component (e.g. from <App>), supply the starting tab:

    function App() {
      return (<NavTabs active_key="home"/>)
    }