Passing Props in React Router - reactjs

I am having difficulty passing props via react router. Based on my understanding, there is a new way to pass props in React Router V6.
However, the props is still not showing up. Can some one take a look? thank you.
The props I am trying to pass is <Route path="/products" element={< Products sortBy={'newest'} />} />
Index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import {BrowserRouter} from 'react-router-dom'
ReactDOM.render(
<BrowserRouter>
<App/>
</BrowserRouter>, document.getElementById('root'));
registerServiceWorker();
App.js
import ReactDOM from "react-dom";
import NavBar from "./components/navbar";
import Products from "./components/products";
import Posts from "./components/posts";
import Home from "./components/home";
import Dashboard from "./components/admin/dashboard";
import ProductDetails from "./components/productDetails";
import NotFound from "./components/notFound";
import {Routes, Route} from 'react-router-dom'
import "./App.css";
class App extends Component {
render() {
return (
<div>
<NavBar />
<div className="content">
<Routes>
<Route path="/products" element={< Products sortBy={'newest'} />} />
<Route path="/posts/2018/06" element={<Posts/>} />
<Route path="/admin" element={<Dashboard/>} />
<Route path="/" element={<Home/>} />
</Routes>
</div>
</div>
);
}
}
export default App;
Product.js
import React, { Component } from "react";
class Products extends Component {
state = {
products: [
{ id: 1, name: "Product 1" },
{ id: 2, name: "Product 2" },
{ id: 3, name: "Product 3" }
]
};
render() {
return (
<div>
<h1>Products</h1>
<ul>
{this.state.products.map(product => (
<li key={product.id}>
<a href={`/products/${product.id}`}>{product.name}</a>
</li>
))}
</ul>
</div>
);
}
}
export default Products;

You are passing the props correctly. Can you please attach the code inside your <Products/> component?
Also, to enable routing in your react project, you need the implementations BrowserRouter, Routes and Route (React Basis Tutorials, BrowserRouter, Switch and Routes). In your code BrowserRouter is missing:
import ReactDOM from "react-dom";
import NavBar from "./components/navbar";
import Products from "./components/products";
import Posts from "./components/posts";
import Home from "./components/home";
import Dashboard from "./components/admin/dashboard";
import ProductDetails from "./components/productDetails";
import NotFound from "./components/notFound";
// Here import BrowserRouter
import {BrowserRouter as Router,Routes, Route} from 'react-router-dom'
import "./App.css";
class App extends Component {
render() {
return (
<div>
<NavBar />
<div className="content">
//Wrap Routes inside BrowserRouter (imported as Router)
<Router>
<Routes>
<Route path="/products" element={< Products sortBy={'newest'} />} />
<Route path="/posts/2018/06" element={<Posts/>} />
<Route path="/admin" element={<Dashboard/>} />
<Route path="/" element={<Home/>} />
</Routes>
<Router>
</div>
</div>
);
}
}
export default App;

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import {BrowserRouter} from 'react-router-dom'
ReactDOM.render(
<BrowserRouter>
<App/>
</BrowserRouter>, document.getElementById('root'));
registerServiceWorker();

Related

How to get react-router up and running?

