This is my Layout page where the routing is performed:
import React from 'react';
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import Header from './Header';
import Footer from './Footer';
import Banner from './Banner';
import Home from './Home';
import About from './About';
import Services from './Services';
import Book from './Book';
function Layout() {
return(
<Router>
<Header/>
<Banner/>
<Route exact path="/" component={Home}/>
<Route exact path="/Home" component={Home}/>
<Route exact path="/About" component={About}/>
<Route exact path="/Services" component={Services}/>
<Route exact path="/Book" component={Book}/>
<Footer/>
</Router>
)
}
export default Layout;
This is the Banner component:
import React from 'react';
import Jumbotron from 'react-bootstrap/Jumbotron';
function Banner(props) {
const heroStyle = {
backgroundImage: "url(" + require('../images/home-hero-image.jpg') + ")"
};
return (
<div>
<Jumbotron style={heroStyle}>
<h1 className="centerme">Live your best life</h1>
<p className="centerme">
Get Coaching
</p>
</Jumbotron>
</div>
);
}
export default Banner;
Basically I have a different banner image for Home, About and Services and want to update the image url depending on the page that is currently in use.
I'm not sure what the best practice way to achieve this would be.
You should be able to render the Banner after adding the router props to it, and then access location.pathname inside Banner.
Note withRouter and BannerWithRouter component:
import React from 'react'
import { BrowserRouter as Router, Route, withRouter } from 'react-router-dom'
import Header from './Header'
import Footer from './Footer'
import Banner from './Banner'
import Home from './Home'
import About from './About'
import Services from './Services'
import Book from './Book'
const BannerWithRouter = withRouter(({ location }) => <Banner {...props} />)
function Layout() {
return (
<Router>
<Header />
<BannerWithRouter />
<Route exact path='/' component={Home} />
<Route exact path='/Home' component={Home} />
<Route exact path='/About' component={About} />
<Route exact path='/Services' component={Services} />
<Route exact path='/Book' component={Book} />
<Footer />
</Router>
)
}
export default Layout
Banner component: (Note you now have a prop called location)
import React from 'react'
import Jumbotron from 'react-bootstrap/Jumbotron'
function Banner({ location }) {
const heroStyle = {
backgroundImage: 'url(' + require('../images/home-hero-image.jpg') + ')'
}
console.log(location.pathname)
if (location.pathname === '/about') {
return 'This is the about page'
}
return (
<div>
<Jumbotron style={heroStyle}>
<h1 className='centerme'>Live your best life</h1>
<p className='centerme'>
<a href='#' className='jumbotron-book-now-button'>
Get Coaching
</a>
</p>
</Jumbotron>
</div>
)
}
export default Banner
Related
guys!
I'm having some kind of trouble when adding a simple /home route to my app. When i add the line below to my App.js, the app turns blank (even the NavBar vanishes):
<Route path='/home' exact component={HomeScreen} />
No compiling or server errors.
Can u give me a light?
App.js
import './App.css';
import Navbar from './components/Navbar';
import HomeScreen from './screens/HomeScreen'
import { BrowserRouter, Route } from 'react-router-dom'
function App() {
return (
<div className="App">
<Navbar/>
<BrowserRouter>
<Route path='/home' exact component={HomeScreen} />
</BrowserRouter>
</div>
);
}
export default App;
HomeScreen.js
import React from 'react';
function HomeScreen() {
return (
<div>
<h1>asdasdHome Screen</h1>
</div>
)
}
export default HomeScreen
Tree
tree
import './App.css';
import Navbar from './components/Navbar';
import HomeScreen from './screens/HomeScreen'
mport { BrowserRouter, Routes, Route} from 'react-router-dom'
function App() {
return (
<div className="App">
<Navbar/>
<BrowserRouter>
<Routes>
<Route path='/home' element={<HomeScreen/>} />
</Routes>
</BrowserRouter>
</div>
);
}
export default App;
The bit that wasnt working was where you defined your element so change
<Route path='/home' exact component={HomeScreen} />
to this
<Route path='/home' element={<HomeScreen/>} />
Hey Diego now there is react router v6
Where Switch is replaced for Routes and component={HomeScreen} for element={<HomeScreen/>}
import './App.css';
import Navbar from './components/Navbar';
import HomeScreen from './screens/HomeScreen'
import { BrowserRouter, Routes, Route} from 'react-router-dom'
function App() {
return (
<div className="App">
<Navbar/>
<BrowserRouter>
<Routes>
<Route path='/home' element={<HomeScreen/>} />
</Routes>
</BrowserRouter>
</div>
);
}
export default App;
I think u used Link in Navbar. And the navbar is outside the broweser router. This was my problem.
**When i Write my My Nav Bar Component Content Directly in My Router Component. It works Fine But When I write that content in a NavBar Component it Generates the following error
Error: useHref() may be used only in the context of a component.
.**
Im Using
"react-dom": "^17.0.2", "react-router-dom": "^6.0.0-beta.6",
Following are my Components..
My NavBar Component:-
import { Link } from "react-router-dom";
// import styles from './NavBar.module.css';
export const NavBar = () => {
return (
<nav>
<Link to="/"> Home </Link>
<Link to="/about"> About </Link>
<Link to="/product"> Product </Link>
</nav>
);
}
My Route Component:-
import { BrowserRouter as Router, Switch, Route, Routes} from "react-router-dom";
// importing Component's
import { Home } from "./Components/Home/Home";
import { About } from "./Components/About/About";
import { Products } from "./Components/Products/Products";
import { ProductItems } from "./Components/ProductItems/ProductItems";
import {NavBar} from "./Components/NavBar/NavBar";
import { Fotter } from "./Components/Fotter/Fotter";
export const RouterConfig = () => {
return (
<Router>
<NavBar />
<Switch>
<Route exact path="/" component={Home} />
<Route path="/about" component={About} />
<Route exact path="/product" component={Products} />
<Route path="/product/:id" component={ProductItems} />
<Route path="*" component={() => <h2>404 Not Found </h2>} />
</Switch>
{/* <Fotter />' */}
</Router>
);
};
import {BrowserRouter as Router} from "react-router-dom";
Use in components App.js or above in index.js and wrap your component in Router.
Then the problem will disappear ;-)
In Your case I see two option:
index.js
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
import { BrowserRouter as Router } from "react-router-dom";
ReactDOM.render(
<React.StrictMode>
<Router>
<App />
</Router>
</React.StrictMode>,
document.getElementById("root")
);
OR use App Component instead of RouterConfig Component.
App.js
import { BrowserRouter as Router, Switch, Route, Routes} from "react-router-dom";
// importing Component's
import { Home } from "./Components/Home/Home";
import { About } from "./Components/About/About";
import { Products } from "./Components/Products/Products";
import { ProductItems } from "./Components/ProductItems/ProductItems";
import {NavBar} from "./Components/NavBar/NavBar";
import { Fotter } from "./Components/Fotter/Fotter";
export const App = () => {
return (
<Router>
<NavBar />
<Switch>
<Route exact path="/" component={Home} />
<Route path="/about" component={About} />
<Route exact path="/product" component={Products} />
<Route path="/product/:id" component={ProductItems} />
<Route path="*" component={() => <h2>404 Not Found </h2>} />
</Switch>
{/* <Fotter />' */}
</Router>
);
};
I tried to explain it as best I could. Hope this helps you ;-) Best Greetings and Good Luck!
If you're still confused, check out here =>
React Router V6 - Error: useRoutes() may be used only in the context of a <Router> component
export is not running properly and causing an error. Can you retype it like below and try?:
import { Link } from "react-router-dom";
const NavBar = () => {
return (
<div>
<Link to="/"> Home </Link>
<Link to="/about"> About </Link>
<Link to="/product"> Product </Link>
</div>
);
}
export default Navbar;
Also, you don't need curly brace for import statement.
import NavBar from "./Components/NavBar/NavBar";
If problem still persists, you can check your file paths because you are repeating folder names twice, it looks suspicious to me. Maybe you mean this:
import NavBar from "./Components/NavBar";
I am new to React and practicing with an online website for repairing appliances. I have used react-router and created all my routes in a separate file.
I have a problem though, I can open any link from the address bar like:
http://localhost:3000/<randomword>
I only want routes to be opened that I have declared in my routes component while if I type http://localhost:3000/something, I get an empty page with my header and footer in it.
here are my codes:
Index.js:
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from "react-router-dom";
import Routes from './Routes';
import './index.css';
const App = () => {
return(
<BrowserRouter>
<Routes />
</BrowserRouter>
)
}
ReactDOM.render(<App/>,document.getElementById('root'));
App.js:
import React, {Component} from 'react';
import { Route, BrowserRouter } from 'react-router-dom';
import Layout from './Containers/Layout';
import LandingPage from './Containers/Pages/LandingPage';
import About from './Containers/Pages/About';
import Cities from './Containers/Pages/Cities';
import Discount from './Containers/Pages/Discount';
class Routes extends Component {
render(){
return (
<div>
<Layout>
<BrowserRouter>
<Route path="/" render={props => <LandingPage {...props} />} exact component={LandingPage}/>
<Route path="/About" component={About}/>
<Route path="/Cities" component={Cities}/>
<Route path="/Discount" component={Discount}/>
</BrowserRouter>
</Layout>
</div>
);
}
};
export default Routes;
Layout.js:
import React, { Component } from 'react';
import Header from "./Layouts/Header";
import Footer from './Layouts/Footer';
import './Layout.css';
export default class Layout extends Component {
constructor(){
super();
this.state= {
}
}
render() {
return (
<div className="page-container">
<Header/>
<div className="content-wrap">
{this.props.children}
</div>
<Footer/>
</div>);
}
}
Can someone help me figure out how I should stop random random pages to be opened from addressbar?
Just want to start by saying I'm completely self-taught with React so I apologize if this answer is incorrect. However, in my experience with react-router I always have a Switch inside of my BrowserRouter. So your Routes class in app.js should something like this:
class Routes extends Component {
render(){
return (
<div>
<Layout>
<BrowserRouter>
<Switch>
<Route path="/" render={props => <LandingPage {...props} />} exact component={LandingPage}/>
<Route path="/About" component={About}/>
<Route path="/Cities" component={Cities}/>
<Route path="/Discount" component={Discount}/>
</Switch>
</BrowserRouter>
</Layout>
</div>
);
}
};
Just be sure you don't forget to update your imports to
import { Switch, Route, BrowserRouter } from 'react-router-dom';
import { Redirect } from "react-router-dom"
<Route path="/not-found" component={notFound-Component} />
<Redirect to="/not-found" />
This will always redirect you to 404 component if route is not present just make a 404 component and u should add the redirect at the end after all routes are defined
I am building an E-Commerce MERN Stack Web Application. The loading time of my Home Page as tested by Lighthouse is more than 12s.
I have hence posted the App.js file and my main main homepage.js file.
How can I implement code splitting on my homepage.js file (using Lazy-Suspense method o any other)?
homepage.js
import React, { Component } from 'react';
import Header from '../header/header';
import About from '../about/about';
import Services from '../services/services';
import Footer from '../footer/footer';
import Navbar from '../navbar/navbar';
export default class Homepage extends Component {
state = {
response: '',
email: '****.com',
password:'****',
message:'',
};
render() {
let loggedIn = this.props.loggedIn;
console.log(loggedIn)
return (
<div className="App">
<Navbar />
<Header resumeData={{name:this.state.email,}}/>
<Services resumeData={{name:this.state.email,}}/>
<About resumeData={{name:this.state.email,}}/>
<Footer resumeData={{name:this.state.email,}}/>
</div>
);
}
}
App.js
import React, { Component } from 'react';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import Homepage from './components/homepage/homepage';
import LogIn from './components/login/login';
import SignUp from './components/signup/signup';
import Reset from './components/reset/reset';
import Account from './components/account/account';
import Verify from './components/verify/verify';
import Shop from './components/shop/shop';
import Cart from './components/cart/cart';
import Checkout from './components/cart/checkout';
import Admin from './components/admin/admin';
import Order from './components/order/order';
import Subscription from './components/order/subscription';
import Subscribe from './components/subscribe/subscribe';
class App extends Component {
render() {
return (
<BrowserRouter>
<Switch>
<Route path="/" component={Homepage} exact/>
<Route path="/shop" component={Shop} />
<Route path="/cart" component={Cart} />
<Route path="/checkout:what" component={Checkout} />
<Route path="/subscribe" component={Subscribe} />
<Route path="/order:oId" component={Order} />
<Route path="/subscription:sId" component={Subscription} />
<Route path="/login" component={LogIn}/>
<Route path="/admin" component={Admin}/>
<Route path="/signup" component={SignUp}/>
<Route path="/reset" component={Reset}/>
<Route path="/account" component={Account}/>
<Route path="/verify/:token" component={Verify}/>
</Switch>
</BrowserRouter>
);
}
}
export default App;
this how you code split your react js app:
import React,{lazy,Suspense} from 'react'
const Child = lazy(()=>import('./ChildComponent'))
const Parent = ()=> <Suspense fallback={<Loader/>}><Child/></Suspense>
here is full detailed explanation : React Code splitting
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;
Try removing the BrowserRouter or Router( in your case) tag from all others except the index.js. Then I think this will work fine.
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.
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.