Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get path params in react-router v4

I'm trying to build a router link through my application,

In this scenario, I have three files.

App.js

Book.js

DetailedView.js

I have inside of Book built up a <Link> that only appears when hovered ( over a book cover )

{this.state.isHovered ? (
   <Link to={`/details/${this.props.book.industryIdentifiers[1].identifier}`}>
<div className="hover-box"></div>
</Link>) : ( <div /> )}

This will take me to a /details/12345 (isbn10 number)

The thing I have a hard time to understand is how to for example setState({iPressedThisBook}) when pressing <Link> or if i can use the part after /12345 to create like a filter

Because in App the Route will be hooked up as...

<Route path="/details/:id" render={() => (
          <BookDetailedView
            bookStateUpdated = {this.bookStateUpdated}
            book = {this.state.books}
          />
)}/>

I, later on, want to grab the :id so that I make for example a this.props.book.find(:id) inside of my <BookDetailedView>

like image 349
Petter Östergren Avatar asked Aug 02 '17 18:08

Petter Östergren


People also ask

How do you get the path param in react?

To get path params in React Router, we can use the useParams hook. We create the Child component that calls the useParams hook to return an object with the route params in the URL. And we render the value of the id param on the page. In App , we have 2 links that goes to routes with different id param values.

Which prop allows to access parameters passed in routing with react router v4?

Whenever React Router v4 renders a component, it'll pass to that component three props, match , location , and history . For our use case, we can grab the URL parameter ( handle ) as a property on match. params .

How do I get the params from URL in react dom router?

To get the url parameter from a current route, we can use the useParams() hook in react router v5. Consider, we have a route like this in our react app. Now, we can access the :id param value from a Users component using the useParams() hook. In React router v4, you can access it using the props.match.params.id .

How do I find the URL path in Reactjs?

Since React is based on regular JavaScript, you can access the location property on the window interface. To get the full path of the current URL, you can use window. location. href , and to get the path without the root domain, access window.


1 Answers

In order to receive the path param in you component, you need to first connect your component with withRouter HOC from react-router so that you can access the Router props and get the path params from the match props as this.props.match.params.id

Sample Code:

import {withRouter} from 'react-router';

class BookDetailedView extends React.Component {
    render() {
        var id = this.props.match.params.id


    }
}
export default withRouter(BookDetailedView) ;

or simply passing it with render prop in route as

<Route path="/details/:id" render={({match}) => (
          <BookDetailedView
            bookStateUpdated = {this.bookStateUpdated}
            book = {this.state.books}
            id={match.params.id}
          />
)}/>

From the React Documentation of match

match

A match object contains information about how a <Route path> matched the URL. match objects contain the following properties:

  • params - (object) Key/value pairs parsed from the URL corresponding to the dynamic segments of the path
  • isExact - (boolean) true if the entire URL was matched (no trailing characters)
  • path - (string) The path pattern used to match. Useful for building nested s
  • url - (string) The matched portion of the URL. Useful for building nested s

You’ll have access match objects in various places:

  1. Route component as this.props.match
  2. Route render as ({ match }) => ()
  3. Route children as ({ match }) => ()
  4. withRouter as this.props.match
  5. matchPath as the return value

If a Route does not have a path, and therefore always matches, you’ll get the closest parent match. Same goes for withRouter

like image 135
Shubham Khatri Avatar answered Oct 18 '22 02:10

Shubham Khatri