Source component keeps rendering on other website pages when routing to them - reactjs

My source component (App.js) is what I'm using as my "homepage" to route to the other pages. However when the user clicks a button that routes them to another page, the App.js componennts still renders on that page. How do I stop App.js from rendering on every page?
App.js:
import React from "react";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import { Component } from 'react'
import './App.css';
import 'primereact/resources/themes/nova-light/theme.css';
import 'primereact/resources/primereact.min.css';
import 'primeicons/primeicons.css';
import TruckSetupPage from "./Components/TruckSetupPage";
import carThirdPage from './Components/carThirdPage';
import { Button } from 'primereact/button';
import logoImage from './Components/corvette.png';
export class App extends Component {
render() {
return (
<Router>
<div>
<div className="Page-Title">
<div className="Page-Subtitle">
<header>car</header>
</div>
</div>
{/*Makeshift spacer because to prevent css page-title css overriding subtitle css */}
<div>
<h1 className="Page-Header-Three">corvette Online Truck Estimator</h1>
</div>
<div>
{/*Route To different pages for testing sake*/}
<center>
<switch>
<Route path="/TruckSetupPage/" component={TruckSetupPage} />
<Route path="/carThirdPage/" component={carThirdPage} />
</switch>
<GetStartedButton></GetStartedButton>
</center>
</div>
</div>
</Router>
);
}
}
export default App;
export class GetStartedButton extends Component {
getStartedClick() {
//Open new window to TruckSetup
window.open('http://localhost:3000/TruckSetupPage');
}
render() {
return (
<div>
<img src={logoImage} className="logoImage" alt="logo" />
<div>
<Button label="Get Started" className="p-button-raised" p-button-rounded onClick={this.getStartedClick} />
</div>
</div>
)
}
}
I am using the prime react framework and help is appreciated!

You need to separate the markup for your App.js in a separate component. Otherwise, the content rendered inside the Router that is not defined in a Route will display at all times.
Try something like this:
import React from "react";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import { Component } from 'react'
import './App.css';
import 'primereact/resources/themes/nova-light/theme.css';
import 'primereact/resources/primereact.min.css';
import 'primeicons/primeicons.css';
import TruckSetupPage from "./Components/TruckSetupPage";
import carThirdPage from './Components/carThirdPage';
import Home from "./Components/Home
export class App extends Component {
render() {
return (
<Router>
<div>
<div>
{/*Route To different pages for testing sake*/}
<center>
<switch>
<Route path="/" exact component={Home}/>
<Route path="/TruckSetupPage/" component={TruckSetupPage} />
<Route path="/carThirdPage/" component={carThirdPage} />
</switch>
</center>
</div>
</div>
</Router>
);
}
}
export default App;
Home.js
import React from "react"
import GetStartedButton from "./GetStartedButton"
const Home = () => {
return(
<div>
<div className="Page-Title">
<div className="Page-Subtitle">
<header>car</header>
</div>
</div>
{/*Makeshift spacer because to prevent css page-title css overriding subtitle css */}
<div>
<h1 className="Page-Header-Three">corvette Online Truck Estimator</h1>
</div>
<GetStartedButton/>
</div>
)
}
export default Home
GetStartedButton
import React from "react"
import { Button } from 'primereact/button';
import logoImage from './corvette.png';
const GetStartedButton = () => {
const getStartedClick = () => {
//Open new window to TruckSetup
window.open('http://localhost:3000/TruckSetupPage');
}
return (
<div>
<img src={logoImage} className="logoImage" alt="logo" />
<div>
<Button label="Get Started" className="p-button-raised" p-button-rounded onClick={getStartedClick} />
</div>
</div>
)
}
export default GetStartedButton

Related

Chrome is showing strange errors for my React App after installing Router

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>

React routes dosen't show my components. Only one component is shown, others are not

