How to pass data from a page to another page using react router

Solution 1:

Option 1: Pass Route State

Send the state in the route transition.

  • Using react-router-dom v5

You can pass some state unique to the mapped entry, like info.id along with the route push that happens when the link is clicked. This obfuscates the data from the user as you aren't leaking information out to the ui (i.e. the browser).

<Link
  to={{
    pathname: '/home/userDetails',
    state: {
      infoId: info.id,
    },
  }}
>
  • Using react-router-dom v6

The link API changed a bit in v6, the state is now a prop.

<Link
  to='/home/userDetails'
  state={
    infoId: info.id,
  }
>

You can then unpack the state from the location prop/object on the component being returned by that route. Use guards in case a user has navigated to '/home/userDetails' from elsewhere, as state may be undefined.

If passed route props:

props.location && props.location.state && props.location.state.infoId

or

props.location?.state?.infoId

if using function components then you can also use the useLocation React hook:

const { state: { infoId } = {} } = useLocation();

Edit lucid-kowalevski-uxgs4

Option 2: Pass Something in the URL

<Link to={`/home/userDetails/${info.id}`>

And retrieve the param from the match prop in the returned route component. For example if the route looks like this:

<Route path="/home/userDetails/:infoId" component={... } />

Then in the component get id:

props.match.params.infoId

And in the case of function components, the useParams React hook:

const { infoId } = useParams();

The user can see this, but you don't have to use the guard pattern to access since by definitions it'll be defined by the route (though infoID can still be defined if the user types in an invalid id).

  • Link to
  • location
  • match
  • useLocation
  • useParams