I have a simple react-router-dom set and the links just simply won't work. My code is as follows:
index.js:
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter as Router } from "react-router-dom";
import "./containers/index.css";
import App from "./containers/App";
import reportWebVitals from "./reportWebVitals";
ReactDOM.render(
<Router>
<App />
</Router>
,document.getElementById("root")
);
app.js:
import "./App.css";
import { Switch, Route } from "react-router-dom";
import Homepage from "../containers/Homepage";
import About from "../containers/Homepage";
import Contact from "../containers/Homepage";
import Registration from "../containers/Homepage";
import Services from "../containers/Homepage";
import Schedule from "../containers/Homepage";
import Gallery from "../containers/Homepage";
import Navbar from "../components/Navbar";
import Footer from "../components/Footer";
const App = () => {
return (
<div className="App">
<Navbar />
<Footer />
<Switch>
<Route exact path="/" component={Homepage} />
<Route path="/about" component={About} />
<Route path="/contact" component={Contact} />
<Route path="/registration" component={Registration} />
<Route path="/services" component={Services} />
<Route path="/schedule" component={Schedule} />
<Route path="/gallery" component={Gallery} />
</Switch>
</div>
);
}
export default App;
Homepage.js:
import React from 'react';
import { Link } from 'react-router-dom';
const Homepage = () => (
<div>
<h2>Homepage</h2>
<Link to="/about"> About </Link>
</div>
);
export default Homepage;
About.js
import React from 'react';
import { Link } from 'react-router-dom';
const About = () => (
<div>
<h2>About</h2>
<Link to="/"> Home </Link>
</div>
);
export default About;
All other components are simple dummy components, similar to about and homepage. Just trying to get the routing to work before proceeding.
What am I missing?
import "./App.css";
import { Switch, Route } from "react-router-dom";
import Homepage from "../containers/Homepage";
import About from "../containers/Homepage";
import Contact from "../containers/Homepage";
import Registration from "../containers/Homepage";
import Services from "../containers/Homepage";
import Schedule from "../containers/Homepage";
import Gallery from "../containers/Homepage";
import Navbar from "../components/Navbar";
import Footer from "../components/Footer";
I think you could have a copy-paste error, your "About" has been imported as Homepage.
"import About from "../containers/Homepage";"

React router routes not rendering until page refresh