I have components that I want show in my app. But only my "Header.js" component is shown at "App.js"
react-router-dom is installed, when i npm start my app is open but only header is shown. Can someone please help? I am not sure what I'm missing here?
My App.js
import React, { Component } from 'react'
import { BrowserRouter as Router, Route } from 'react-router-dom';
import Header from './components/Header.js';
import VehicleMake from './components/VehicleMake.js';
import VehicleModel from './components/VehicleModel.js';
import VehicleDetails from './components/VehicleDetails.js';
import AddNewVehicle from './components/AddNewVehicle.js';
import './App.css';
class App extends Component {
render(){
return (
<div className="App">
<Router>
<Header text="Vehicle by Ivan Radunković"/>
<Route exact path="/makes/:vehicleMake" component={VehicleMake} />
<Route exact path="/models/:vehicleModel" component={VehicleModel}/>
<Route exact path="/vehicle/:vehicleId" component={VehicleDetails}/>
<Route exact path="/add" component={AddNewVehicle} />
</Router>
</div>
)
}
}
export default App;
Header.js that is shown correct
import '../App.css'
import React, { Component } from 'react';
class Header extends Component {
render(){
return(
<header className="header">
<div className="headerText">
<h1>{this.props.text}</h1>
</div>
<img src="https://s.aolcdn.com/dims-global/dims3/GLOB/legacy_thumbnail/788x525/quality/85/https://s.aolcdn.com/commerce/autodata/images/USC90MBC891A021001.jpg" alt="header" className="headerImage"/>
</header>
)
}
}
export default Header;
And one component that I don't see.
VehicleMake.js
import React from 'react';
import { inject, observer } from 'mobx-react';
import { Link } from 'react-router-dom';
const VehicleMake = ({ VehicleStore, match, location, props}) => {
const {
params: { vehicleMake }
} = match
return (
<>
<Link to="/"><button className="button backButton">Back</button></Link>
<h3 className="title">Makes</h3>
<div className="vehiclesDiv">
{VehicleStore.filteredVehicles.filter(vehicle => vehicle !== null && vehicle.VehicleMake === vehicleMake).map((vehicle) => (
<div key={vehicle.id} className="vehicle">
<img src={vehicle.image} alt="" className="listImage"/>
<Link to={`/makes/${vehicle.VehicleMake}`} style={{ textDecoration: 'none' }}><h3 className="vehicleTitle">{vehicle.VehicleMake}</h3></Link>
<Link to={`/models/${vehicle.VehicleModel}`} style={{ textDecoration: 'none' }}><h4 className="vehicleSubtitle">{vehicle.VehicleModel}</h4></Link>
<Link to={`/vehicle/${vehicle.id}`} style={{ textDecoration: 'none' }}><h4 className="vehicleTitle">Details</h4></Link>
</div>
))}
</div>
</>
)
}
export default inject ('VehicleStore') (observer(VehicleMake))
Move <Header.. outside of <Router>
<Header text="Vehicle by Ivan Radunković"/>
<Router>
<Route exact path="/makes/:vehicleMake" component={VehicleMake} />
...

Router only have one child component error

I want to create a page in such a way that it will route in such a way....... that
App.js to HomePage.js to Footer.js. Now when I try to perform this task it shows error that Router has only 1 child element.
Code for App.js:
import React, { Component } from 'react';
import logo from './logo.svg';
import HomePage from './Home_page'
import './App.css';
class App extends Component {
render() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<h1 className="App-title">Welcome to React</h1>
</header>
<p className="App-intro">
To get started, edit <code>src/App.js</code> and save to reload.
</p>
<HomePage />
</div>
);
}
}
export default App;
Code for Home_page.js
import React, {Component} from 'react';
import { BrowserRouter as Router, Switch, Route, Link } from 'react-router-dom';
import FooterPage from './FooterPage';
class HomePage extends Component {
render(){
return(
<Router>
<div>
<Link to='./FooterPage'>Footer Page</Link>
</div>
<Switch>
<Route exact path='./FooterPage' component={FooterPage} />
</Switch>
</Router>
);
}
}
export default HomePage;
Code for Footer.js
import React, {Component} from 'react';
import { BrowserRouter as Router, Switch, Route, Link } from 'react-router-dom';
class FooterPage extends Component {
render(){
return(
<div>
</div>
);
}
}
export default FooterPage;
At your Home_Page.js
import React, {Component} from 'react';
import { BrowserRouter as Router, Switch, Route, Link } from 'react-router-dom';
import FooterPage from './FooterPage';
class HomePage extends Component {
render(){
return(
<Router>
<div>
<div>
<Link to='./FooterPage'>Footer Page</Link>
</div>
<Switch>
<Route exact path='./FooterPage' component={FooterPage} />
</Switch>
</div>
</Router>
);
}
}
export default HomePage;
here you have only one child inside Route, not two. See https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/docs/api/BrowserRouter.md

