Come ottenere i parametri di query in react-router v4


91

Sto usando react-router-dom 4.0.0-beta.6 nel mio progetto. Ho un codice come il seguente:

<Route exact path="/home" component={HomePage}/>

E voglio ottenere i parametri della query nel HomePagecomponente. Ho trovato location.searchparam, che assomiglia a questo ?key=value:, quindi non è analizzato.

Qual è il modo giusto per ottenere i parametri di query con React-Router v4?

Risposte:


184

La capacità di analizzare le stringhe di query è stata tolta dalla V4 perché ci sono state richieste nel corso degli anni per supportare diverse implementazioni. Con ciò, il team ha deciso che sarebbe stato meglio per gli utenti decidere l'aspetto di tale implementazione. Si consiglia di importare una stringa di query lib. Eccone uno che uso io

const queryString = require('query-string');

const parsed = queryString.parse(props.location.search);

Puoi anche usarlo new URLSearchParamsse vuoi qualcosa di nativo e funziona per le tue esigenze

const params = new URLSearchParams(props.location.search);
const foo = params.get('foo'); // bar

Puoi leggere di più sulla decisione qui


12
Non utilizzare URLSearchParams senza polyfill. A partire da marzo 2018 Googlebot utilizza Chrome 41 ( developers.google.com/search/docs/guides/rendering ) che non supporta URLSearchParams e la tua app si interromperà se utilizzata in un percorso critico ( caniuse.com/#feat=urlsearchparams ).
Joshua Robinson

15

La risposta data è solida.

Se vuoi usare il modulo qs invece della stringa di query (hanno circa la stessa popolarità), ecco la sintassi:

const query = qs.parse(props.location.search, {
  ignoreQueryPrefix: true
})

L' opzione ignoreQueryPrefix consiste nell'ignorare il punto interrogativo iniziale.


1
Bello. nel gennaio 2019, qs ha 12 milioni di download settimanali contro 2,7 milioni per la stringa di query.
oyalhi

8

Un altro approccio utile potrebbe essere quello di utilizzare il fuori dagli schemi in URLSearchParamsquesto modo;

  let { search } = useLocation();

   const query = new URLSearchParams(search);
   const paramField = query.get('field');
   const paramValue = query.get('value');

Pulito, leggibile e non richiede un modulo. Maggiori informazioni di seguito;


6

La risposta accettata funziona bene, ma se non vuoi installare un pacchetto aggiuntivo, puoi usare questo:

getUrlParameter = (name) => {
    name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
    let regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
    let results = regex.exec(window.location.search);
    return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
  };

Dato http://www.google.co.in/?key=value

getUrlParameter('key');

sarà di ritorno value


Grazie mille amico .. la libreria "query-string" non ha funzionato per me per qualche motivo, ma la tua soluzione ha funzionato a meraviglia. Stavo usando "react-dom": "^ 16.0.0", "react-router": "^ 4.2.0", "react-router-dom": "^ 4.2.2" e "query-string": "^ 5.0.1",
Rohan_Paul

questo presuppone solo che tu abbia un singolo parametro nella tua stringa di query. L'OP chiede chiaramente come ottenere i parametri della query - ed è quello che fanno i moduli npm menzionati. Trasformalo in una funzione che restituisca un oggetto di coppie chiave / valore dalla stringa di query e sarebbe davvero utile!
Andy Lorenz

@ AndyLorenz funziona anche quando hai più parametri di query, chiama una determinata funzione con la chiave di cui desideri ottenere il valore. Anche il metodo Sì può essere trasformato per fornire la mappa dei valori chiave.
kartikag01

funzionerebbe ma non è una buona soluzione @Kartik_Agarwal. (a) Richiederebbe più esecuzioni di essenzialmente lo stesso codice (potenzialmente costoso), (b) dovrebbero essere utilizzate variabili separate per ogni parametro, mentre idealmente dovresti popolare un oggetto di coppie chiave / valore, (c) richiede conoscere i nomi dei parametri e ulteriori controlli per vedere se esistono o meno. Se questo fosse il mio codice, cercherei una regex che possa raccogliere tutti i parametri in modo iterativo, ma devo ammettere che le regex mi fanno sanguinare le orecchie!
Andy Lorenz

5

Stavo facendo ricerche sui parametri per React Router v4 e non l'hanno usato per v4, non come React Router v2 / 3. Lascio un'altra funzione, forse qualcuno la troverà utile. Hai solo bisogno di es6 o semplice javascript.

function parseQueryParams(query) {
  //You get a '?key=asdfghjkl1234567890&val=123&val2&val3=other'
  const queryArray = query.split('?')[1].split('&');
  let queryParams = {};
  for (let i = 0; i < queryArray.length; i++) {
    const [key, val] = queryArray[i].split('=');
    queryParams[key] = val ? val : true;
  }
  /* queryParams = 
     {
      key:"asdfghjkl1234567890",
      val:"123",
      val2:true,
      val3:"other"
     }
  */
  return queryParams;
}

Inoltre, questa funzione può essere migliorata


2

Eh?

queryfie(string){
    return string
        .slice(1)
        .split('&')
        .map(q => q.split('='))
        .reduce((a, c) => { a[c[0]] = c[1]; return a; }, {});
}

queryfie(this.props.location.search);

0

L'ho appena creato, quindi non è necessario modificare l'intera struttura del codice (dove si utilizza la query dall'archivio router redux) se si aggiorna per reagire al router v4 o superiore da una versione inferiore.

https://github.com/saltas888/react-router-query-middleware


1
Un collegamento a una soluzione è il benvenuto, ma assicurati che la tua risposta sia utile senza di essa: aggiungi un contesto attorno al collegamento in modo che i tuoi colleghi utenti abbiano un'idea di cosa sia e perché sia ​​lì, quindi cita la parte più pertinente della pagina che tu " re collegamento a nel caso in cui la pagina di destinazione non è disponibile. Le risposte che sono poco più di un collegamento possono essere eliminate .
mrun

-1

Molto facile

basta usare il gancio useParams()

Esempio:

Router :

<Route path="/user/:id" component={UserComponent} />

Nel tuo componente :

export default function UserComponent() {

  const { id } = useParams();

  return (
    <>{id}</>
  );
}

Questo non funziona per il caso d'uso descritto nella domanda (almeno non con React-Router v4: reactrouter.com/web/api/Hooks/useparams ) useParams espone solo i parametri del percorso, non i parametri di ricerca.
Bennit

-4

Senza bisogno di alcun pacchetto:

const params = JSON.parse(JSON.stringify(this.props.match.params));

Quindi puoi raggiungere i relativi parametri con params.id


3
this.props.match.paramscontiene parametri di percorso, questa domanda riguarda i parametri di query.
Hubert
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.