I created my application with create react app and the routes were working just fine up until a certain point the routes in my navbar I have as links would not load.
Been trying to debug for a while and was wondering if I could get some help as I feel like issue is coming from this specific file
import React from 'react'
import {fetchThreadds} from '../actions/fetchThreadds'
import Threaddform from '../components/Threaddform'
import Threaddlist from '../components/Threaddlist'
import Threaddshow from '../components/Threaddshow'
import {connect} from 'react-redux';
import {Route, Switch} from 'react-router-dom'
import { withRouter } from 'react-router-dom'
class ThreaddsContainer extends React.Component {
componentDidMount(){
this.props.fetchThreadds()
console.log("component did mount console", this.props)
}
render(){
console.log("render")
return(
<div>
<Switch>
<Route exact path='/thread/new' component={Threaddform}/>
{/* <Threaddform/><br></br> */}
<Route path='/threads/:id' render={(routerProps) => <Threaddshow {...routerProps} threadds={this.props.threadds}/>}/>
<Route exact path='/threads'render={()=> <Threaddlist threadds={this.props.threadds}/>} />
{/* <Threaddlist threadds={this.props.threadds}/> */}
</Switch>
</div>
)
}
}
const mapStateToProps = state => {
console.log("getting stuff from the store")
return {
threadds: state.threadds
}
}
export default withRouter(connect(mapStateToProps, {fetchThreadds}(ThreaddsContainer));
Will show all the necessary files below :
import React from 'react';
import './App.css';
import {connect} from 'react-redux';
import ThreaddsContainer from './containers/ThreaddsContainer';
class App extends React.Component {
render(){
return (
<div className="App">
<br></br> <h1 >The Sport Thread </h1>
<ThreaddsContainer/>
</div>
);
}
}
export default connect() (App);
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import {createStore, applyMiddleware, compose} from 'redux';
import thunk from 'redux-thunk';
import {Provider} from 'react-redux'
import threaddReducer from './reducers/threaddReducer'
import {BrowserRouter as Router, Route} from 'react-router-dom'
import Home from './components/Home'
import About from './components/About'
import Navbar from './components/Navbar'
import Sportupdate from './components/Sportupdate'
import Help from './components/Help'
import Login from './components/Login'
import Signup from './components/Signup'
import 'bootstrap/dist/css/bootstrap.min.css';
// import * as serviceWorker from './serviceWorker';
//The store
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
let store = createStore(threaddReducer, composeEnhancers(applyMiddleware(thunk)))
ReactDOM.render(
<Provider store={store}>
<Router>
<div>
<center><Navbar /></center>
<App />
<Route exact path="/" component={Home} />
<Route exact path="/about" component={About} />
<Route exact path="/updates" component={Sportupdate} />
<Route exact path="/help" component={Help} />
<Route exact path="/login" component={Login} />
<Route exact path="/signup" component={Signup} />
</div>
</Router>
</Provider>
,
document.getElementById('root')
);
and I am currently on react router v5!
Do let me know if I need to add more information
Use connected-react-router like below.
import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App/App";
import { Provider } from "react-redux";
import * as serviceWorker from "./serviceWorker";
import { ConnectedRouter } from "connected-react-router";
import * as initFastClick from "react-fastclick";
import { HelmetProvider } from "react-helmet-async";
import { configureStore, history, injectGlobalSaga } from "./utils";
import LocaleProvider from "./_components/LocaleProvider/Loadable";
import AuthProvider from "./_components/AuthProvider/Loadable";
import { locales } from "./locale";
import "bootstrap/dist/css/bootstrap.min.css";
import "./custom.scss";
import * as GLOBAL_CONSTANTS from "./utils/constants";
initFastClick();
const initialState = {};
const store = configureStore(initialState, history);
injectGlobalSaga(store);
const render = () => {
ReactDOM.render(
<Provider store={store}>
<LocaleProvider messages={locales}>
<ConnectedRouter history={history}>
<HelmetProvider>
<AuthProvider>
<App />
</AuthProvider>
</HelmetProvider>
</ConnectedRouter>
</LocaleProvider>
</Provider>,
document.getElementById("root")
);
};
// Hot reloadable translation json files
if (module.hot) {
// modules.hot.accept does not accept dynamic dependencies,
// have to be constants at compile-time
}
render();
serviceWorker.unregister();

Trouble with React SPA Routing

I have the following index.js
import React from 'react';
import ReactDOM from 'react-dom';
import {BrowserRouter} from 'react-router-dom';
import Main from './main/main';
import './index.css';
ReactDOM.render(
<BrowserRouter><Main /></BrowserRouter>,document.getElementById('root'));
the following in main.js:
import React, { Component } from 'react';
import NavMenu from "./navmenu";
import Content from "./content";
import './main.css';
class Main extends Component {
render() {
return (
<div id="main-layout">
<div id="main-header">
<div><img src={(require("./images/ppslogo-small.png"))} alt="eeeee"/></div>
<div><h2>Lil Test By Me</h2></div>
</div>
<div id="main-content">
<NavMenu />
<Content />
</div>
<div id="main-footer">
<div>Copyright © 2020. Powered By me. All Rights Reserved.</div>
</div>
</div>
);
}
}
export default Main;
And The following in content.js
import React, { Component } from 'react';
import {Route, Switch} from 'react-dom';
import Dashboard from "../dashboard/dashboard";
import Invoicing from "../invoicing/invoicing";
class Content extends Component {
render() {
return(
<Switch>
<Route exact path="/Dashboard" component={Dashboard} />
<Route path="/Invoicing" component={Invoicing} />
</Switch>
)
}
};
export default Content
It it my attempt to create an SPA with the Content component as my target for all my subsequent pages; however, I am clearly doing something wrong as I am getting all kinds of errors all over the place. Can anyone immediately see what I am doing incorrectly here?
Route and Switch needs to be imported from react-router-dom instead of react-dom
import React, { Component } from 'react';
import {Route, Switch} from 'react-router-dom';
import Dashboard from "../dashboard/dashboard";
import Invoicing from "../invoicing/invoicing";
class Content extends Component {
render() {
return(
<Switch>
<Route exact path="/Dashboard" component={Dashboard} />
<Route path="/Invoicing" component={Invoicing} />
</Switch>
)
}
};
export default Content
Use react-router-dom instead of react-router and then
change your content.js code to this.
import React, { Component } from 'react';
import {Route, Switch, BrowserRouter as Router} from 'react-router-dom';
import Dashboard from "../dashboard/dashboard";
import Invoicing from "../invoicing/invoicing";
class Content extends Component {
render() {
return(
<Router>
<Switch>
<Route exact path="/dashboard" component={Dashboard} />
<Route path="/invoicing" component={Invoicing} />
</Switch>
</Router>
)
}
};
export default Content
notice that I have added Router above the switch. and changed react-router to react-router-dom and also transformed the routes to lowercase

React Router v4 nested routes not working

I just upgraded to React Router v4 with a react 15.4.2 app based on a boilerplate from Fountain JS and after reading this article, I wrote this:
// Index.js
import 'babel-polyfill';
import React from 'react';
import ReactDOM from 'react-dom';
import {Route, BrowserRouter, Switch} from 'react-router-dom';
import {Main} from './app/pages/main';
import {App} from './app/pages/app';
import './index.scss';
const MainRouter = () => (
<div>
<main>
<Switch>
<Route path="/home" component={Main}/>
<Route path="/app" component={App}/>
</Switch>
</main>
</div>
);
ReactDOM.render(
<BrowserRouter>
<MainRouter/>
</BrowserRouter>,
document.getElementById('root')
);
// App.jsx
import React, {Component} from 'react';
import {Switch, Route} from 'react-router-dom';
import PropTypes from 'prop-types';
import {Dashboard} from './app/dashboard';
import {Money} from './app/money';
import {Header} from '../tpl/header';
import {Footer} from '../tpl/footer';
export class App extends Component {
render() {
return (
<div>
<Header/>
<main>
<Switch>
<Route path="/app/dashboard" exact component={Dashboard}/>
<Route path="/app/money" exact component={Money}/>
</Switch>
</main>
<Footer/>
</div>
);
}
}
// dashboard.jsx
import React, {Component} from 'react';
export class Dashboard extends Component {
render() {
return (
<div>
<h1>This is the Dashboard</h1>
</div>
);
}
}
Navigating to http://localhost:3000/app/ seems to work fine but navigating to http://localhost:3000/app/dashboard gives 404. What could I be possibly getting wrong?
PS Even on the routes that work, adding a trailing slash will not work.
You need to correct dashboard route at the end of App's render. No need for another Switch over there. So in your App.jsx file's render method :
render() {
return (
<div>
...
<Route path="/app/dashboard" component={Dashboard}/>
</div>
);
}

React Router not loading page

I'm following an online React tutorial. In the tutorial React Router 3 used while I got React Router 4 when I downloaded React Router (and react-router-dom). The code in the tutorial looks like this.
import React from "react";
import {render} from "react-dom";
import {Router, Route, browserHistory} from 'react-router'
import {Root} from "./components/Root";
import {Home} from "./components/Home";
import {User} from "./components/User";
class App extends React.Component {
render() {
return (
<Router>
<Route path={"user"} component={User}/>
<Route path={"home"} component={Home}/>
</Router>
);
}
}
render(<App />, window.document.getElementById('app'));
I'm trying to rewrite the code to work with React Router 4 like this:
import React from "react";
import {render} from "react-dom";
import {Switch, BrowserRouter, Route} from 'react-router-dom'
import {Root} from "./components/Root";
import {Home} from "./components/Home";
import {User} from "./components/User";
class App extends React.Component {
render() {
return (
<BrowserRouter>
<Switch>
<Route path={"user"} component={User}/>
<Route path={"home"} component={Home}/>
</Switch>
</BrowserRouter>
);
}
}
render(<App />, window.document.getElementById('app'));
The code for User.js looks like this:
import React from "react";
export class User extends React.Component {
render() {
return (
<div>
<h3>The User Page</h3>
<p>User ID: </p>
</div>
);
}
}
When I try localhost:8080/user it returns nothing.
I only get
<div id="app">
<!-- react-empty: 1 -->
</div>
What is it I need to change in my code?
Try with
<Route path="/user" component={User}/>
I have answered this Issue here
Wrap your <App> in <BrowserRouter> in index.js

Resources