React Router changes Link but doesnt render proper component

Hello I'm working with React Router... I have two components App.js and SideNavComponent. I want to click the link in the SideNavComponent to and travel to the correct Component.
Right now when I click on the Link it changes the URL but does not render the correct component. However if I change the URL myself the correct view renders.
App.js
import React, { Component } from 'react';
import { Col, Well, Panel } from 'react-bootstrap';
import NavbarComponent from './NavbarComponent';
import SideNavComponent from './SideNavComponent';
import Router from './Router';
class App extends Component {
render() {
return (
<div>
<div className="header">
<NavbarComponent />
</div>
<div className="body">
<Col md={3}>
<Well>
<SideNavComponent />
</Well>
</Col>
<Col md={9}>
<Panel>
<Router />
</Panel>
</Col>
</div>
<div className="footer" />
</div>
);
}
}
export default App;
SideNavComponent
import React, { Component } from 'react';
import { Nav, NavItem } from 'react-bootstrap';
import { Link, BrowserRouter, Switch } from 'react-router-dom';
class SideNavComponent extends Component {
state = {
selectedLink: 1
};
selectLink(key) {
this.setState({ selectedLink: key });
}
render() {
return (
<BrowserRouter>
<div style={{ flexDirection: 'column' }}>
<Link to="/">Home</Link>
<Link to="/device">Device</Link>
<Link to="/transform">Transformation</Link>
<Link to="/graph">Graphs</Link>
</div>
</BrowserRouter>
);
}
}
export default SideNavComponent;
Router.js
import React from 'react';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import HomeComponent from './pages/HomeComponent';
import DeviceComponent from './pages/DeviceComponent';
import TransformationComponent from './pages/TransformationComponent';
import GraphComponent from './pages/GraphComponent';
const Router = () => {
return (
<BrowserRouter>
<div>
<Switch>
<Route path="/device" component={DeviceComponent} />
<Route path="/transform" component={TransformationComponent} />
<Route path="/graph" component={GraphComponent} />
<Route exact path="/" component={HomeComponent} />
</Switch>
</div>
</BrowserRouter>
);
};
export default Router;
The problem is you have multiple instances of browser router and history is getting confused. You can fix this by re-organising the structure of application like the below example.
// *-----------------------*
// | MAIN-APP COMPONENT |
// *-----------------------*
import React, { Component } from "react";
import { Col, Well, Panel } from "react-bootstrap";
import { Route, Switch } from "react-router-dom";
import SideNavComponent from "./SideNavComponent";
const HomeComponent = () => <div>Home</div>;
const GraphComponent = () => <div>Graph</div>;
const DeviceComponent = () => <div>Device</div>;
const TransformationComponent = () => <div>Transformation</div>;
class App extends Component {
render() {
return (
<div>
<div className="header" />
<div className="body">
<Col md={3}>
<Well>
<SideNavComponent />
</Well>
</Col>
<Col md={9}>
<Panel>
<Switch>
<Route path="/device" component={DeviceComponent} />
<Route path="/transform" component={TransformationComponent} />
<Route path="/graph" component={GraphComponent} />
<Route exact path="/" component={HomeComponent} />
</Switch>
</Panel>
</Col>
</div>
<div className="footer" />
</div>
);
}
}
export default App;
// *-----------------------*
// | SIDENAV-COMPONENT |
// *-----------------------*
import React, { Component } from "react";
import { Nav, NavItem } from "react-bootstrap";
import { Link } from "react-router-dom";
class SideNavComponent extends Component {
render() {
return (
<div style={{ flexDirection: "column" }}>
<Link to="/">Home</Link>
<Link to="/graph">Graphs</Link>
</div>
);
}
}
export default SideNavComponent;
// *-----------------------*
// | MAIN.JS (ENTRY POINT) |
// *-----------------------*
import React from 'react'
import { render } from 'react-dom'
import App from './components/App';
import { BrowserRouter } from 'react-router-dom';
render((
<BrowserRouter>
<App />
</BrowserRouter>
), document.getElementById('root'));

