Reputation: 201
I am new to React and am using Material Design for Bootstrap (MDB) to create a NavBar component for my app. I have updated the Link tags in the NavBar to point to my own routes, but when I click on the links, the URL changes in the address bar, but the page does not update.
I am using React Router for routing, and I have not encountered this problem before. The strange thing is that I have another Link tag in my app that works perfectly fine, but the ones in the NavBar do not.
Here is my code:
Index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router} from "react-router-dom";
import '@fortawesome/fontawesome-free/css/all.min.css';
import 'bootstrap-css-only/css/bootstrap.min.css';
import 'mdbreact/dist/css/mdb.css';
import App from './App';
ReactDOM.render(
<Router>
<App/>
</Router>
,document.getElementById('root'));
app.js
import React from 'react';
import { BrowserRouter as Router, Route,Switch} from "react-router-dom";
import { Link } from "react-router-dom";
import Home from './pages/Home';
import Courses from './pages/Courses'
import Navbar from './components/Navbar'
import Signin from './pages/Sign-in'
import Register from './pages/Register'
import ErrorPage from './components/ErrorPage'
import SingleCourse from './pages/SingleCourse'
import './App.css'
import {
MDBContainer,
} from 'mdbreact';
import Footer from './components/Footer'
function App() {
return (
<>
<Navbar/>
<MDBContainer>
<Switch>
<Route exact path="/" component={Home}/>
<Route exact path="/courses" component={Courses}/>
<Route exact path="/courses/:id" component={SingleCourse}/>
<Route path="/sign-in" component={Signin}/>
<Route path="/register" component={Register}/>
<Route component={ErrorPage}/>
</Switch>
</MDBContainer>
<Footer/>
</>
);
}
export default App;
NavBar
import React, { Component } from "react";
import { Link,BrowserRouter as Router } from "react-router-dom";
import Home from '../pages/Home'
import {
MDBNavbar, MDBNavbarBrand, MDBNavbarNav, MDBNavItem, MDBNavLink, MDBNavbarToggler, MDBCollapse, MDBFormInline,
MDBDropdown, MDBDropdownToggle, MDBDropdownMenu, MDBDropdownItem
} from "mdbreact";
class NavbarPage extends Component {
state = {
isOpen: false
};
toggleCollapse = () => {
this.setState({ isOpen: !this.state.isOpen });
}
handleClick() {
;
}
render() {
return (
<Router>
<MDBNavbar className="Navbar" dark expand="md" style={{backgroundImage: "linear-gradient(" + "to left, #D53D96 , #7A2A90"+" )"}}>
<MDBNavbarBrand>
<strong className="white-text">Navbar</strong>
</MDBNavbarBrand>
<MDBNavbarToggler onClick={this.toggleCollapse} />
<MDBCollapse id="navbarCollapse3" isOpen={this.state.isOpen} navbar>
<MDBNavbarNav left>
<MDBNavItem >
<MDBNavLink to="/"> ////////HERE iS THE PROBLEM(I Change It Many Times!)
Home
</MDBNavLink>
</MDBNavItem>
<MDBNavItem>
<MDBDropdown>
<MDBDropdownToggle nav caret>
<span className="mr-2">Courses</span>
</MDBDropdownToggle>
<MDBDropdownMenu>
<MDBDropdownItem href="#!">Action</MDBDropdownItem>
<MDBDropdownItem href="#!">Another Action</MDBDropdownItem>
<MDBDropdownItem href="#!">Something else here</MDBDropdownItem>
<MDBDropdownItem href="#!">Something else here</MDBDropdownItem>
</MDBDropdownMenu>
</MDBDropdown>
</MDBNavItem>
<MDBNavItem>
<MDBFormInline waves>
<div className="md-form my-0">
<input className="form-control mr-sm-2" type="text" placeholder="Search" aria-label="Search" />
</div>
</MDBFormInline>
</MDBNavItem>
</MDBNavbarNav>
<MDBNavbarNav right>
<MDBNavItem>
<MDBNavLink to="#!">My Courses</MDBNavLink>
</MDBNavItem>
<MDBNavItem>
<MDBNavLink to="#!">Personal Info</MDBNavLink>
</MDBNavItem>
</MDBNavbarNav>
</MDBCollapse>
</MDBNavbar>
</Router>
);
}
}
export default NavbarPage;
Upvotes: 1
Views: 1257
Reputation: 348
Try removing the BrowserRouter or Router( in your case) tag from all others except the index.js. Then I think this will work fine.
Upvotes: 4
Reputation: 5631
You shouldn't have <Router>
in your Navbar
. It's already on Index.js Check: https://reacttraining.com/react-router/core/api/Router
and change Navbar and Footer to be inside MDBContainer
like:
<>
<MDBContainer>
<Navbar/>
<Switch>
<Route exact path="/" component={Home}/>
<Route exact path="/courses" component={Courses}/>
<Route exact path="/courses/:id" component={SingleCourse}/>
<Route path="/sign-in" component={Signin}/>
<Route path="/register" component={Register}/>
<Route component={ErrorPage}/>
</Switch>
<Footer/>
</MDBContainer>
</>
because those are using MDB components.
Upvotes: 1
Reputation: 15
You don't need to import BrowserRouter
multiple times, one time on the index.js
file is enough for the whole app. Your "/"
path is not related to the "/"
path on your App.js
file, delete the Router
on the NavBar component and it should work fine.
Upvotes: 1