I took a break from my project for a day and today I come back to and suddenly i have an issue with my react router. I was messing around with adding more components but deleted them and now my Homepage, about, or gallery component dont render when I change the page with then navbar. The url still changes if i click on gallery to /gallery but the <h1>Gallery page</h1> does not show up anymore.
App.js
import React, { Component } from 'react';
import './App.css';
import NavigationBar from './components/navbar';
import About from './components/About';
import Home from './components/homepage';
import Gallery from './components/gallery';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
class App extends Component {
state = {};
render() {
return (
<Router>
<div className="App">
<NavigationBar />
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
<Route path="/gallery" component={Gallery} />
</Switch>
</div>
</Router>
);
}
}
export default App;
Homepage
import '../css/homepage.scss';
class Homepage extends Component {
state = {};
render() {
return (
<div>
<h1>Hello</h1>
</div>
);
}
}
export default Homepage;
About
class About extends Component {
state = {};
render() {
return <h1>About</h1>;
}
}
export default About;
Gallery
class gallery extends Component {
state = {};
render() {
return <h1>Gallery page</h1>;
}
}
export default gallery;
Nav code
import React, { Component } from 'react';
import Navbar from 'react-bootstrap/Navbar';
import Nav from 'react-bootstrap/Nav';
import { link } from 'react-router-dom';
import { NavLink } from 'react-router-dom';
import '../css/navbar.scss';
import $ from 'jquery';
import logo from '../images/logo.png';
class NavigationBar extends Component {
state = {};
render() {
return (
<Navbar fixed="top" className="navbarr" bg="light" expand="sm">
<Navbar.Brand
activeClassName="nav-link--active"
className="BrandLink"
href="/"
>
<img
alt=""
src={logo}
width="45"
height="30"
className="d-inline-block align-top"
/>
BRAND NAME HERE
</Navbar.Brand>
<Navbar.Toggle />
<Navbar.Collapse className="justify-content-end">
<Nav className="ml-auto">
<Nav.Link
className="NavLink"
activeClassName="nav-link--active"
href="/About"
>
About
</Nav.Link>
<Nav.Link
className="NavLink"
activeClassName="nav-link--active"
href="/Gallery"
>
Gallery
</Nav.Link>
</Nav>
</Navbar.Collapse>
</Navbar>
);
}
}
export default NavigationBar;
Try moving your default route to the end of routes. i.e.
import React, { Component } from 'react';
import './App.css';
import NavigationBar from './components/navbar';
import About from './components/About';
import Home from './components/homepage';
import Gallery from './components/gallery';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
class App extends Component {
state = {};
render() {
return (
<Fragment>
<div className="App">
<NavigationBar />
</div>
<Router>
<Switch>
<Route path="/about" component={About} />
<Route path="/gallery" component={Gallery} />
<Route path="/" component={Home} />
</Switch>
</Router>
</Fragment>
);
}
}
export default App;
The problem is with you Navbar components. Try this one:
import React, { Component } from "react";
import Navbar from "react-bootstrap/Navbar";
import Nav from "react-bootstrap/Nav";
import { Link } from "react-router-dom";
import "../css/navbar.scss";
import $ from "jquery";
import logo from "../images/logo.png";
class NavigationBar extends Component {
state = {};
render() {
return (
<Navbar fixed="top" className="navbarr" bg="light" expand="sm">
<Navbar.Brand activeClassName="nav-link--active" className="BrandLink">
<Link to="/">
<img
alt=""
src={logo}
width="45"
height="30"
className="d-inline-block align-top"
/>
BRAND NAME HERE
</Link>
</Navbar.Brand>
<Navbar.Toggle />
<Navbar.Collapse className="justify-content-end">
<Nav className="ml-auto">
<Nav.Link className="NavLink" activeClassName="nav-link--active">
<Link to="/about">About</Link>
</Nav.Link>
<Nav.Link className="NavLink" activeClassName="nav-link--active">
<Link to="/gallery">Gallery</Link>
</Nav.Link>
</Nav>
</Navbar.Collapse>
</Navbar>
);
}
}
export default NavigationBar;
Related
I am working on a retirement calculator. It has a navigation component with links, I set a router with paths in App.js. But the navlinks do not work. I am not sure what is wrong with the code. Please help I am new to reactjs
App.js
import logo from './logo.svg';
import './App.css';
import InputForm from './InputForm';
import Navigation from './Navigation';
import 'bootstrap/dist/css/bootstrap.min.css';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import DisplayTable from './DisplayTable';
import RetirementComaparisionForm from './RetirementComparisionForm';
function App() {
return (
<BrowserRouter>
<div className="App">
<Navigation />
<Switch>
<Route exact path = "/" component = {InputForm}></Route>
<Route exact path = "/retirementcomaparisionform" component = {RetirementComaparisionForm}></Route>
</Switch>
</div>
</BrowserRouter>
);
}
export default App;
Navigation.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import DisplayTable from './DisplayTable';
import {NavLink} from 'react-router-dom';
import {Navbar, Nav} from 'react-bootstrap';
class Navigation extends React.Component{
render(){
return(
<Navbar bg="dark" expand="lg" variant = "dark">
<Navbar.Brand>Retirement Calculator</Navbar.Brand>
<Navbar.Toggle aria-controls="basic-navbar-nav" />
<Navbar.Collapse id="basic-navbar-nav">
<Nav className="mr-auto">
<Nav.Link to = "/">Home</Nav.Link>
<Nav.Link to = "/retirementcomaparisionform">Compare</Nav.Link>
</Nav>
</Navbar.Collapse>
</Navbar>
)
}
}
export default Navigation;
Here is the working Example: StackBlitz
import React from "react";
import ReactDOM from "react-dom";
import reportWebVitals from "./reportWebVitals";
import DisplayTable from "./DisplayTable";
import { NavLink, Link } from "react-router-dom";
import { Navbar, Nav } from "react-bootstrap";
import "bootstrap/dist/css/bootstrap.min.css";
import { BrowserRouter, Route, Switch } from "react-router-dom";
function App() {
return (
<BrowserRouter>
<div className="App">
<Navigation />
<Switch>
<Route exact path="/" component={InputForm} />
<Route
path="/retirementcomaparisionform"
component={RetirementComaparisionForm}
/>
</Switch>
</div>
</BrowserRouter>
);
}
export default App;
class Navigation extends React.Component {
render() {
return (
<Navbar bg="dark" expand="lg" variant="dark">
<Navbar.Brand>Retirement Calculator</Navbar.Brand>
<Navbar.Toggle aria-controls="basic-navbar-nav" />
<Navbar.Collapse id="basic-navbar-nav">
<Nav className="mr-auto">
<Nav.Link href="/">Home</Nav.Link>
<Nav.Link href="/retirementcomaparisionform">Compare</Nav.Link>
</Nav>
</Navbar.Collapse>
</Navbar>
);
}
}
//dummy InputForm and RetirementComaparisionForm components
const InputForm = () => {
return <h1>Input Form</h1>;
};
const RetirementComaparisionForm = () => {
return <h1>Retirement Comaparision Form</h1>;
};
I'm working on converting a website from a static HTML/CSS/JS site into a React SPA and I want to use React Router for navigation. I installed Router into the correct directory, ran npm start from the correct directory, and my Terminal shows that everything compiled successfully, but my browser looks like this:
App.js file:
import React from 'react';
import './styles/App.css';
import Navbar from './components/Navbar';
class App extends React.Component {
render() {
return (
<div className = "App">
<div id ='container' className = 'container light'>
<Navbar />
</div>
</div>
)
}
}
export default App;
Navbar.js file:
import React, { Component } from 'react';
import '../styles/App.css';
import logo from '../img/logo.png'
import {
BrowserRouter as Router,
Switch,
Route,
Link
} from "react-router-dom";
import App from '../App';
import About from './About';
import Portfolio from './Portfolio';
class Navbar extends Component {
render() {
return (
<Router>
<div className="Navbar">
<nav>
<ul className="navlist">
<Link to={App}>
<li className="active">Home</li>
</Link>
<Link to={About}>
<li>About Me</li>
</Link>
<Link to={App}>
<img className="brand" src={logo} alt="" />
</Link>
<Link to={Portfolio}>
<li>Portfolio</li>
</Link>
<li className="toggler"><span role="img" aria-label="dark moon">🌑</span></li>
</ul>
</nav>
<Switch>
<Route path= {About}>
<About />
</Route>
<Route path= {Portfolio}>
<Portfolio />
</Route>
<Route path= '{App}'>
<App />
</Route>
</Switch>
</div>
</Router>
)
}
}
export default Navbar;
About.JS
import React, { Component } from 'react';
import '../styles/App.css';
import Navbar from './Navbar'
class About extends Component {
render() {
return (
<div className="About">
<Navbar />
<h1>Hello World, This is the About Page</h1>
</div>
)
}
}
export default About;
Portfolio.JS
import React, { Component } from 'react';
import '../styles/App.css';
import Navbar from './Navbar'
class Portfolio extends Component {
render() {
return (
<div className="Portfolio">
<Navbar />
<h1>Hello World, This is the Portfolio Page</h1>
</div>
)
}
}
export default Portfolio;
I'm new to React and I'm not sure what I've done wrong. Happy to share any additional information needed.
That's not how Link is used, the to prop should have the path you want to navigate, and then you have to use the Route HOC with two options, pass the component as a child or in the component prop
Link
<Link to="/about">
About
</Link>
Route
<Route path="/about" component={About} />
<Route path="/about">
<About/>
</Route>
I'm fairly new to React and I'm trying to implement Navbar with react-bootstrap. I have the navigation bar set up but its not actually linking to any of my pages.
I've tried looking through the documentation but there's not much information there. I've looked at other posts but they all seem to be using older versions of react-bootstrap or not using it at all.
import React from "react";
import ReactDOM from "react-dom";
import "./components/stylesheets/index.css";
import * as serviceWorker from "./serviceWorker";
import "bootstrap/dist/css/bootstrap.min.css";
import App from "./App";
ReactDOM.render(<App />, document.getElementById("root"));
serviceWorker.unregister();
import React, { Component } from "react";
import "./components/stylesheets/App.css";
import NavBar from "./components/NavBar";
import Home from "./components/Home";
import About from "./components/About";
class App extends Component {
render() {
return <NavBar />;
}
}
export default App;
import React, { Component } from "react";
import { Navbar, Nav, Form, FormControl, Button } from "react-bootstrap";
import "./stylesheets/NavBar.css";
class NavBar extends Component {
state = {};
render() {
return (
<div id="bar">
<Navbar bg="light" variant="light">
<Navbar.Brand href="#home">CALC-U</Navbar.Brand>
<Nav className="ml-auto">
<Nav.Link href="#home">Home</Nav.Link>
<Nav.Link href="#about">About</Nav.Link>
<Nav.Link href="#updates">Updates</Nav.Link>
<Nav.Link href="#profile">Profile</Nav.Link>
</Nav>
</Navbar>
</div>
);
}
}
export default NavBar;
I want the app to open up to the Home page automatically, and then open up the other pages if the button is clicked on in the navBar.
Edit: I've created a working example, you can check the code: Codesandbox
Seems like you're not using react-router for handling the links.
First you need to wrap your component with a BrowserRouter like so:
import { BrowserRouter } from "react-router-dom";
import App from "./App";
const app = (
<BrowserRouter>
<App />
</BrowserRouter>
);
ReactDOM.render(app, document.getElementById("root"));
And in NavBar.js, inside a <Switch /> component, you declare the routes:
import { Switch, Route, Link } from "react-router-dom";
//(...)
<Switch>
<Route exact path="/" component={Home} />
<Route path="/about" component={About} />
</Switch>
In your case, you case use Link component inside your Nav.Link:
<Nav className="ml-auto">
<Nav.Link as={Link} to="/">Home</Nav.Link>
<Nav.Link as={Link} to="/about">About</Nav.Link>
</Nav>
Same applies if you want to add more links to the NavBar.
Sample application using react-bootstrap for Navbar
App.js
function App() {
return (
<div>
<Router>
<NavBar />
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" exact component={About} />
<Route path="/updates" exact component={Updates} />
<Route path="/profile" exact component={Profile} />
</Switch>
</Router>
</div>
);
}
const Home = () => <h1>Home</h1>;
const About = () => <h1>About</h1>;
const Updates = () => <h1>Updates</h1>;
const Profile = () => <h1>Profile</h1>;
NavBar.js
class NavBar extends React.Component {
state = {};
render() {
return (
<div id="bar">
<Navbar bg="light" variant="light">
<Navbar.Brand href="/">CALC-U</Navbar.Brand>
<Nav className="ml-auto">
<Nav.Link href="/">Home</Nav.Link>
<Nav.Link href="/about">About</Nav.Link>
<Nav.Link href="/updates">Updates</Nav.Link>
<Nav.Link href="/profile">Profile</Nav.Link>
</Nav>
</Navbar>
</div>
);
}
}
I am sure I exported all my components, yet I keep getting the same error:
Element type is invalid: expected a string (for built-in components) or a class/function (for composite components)but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports. Check the render method of CustomNavbar.
App.js
import React, { Component } from 'react';
import './App.css';
import { BrowserRouter as Router, Route } from 'react-router-dom';
import Home from './Home.js';
import Navbar from './CustomNavbar.js';
class App extends Component {
render() {
return (
<Router>
<div>
<Navbar />
<Route exact path="/" component={Home} />
</div>
</Router>
);
}
}
export default App;
CustomNavbar.js
import React, { Component } from 'react'
import { Navbar, Nav, NavItem } from 'react-bootstrap';
import { Link } from 'react-router-dom';
export default class CustomNavbar extends Component {
render() {
return (
<Navbar default collapseOnSelect>
<Navbar.Header>
<Navbar.Brand>
<Link to="/">My Page</Link>
</Navbar.Brand>
<Navbar.Toggle />
</Navbar.Header>
<Navbar.Collapse>
<Nav pullRight>
<NavItem eventKey={1} componentClass={Link} to="/">
Home
</NavItem>
</Nav>
</Navbar.Collapse>
</Navbar>
)
}
}
Home.js
import React, { Component } from 'react'
import { Link } from 'react-router-dom'
import { Jumbotron, Button } from 'react-bootstrap';
export default class Home extends Component {
render() {
return(
<div>
<Jumbotron>
<h1>Hello, this is my page</h1>
</Jumbotron>
<Link to="/about">
<Button bsStyle="primary">About</Button>
</Link>
</div>
)
}
}
Change this
import Navbar from './CustomNavbar.js';
to
import CustomNavbar from './CustomNavbar.js';
And
Change
<Navbar />
To
<CustomNavbar />
In App.js
My site's entering scenario is
/ -> /home
-> /about
-> /project
When connect to site.com/, there is welcome message and enter button.
After click the 'enter' button, /home will be show.
And /home has Navbar that has two components /about and /project
So, user can click the navbar menu to navigate another page.
/about is works properly, but /project doesn't work. It displayed blank page.
[App.js]
import React, { Component } from 'react';
import './App.css';
import { BrowserRouter as Router, Route } from 'react-router-dom';
import Login from './components/Login';
import Home from './components/Home';
import Project from './components/Project';
class App extends Component {
render() {
return (
<Router>
<div className="App">
<Route exact path="/" component={Login} />
<Route path="/home" component={Home} />
</div>
</Router>
);
}
}
export default App;
[Home.js]
import React, { Component } from 'react';
import Header from '../Header';
import Project from '../Project';
import About from '../About';
import 'bootstrap/dist/css/bootstrap.min.css';
import { BrowserRouter, Route } from 'react-router-dom'
import {
Navbar,
NavbarBrand,
Nav,
NavItem,
NavLink } from 'reactstrap';
class index extends Component {
render() {
return (
<BrowserRouter>
<div className="home">
<Header />
<Route path="/home" component={About}/>
<Route path="/project" component={Project}/>
</div>
</BrowserRouter>
);
}
}
export default index;
[Header.js]
import React, { Component } from 'react';
import {
Navbar,
NavbarBrand,
Nav,
NavItem,
NavLink } from 'reactstrap';
class index extends Component {
render() {
return (
<div className="navbar_fixed">
<Navbar color="light" light expand="md">
<NavbarBrand href="/">Hide</NavbarBrand>
<Nav className="ml-auto" navbar>
<NavItem>
<NavLink href="/home">About</NavLink>
</NavItem>
<NavItem>
<NavLink href="/project">Project</NavLink>
</NavItem>
</Nav>
</Navbar>
</div>
);
}
}
export default index;
[About.js]
import React, { Component } from 'react';
import './index.css';
export default class index extends Component {
render() {
return (
<div>
Some codes for About.js
</div>
);
}
}
[Project.js]
import React, { Component } from 'react';
import './index.css';
export default class index extends Component {
render() {
return (
<div>
Some codes for Project.js
</div>
);
}
}
When I entered to /home, It shows About.js component with navbar.
But entered to /project, It show nothing.
I can't find where is the error.
How can I fixed it?
Thanks.
[SOLVED]
Change the code to Shubham Khatri's code and add exact to <Route exact path="/home" component={About}/>
Your Header component isn't receiving the react-router props and hence its navigation doesn't work properly, You could write Header as a default Route. Also you need to use BrowserRouter only once at the top of your App
Also with nested Route, you need to specify the relative routes
class index extends Component {
render() {
const { match } = this.props;
return (
<div className="home">
<Route component={Header} />
<Switch>
<Route path={`${match.path}/project`} component={Project}/>
<Route path="/home" component={About}/>
</Switch>
</div>
);
}
}
and your Header.js will be
import React, { Component } from 'react';
import {
Navbar,
NavbarBrand,
Nav,
NavItem,
NavLink } from 'reactstrap';
class index extends Component {
render() {
const { match } = this.props;
return (
<div className="navbar_fixed">
<Navbar color="light" light expand="md">
<NavbarBrand href="/">Hide</NavbarBrand>
<Nav className="ml-auto" navbar>
<NavItem>
<NavLink href="/home">About</NavLink>
</NavItem>
<NavItem>
<NavLink href={`${match.url}/project`}>Project</NavLink>
</NavItem>
</Nav>
</Navbar>
</div>
);
}
}
export default index;