Here is how the router I defined :
import React from 'react';
import {BrowserRouter, Switch, Route} from 'react-router-dom';
import PersonsList from './PersonsList';
import Error from './Error'
import Person from './Person'
const Router = () => (
<BrowserRouter>
<Switch>
<Route path="/persons" strict={false} component={PersonsList}/>
<Route path="/persons/:id" component={Person}/>
<Route component={Error}/>
</Switch>
</BrowserRouter>
);
export default Router;
The first route works perfectly.
The problem is that in the PersonsList, when I try to reach the /persons/:id route, I get a blank page.
Here is the code I use for redirection in the PersonsList component :
static propTypes = {
history: PropTypes.object
};
handleRedirection = (aPerson) => {
this.props.history.push(`/persons/${aPerson.id}`);
}
...
{this.state.persons.map(aPerson => (
<React.Fragment key={aPerson.id}>
<div className="row" onClick={this.handleRedirection.bind(this,aPerson)}>
Here is the Person component :
import React from 'react';
import PropTypes from 'prop-types';
import { withRouter } from 'react-router';
class Person extends React.Component {
static propTypes = {
match: PropTypes.object
};
constructor(props){
super(props);
console.log('the selected person : ' + this.props.match.params.id);
}
render(){
return(
<div>A person</div>
)
}
}
export default withRouter(Person);
I can see the console.log output but no rendering of the <div>A person</div>.
Question
Why the second route returns a blank content knowing its component's constructor is called? Why the rendering is not processed ?
i try this.props.history.push('/home'); code part but not correct running.
you can see my component codes in the below.
my full component code :
class Full extends Component {
render() {
return (
<div className="app">
<Header/>
<div className="app-body">
<Sidebar {...this.props}/>
<main className="main">
<Breadcrumb/>
<Container fluid>
<Switch>
<Route path="/dashboard" name="Dashboard" component={Dashboard}/>
<Route path="/applications" name="Applications" component={Applications}/>
<Route path="/roles" name="Roles" component={Roles}/>
<Route path="/poc" name="poc" component={Poc}/>
<Redirect from="/home" to="/dashboard"/>
</Switch>
</Container>
</main>
<Aside/>
</div>
<Footer/>
</div>
);
}
}
Dashboard component code :
class Dashboard extends Component {
constructor(props) {
super(props);
}
render() {
return (
<div className="animated fadeIn">
<div>test</div>
</div>
)
}
}
export default Dashboard;
History Code:
import {createBrowserHistory} from 'history';
export const history = createBrowserHistory();
Related
I have a problem I am new and I am trying to use React Router but it shows me a blank page whenever I use it
Here is my code:
import React, {Component} from 'react';
import {BrowserRouter as Router, Route} from 'react-router-dom';
class TodoApp extends Component{
render() {
return (
<div className="TodoApp">
<Router>
<>
<Route path="/" element={<WelcomeComponent />} />
</>
</Router>
</div>
)
}
}
class WelcomeComponent extends Component{
render()
{
return <div>
abcd
</div>
}
}
If I delete the route line
and instead I write somthing else the code works fine so I know I have a problem with the Route line and I am not sure what is it
Route can only be child of Routes. Try adding Routes as parent like below and you should see WelcomeComponent loading up.
render() {
return (
<div className="TodoApp">
<Router>
<Routes>
<Route path="/" element={<WelcomeComponent />} />
</Routes>
</Router>
</div>
);
}
when rendering more that one line of code, your return needs to wrap them in a parenthesis.
your WelcomeComponent should look like this
class WelcomeComponent extends Component{
render()
{
return (
<div>
abcd
</div>
)
}
}
I am having a very simple app with Carousel. Each slide has a button. When the user clicks on the buttons, it should show the corresponding page at the bottom container. I am passing individual Slide from the parent component as a property called content. Below is my code
Snippet from Slidebar.js which is passing the slides to SlideContent
<div css={SliderBarCss}>
{this.props.slides.map((slide, i) => (
<SlideContent key={i} content={slide} />
))}
</div>
SlideContent.js
/** #jsx jsx */
import React from 'react';
import { BrowserRouter, Link } from 'react-router-dom';
import Routes from './Routes';
import { css, jsx } from '#emotion/core'
export default class SlideContent extends React.Component {
constructor(props) {
super(props);
}
render(){
<div>
<h1>{this.props.content.title}</h1>
<p>{this.props.content.description}</p>
<BrowserRouter>
<Link to={this.props.content.link}><button>{this.props.content.button}</button>
</Link>
</BrowserRouter>
</div>
)
}
}
I have defined the Routes in another file Routes.js
import React, { Component } from 'react';
import { css, jsx } from '#emotion/core'
import { Route, Link, Switch, Redirect } from 'react-router-dom';
import Component1 from '../innerComponents/Component1';
import Component2 from '../innerComponents/Component2';
import HomeComponent from '../innerComponents/Home';
class Routes extends Component{
constructor(props){
super(props);
}
render(){
return(
<Switch>
<Route exact path="/Home" component={HomeComponent} />
<Route exact path="/">
<Redirect to="/Home" />
</Route>
<Route exact path="/Component1" component={Component1} />
<Route exact path="/Component2" component={Component2} />
</Switch>
)
}
}
export default Routes;
below is my app.js where I want my content to show up on button click.
function App() {
return (
<div className="App">
<SliderContainer/>
<BrowserRouter>
<Route component={Routes}></Route>
</BrowserRouter>
</div>
);
}
The URL on the top is changing but the view is not. Really appreciate any help
SOLUTION:
I removed the BrowserRouter element from SlideContent.js and MainContent.js. Added it as a parent to both SliderContainer and MainContent. Shown below are all changed the files
Removed BrowserRouter from SlideContent.js
export default class SlideContent extends React.Component {
constructor(props) {
super(props);
}
render(){
<div>
<h1>{this.props.content.title}</h1>
<p>{this.props.content.description}</p>
<Link to={this.props.content.link}><button>{this.props.content.button}</button>
</Link>
</div>
)
}
Removed BrowserRounter from MainContent.js
class MainContent extends React.Component{
render(){
return(
<Route component={Routes}></Route>
)
}
}
Added BrowserRouter to the parent of SliderContainer and MainContent
app.js
function App() {
return (
<div className="App">
<BrowserRouter>
<SliderContainer/>
<MainContent/>
</BrowserRouter>
</div>
);
}
export default App;
What if the Home component includes a button, and I want that when it click on, it will go to another Route (domain). For example - choose component?
How can I do that ?
The main component:
function App() {
return (
<Router> {/*Everything inside this will be capble to routing*/}
<div className="App">
<h1>CarLeas</h1>
<Switch>
<Route path="/" exact component={Home}/>
<Route path="/choose" component={Choose}/>
<Route path="/whochoose" component={Whochoose}/>
<Route path="/reback" component={Reback}/>
</Switch>
</div>
</Router>
);
}
Home component:
import React from "react";
class Home extends React.Component {
render() {
return (
<div>
<img src="https://www.trustford.co.uk/img/campaigns/all-new-ford-focus/2018-08-22/all-new-focus-banner-2000x500.jpg"></img>
<p>Rent a Car</p>
<button>Start Now</button> {/*Button - If event onclick happend show the "choose" component*/}
</div>
)
}
}
export default Home;
You can use this.props.history.push() to switch routes programmatically, in your case:
this.props.history.push("/choose");
However, I would recommend you using <Link> from react-router for linking, if there is no other logic, like so:
import React from "react";
import {Link} from "react-router";
class Home extends React.Component {
render() {
return (
<div>
<img src="https://www.trustford.co.uk/img/campaigns/all-new-ford-focus/2018-08-22/all-new-focus-banner-2000x500.jpg"></img>
<p>Rent a Car</p>
<Link to="/choose">Start Now</Link>
</div>
)
}
}
export default Home;
import React from "react";
class Home extends React.Component {
render() {
const { history } = this.props;
return (
<div>
<img src="https://www.trustford.co.uk/img/campaigns/all-new-ford-focus/2018-08-22/all-new-focus-banner-2000x500.jpg"></img>
<p>Rent a Car</p>
<button onClick={()=> history.push('/choose') }>Start Now</button>}
</div>
)
}
}
export default Home;
I am new to react and I am trying to send data from my parent component "Dashboard" to a child component "AddData". I know the syntax to do this normally, but what is the syntax to do this when a child is connected to parent through Route?
Shown below is my Dashboard.jsx:
import {withStyles} from '#material-ui/core'
import CssBaseline from '#material-ui/core/CssBaseline'
import PropTypes from 'prop-types'
import * as React from 'react'
import {Route} from 'react-router-dom'
import {Home} from './scenes/home'
import {A} from './scenes/a'
import {B} from './scenes/b'
import {AddData} from '../adddata'
import {VisualizeData} from '../visualizedata'
import {Header} from './components/header'
import {Sidebar} from './components/sidebar'
import styles from './Dashboard.styles'
class Dashboard extends React.Component {
constructor() {
super();
this.state = {
trainPercentageDashboard : "null",
featuresDashboard : [],
labelsDashboard : [],
}
}
render() {
const {classes} = this.props
console.log(window.location.href);
var url_ = new URL(window.location.href);
console.log(url_);
return (
<div className={classes.root}>
<CssBaseline/>
{url_.pathname !== '/neuralnet' &&
<Header/>
}
<Sidebar/>
<main className={classes.content}>
{url_.pathname !== '/neuralnet' &&
<div className={classes.toolbar}/>
}
<Route path="/adddata" component={AddData}/>
<Route exact path="/visualize" component={VisualizeData} />
<Route exact path='/home' component={Home}/>
<Route exact path='/neuralnet' component={A}/>
<Route exact path='/b' component={B}/>
<Route exact path='/' component={B}/>
</main>
</div>
)
}
}
Dashboard.propTypes = {
classes: PropTypes.object.isRequired,
theme : PropTypes.object.isRequired,
}
export default withStyles(styles, {withTheme: true})(Dashboard)
I went through this, but this was not mentioned in it.
Try this:
<Route
path='/adddata'
render={(props) => <AddData {...props} someotherprop={someotherprop} />}
/>
Note that the passed prop can be a part of the state as well. So you can pass the state as this.state.someotherprop.
If you want to pass data down to a component using react router, you can change your Route component to look like this.
<Route
path="/adddata"
render={(props) => (<AddData {...props}>)}
/>
This is a good article on explaining why to use render rather than component but the gist of it is that it is for performance.
You can pass data from parent component using react-router, is very simple
update your code with this, and your issue will be fixed
import {withStyles} from '#material-ui/core'
import CssBaseline from '#material-ui/core/CssBaseline'
import PropTypes from 'prop-types'
import * as React from 'react'
import {Route} from 'react-router-dom'
import {Home} from './scenes/home'
import {A} from './scenes/a'
import {B} from './scenes/b'
import {AddData} from '../adddata'
import {VisualizeData} from '../visualizedata'
import {Header} from './components/header'
import {Sidebar} from './components/sidebar'
import styles from './Dashboard.styles'
class Dashboard extends React.Component {
constructor() {
super();
this.state = {
trainPercentageDashboard : "null",
featuresDashboard : [],
labelsDashboard : [],
name:'rizwan',
}
}
render() {
const {classes} = this.props
console.log(window.location.href);
var url_ = new URL(window.location.href);
console.log(url_);
return (
<div className={classes.root}>
<CssBaseline/>
{url_.pathname !== '/neuralnet' &&
<Header/>
}
<Sidebar/>
<main className={classes.content}>
{url_.pathname !== '/neuralnet' &&
<div className={classes.toolbar}/>
}
<Route
path="/adddata"
component={AddData}
currentStep={this.state.name} />
<Route exact path="/visualize" component={VisualizeData} />
<Route exact path='/home' component={Home}/>
<Route exact path='/neuralnet' component={A}/>
<Route exact path='/b' component={B}/>
<Route exact path='/' component={B}/>
</main>
</div>
)
}
}
Dashboard.propTypes = {
classes: PropTypes.object.isRequired,
theme : PropTypes.object.isRequired,
}
export default withStyles(styles, {withTheme: true})(Dashboard)
Now open your child component: "adddata"
and console props
console.log('wao', this.porps)
thanks,
like and vote up
How to pass child component class as props to parent component in React.
My Parent component code :
import React, { Component } from 'react';
import { DashBoard } from './DashBoard/DashBoard';
import { DashBoard } from './Details/Details';
class ContentArea extends Component {
render() {
return (
<div className="content-wrapper">
<DashBoard />
<Details />
</div>
)
}
}
export default ContentArea;
And my child component code :
import React, { Component } from 'react';
export class DashBoard extends Component {
render() {
return (
<h1>This is DashBoard Page.</h1>
);
}
}
And my Route.js code :
import React, { Component } from 'react';
import { render } from 'react-dom';
import { BrowserRouter as Router, Route } from 'react-router-dom';
import { App } from './App';
import { DashBoard } from './components/DashBoard/DashBoard';
import { Details } from './components/Details/Details';
export class AppRoute extends Component {
render() {
return (
<Router>
<div>
<Route exact path={'/'} component={App} />
<Route path={'/DashBoard'} component={DashBoard} />
<Route path={'/Details'} component={Details} />
</div>
</Router>
);
}
}
App.js :
import React, { Component } from 'react';
import SideBar from './components/SideBar';
import Footer from './components/Footer';
import Header from './components/Header/Header';
import ContentArea from './components/ContentArea';
export class App extends Component {
render() {
return (
<div className="skin-purple">
<Header />
<SideBar />
<ContentArea />
<Footer/>
</div>
);
}
}
Now I want to pass my all child component as props to the parent component. And while routing the child component should get render inside the parent component.
Can anyone help me how to achieve that??
Since ContentArea is in App component and you wish to render DashBoard and Details in it, you could specify nested Routes at ContentArea level.
export class AppRoute extends Component {
render() {
return (
<Router>
<div>
<Route path={'/'} component={App} />
</div>
</Router>
);
}
}
import { DashBoard } from './DashBoard/DashBoard';
import { Details } from './Details/Details';
class ContentArea extends Component {
render() {
return (
<div className="content-wrapper">
<Route exact path={'/DashBoard'} component={DashBoard} />
<Route exact path={'/Details'} component={Details} />
</div>
)
}
}
export default ContentArea;