Маршрутизатор ReactJS изменяет URL, но не страницу

#javascript #reactjs #routes #react-router #react-router-dom

#javascript #reactjs #маршруты #реагировать-маршрутизатор #react-router-dom

Вопрос:

Я создаю веб-сайт-портфолио и использую react BrowserRouter, Link и Switch для управления маршрутизацией моих веб-сайтов. Моя проблема в том, что когда я нажимаю на ссылку «Проекты», она меняется по url, но не отображается, однако, когда я обновляю страницу, она работает.

вот как выглядит моя маршрутизация в настоящее время в моем App.js .

 import React, { Component } from 'react';

import NavBar from './Components/NavBar/NavBar'
import Home from './Components/Home/Home';
import Projects from './Components/Projects/Projects';

import { BrowserRouter ,Switch, Route, } from 'react-router-dom';

class App extends Component {
  
  render() {
    return (
      <div className="App">
        <NavBar />
        <BrowserRouter>
          <Switch>
            <Route path="/" component={Home} exact={true} />
            <Route path="/projects" component={Projects} /> 
          </Switch>
        </BrowserRouter>
      </div>
    );
  }
}

export default App;


  

и это то, что мой Navbar.js похоже на то..

 import React, {useState} from 'react';
import { NavLink, BrowserRouter } from 'react-router-dom'
import { Link } from 'react-scroll';

function NavBar() {
  const [navbar,setNavbar] = useState(false)

  const changeBackground = () => {
    if(window.scrollY >= 100) {
      setNavbar(true)
    } else {
      setNavbar(false)
    }
  }

  window.addEventListener('scroll', changeBackground)

  return(
    <BrowserRouter>
      <ul className="nav bg-white sticky-top nav-tabs nav-justified">
        <li className="nav-item">
          <Link 
            className={navbar ? "nav-link text-dark home" : "nav-link text-secondary home"}
            to="home"
            href="/"
            smooth={true}
            offset={50}
            duration={500}>
            Home
          </Link>
        </li>

        <li className="nav-item">
        <Link 
            className={navbar ? "nav-link text-dark home" : "nav-link text-secondary about"}
            to="about"
            smooth={true}
            offset={50}
            duration={500}>
            About
          </Link>
        </li>

        <li className="nav-item">
          <NavLink to="/projects">Projects</NavLink> //This is the link that won't work. 
        </li>

        <li className="nav-item">
         <Link 
            className={navbar ? "nav-link text-dark home" : "nav-link text-secondary contact"}
            to="contact"
            smooth={true}
            offset={50}
            duration={500}>
            Contact
          </Link>
        </li>
      </ul>
    </BrowserRouter>
      
  
  )
}

export default NavBar
  

Любая помощь была бы отличной!

Комментарии:

1. Оба компонента не меняются или только боковая панель?

Ответ №1:

Проблема в том, что вы определяете два разных BrowserRouter . Вся ваша логика маршрутизации должна находиться под одним BrowserRouter:

Приложение должно быть таким:

 class App extends Component {
  render() {
    return (
      <div className="App">
        <BrowserRouter>
          <NavBar />
          <Switch>
            <Route path="/" component={Home} exact={true} />
            <Route path="/projects" component={Projects} /> 
          </Switch>
        </BrowserRouter>
      </div>
    );
  }
}
  

и на панели навигации не должно быть оберточного BrowserRouter