15

I've a little problem with reach router, using react hooks. I need capture the params of the route in the browser I tried with props of the native documentation in the web of reach router but that is not giving me the param, the route is this: http://localhost:8080/home?init=true

How to capture that variable "init"?

Subin Sebastian
  • 10,870
  • 3
  • 37
  • 42
David Acevedo
  • 173
  • 1
  • 6

2 Answers2

21

In no time, most of us will be redoing this everytime, so it's best to create a custom hook just to do this.

// A custom hook that builds on useLocation to parse
// the query string for you.
export const useQuery = queryParam => {
  const search = new URLSearchParams(useLocation().search);
  return search.get(queryParam);
};
Anurag Srivastava
  • 14,077
  • 4
  • 33
  • 43
Asim K T
  • 16,864
  • 10
  • 77
  • 99
19

Reach Router has a useLocation hook you can use:

import { useLocation } from "@reach/router"
// then 
const location = useLocation()

In location.search is the search field, containing all the query parameters (query strings) from your URL. In your example, /home?init=true would return location.search: "?init=true", which is a query string.

You can use query-string library (yarn add query-string) to parse this:

import { parse } from "query-string"
// then
const searchParams = parse(location.search)

which would give you object {init: "true"} you could also parse booleans with queryString.parse('foo=true', {parseBooleans: true})

So the full example would be

import { useLocation } from "@reach/router"
import { parse } from "query-string"
// and
const location = useLocation()
const searchParams = parse(location.search) // => {init: "true"}
willlma
  • 7,353
  • 2
  • 30
  • 45
sunapi386
  • 1,167
  • 14
  • 18