sidebar with Reactjs

I am trying to do a sidebar with Reactjs but I am not getting it.
I want to know how to pass the props from App.js to Middle.js correctly.
I have the structure index.js > routes.js > App.js > Header.js, Middle.js > Sidebar.js, (DashboardPage.js, AccountPage.js - pages to be rendered dinamically)
Header.js -> Has a IndexLink at image
Sidebar.js -> Has a IndexLink and a Link to render AccountPage.js
The route is set for App.js, but the component is supposed to load inside the Middle.js component.
Here are my codes:
index.js
import 'babel-polyfill';
import React from 'react';
import { render } from 'react-dom';
import { Router, browserHistory } from 'react-router';
import routes from './routes';
render(
<Router history={browserHistory} routes={routes} />, document.getElementById('app')
);
routes.js
import React from 'react';
import { Route, IndexRoute } from 'react-router';
import App from './components/App';
import DashboardPage from './components/middle/dashboard/DashboardPage';
import AccountPage from './components/middle/accounts/AccountPage';
export default (
<Route path="/" component={App}>
<IndexRoute component={DashboardPage} />
<Route path="accounts" component={AccountPage} />
</Route>
);
App.js
import 'babel-polyfill';
import React, {PropTypes} from 'react';
import ReactDOM from 'react-dom';
import Header from './common/Header';
import Middle from './middle/Middle'
import '../../css/style.css';
class App extends React.Component{
var { app } = this.props;
render() {
return (
<div>
<Header />
<Middle />
</div>
);
}
}
export default App;
Header.js // IndexLink at img
'use strict';
import React from 'react';
import User from './User';
import {IndexLink, Link} from 'react-router';
import '../../../css/header.css';
class Header extends React.Component{
render() {
return (
<div className="contactto-header">
<div className="contactto-header-content">
<IndexLink to="/"><img className="contactto-header-content-logo" src="static/img/logo.png" alt="contactto logo" /></IndexLink>
<div className="contactto-header-content-alarm"></div>
<div className="contactto-header-content-user">
<User />
</div>
</div>
</div>
);
}
}
export default Header;
Middle.js
'use strict';
import React, {PropTypes} from 'react';
import '../../../css/middle.css';
import SideBar from './SideBar'
class Middle extends React.Component{
render() {
return (
<div className="contactto-middle">
<div className="contactto-middle-content">
<SideBar />
{app.children} // should render here
</div>
</div>
);
}
}
export default Middle;
Sidebar.js
'use strict';
import React from 'react';
import {IndexLink, Link} from 'react-router';
import '../../../css/sidebar.css';
class SideBar extends React.Component{
render() {
return (
<div className="sidebar-container">
<ul className="sidebar-container-ul">
<li className="sidebar-container-ul-li">
<IndexLink className="sidebar-container-ul-li-a" to="/">Dashboard</IndexLink>
</li>
<li className="sidebar-container-ul-li">
<Link className="sidebar-container-ul-li-a" to="accounts">Contas</Link>
</li>
</ul>
</div>
);
}
}
export default SideBar;
What is wrong?
I am new with React, if another code is not done correctly please tell me :)
Thanks in advance.
First of all, your route components will be available under App through this.props.children. If you want to wrap them with you can try like this:
class App extends React.Component{
render() {
return (
<div>
<Header />
<Middle>
{this.props.children}
</Middle>
</div>
);
}
}
An then in the Middle.js
class Middle extends React.Component{
render() {
return (
<div className="contactto-middle">
<div className="contactto-middle-content">
<SideBar />
{this.props.children}
</div>
</div>
);
}
}
It's a bit unclear what you're asking, but it seems that you want to know how to pass a prop from App.js to Middle.js. Here's how:
class App extends React.Component{
var { app } = this.props;
render() {
return (
<div>
<Header />
<Middle someProp={someValue} />
</div>
);
}
}
Now in Middle.js you can access someProp in this.props.someProp.
Maybe you can use https://www.npmjs.com/package/react-side-bar. There are a complete example in Example and looks fine.
npm install --save react-side-bar

Resources