So erhalten Sie Abfrageparameter in React-Router v4


86

Ich verwende React-Router-Dom 4.0.0-Beta.6 in meinem Projekt. Ich habe einen Code wie folgt:

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

Und ich möchte Abfrageparameter in der HomePageKomponente erhalten. Ich habe location.searchparam gefunden , der so aussieht : ?key=value, also ist es nicht analysiert.

Was ist der richtige Weg, um Abfrageparameter mit React-Router v4 abzurufen?

Antworten:


176

Die Möglichkeit, Abfragezeichenfolgen zu analysieren, wurde aus V4 entfernt, da im Laufe der Jahre Anforderungen zur Unterstützung unterschiedlicher Implementierungen gestellt wurden. Damit entschied das Team, dass es für die Benutzer am besten ist, zu entscheiden, wie diese Implementierung aussieht. Wir empfehlen, eine Abfragezeichenfolge lib zu importieren. Hier ist eine, die ich benutze

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

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

Sie können es auch verwenden, new URLSearchParamswenn Sie etwas Natives möchten und es für Ihre Bedürfnisse funktioniert

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

Mehr über die Entscheidung können Sie hier lesen


12
Verwenden Sie URLSearchParams nicht ohne Polyfill. Ab März 2018 verwendet Googlebot Chrome 41 ( developer.google.com/search/docs/guides/rendering ), das URLSearchParams nicht unterstützt, und Ihre App wird bei Verwendung in einem kritischen Pfad ( caniuse.com/#feat=urlsearchparams ) beschädigt .
Joshua Robinson

11

Die gegebene Antwort ist solide.

Wenn Sie die verwenden möchten qs Modul statt Abfrage-String (sie sind ungefähr gleich in der Popularität), hier ist die Syntax:

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

Die Option ignoreQueryPrefix besteht darin, das führende Fragezeichen zu ignorieren.


1
Nett. Im Januar 2019 hat qs 12 Millionen wöchentliche Downloads gegenüber 2,7 Millionen für Abfragezeichenfolgen.
Oyalhi

6

Die akzeptierte Antwort funktioniert gut, aber wenn Sie kein zusätzliches Paket installieren möchten, können Sie Folgendes verwenden:

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, ' '));
  };

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

getUrlParameter('key');

wird zurückkehren value


Vielen Dank, Kumpel. Die Bibliothek mit den "Abfragezeichenfolgen" hat aus irgendeinem Grund bei mir nicht funktioniert, aber Ihre Lösung hat wie ein Zauber funktioniert. Ich habe "react-dom" verwendet: "^ 16.0.0", "react-router": "^ 4.2.0", "react-router-dom": "^ 4.2.2" und "query-string": "^ 5.0.1",
Rohan_Paul

Dies setzt nur voraus, dass Sie einen einzelnen Parameter in Ihrem Querystring haben. Das OP fragt eindeutig, wie Abfrageparameter abgerufen werden sollen - und genau das tun die genannten npm-Module. Verwandeln Sie dies in eine Funktion, die ein Objekt aus Schlüssel / Wert-Paaren aus der Abfragezeichenfolge zurückgibt, und das wäre wirklich nützlich!
Andy Lorenz

@AndyLorenz Dies funktioniert sogar, wenn Sie mehrere Abfrageparameter haben. Rufen Sie die angegebene Funktion mit dem Schlüssel auf, dessen Wert Sie erhalten möchten. Die Yes-Methode kann auch transformiert werden, um eine Karte der Schlüsselwerte zu erhalten.
Kartikag01

das würde funktionieren aber keine gute lösung @Kartik_Agarwal. (a) Es würde mehrere Ausführungen von im Wesentlichen demselben (möglicherweise teuren) Code erfordern, (b) für jeden Parameter müssten separate Variablen verwendet werden, während Sie im Idealfall ein Objekt aus Schlüssel / Wert-Paaren füllen würden, (c) es erfordert Sie müssen Ihre Parameternamen kennen und zusätzlich prüfen, ob sie existieren oder nicht. Wenn dies mein Code wäre, würde ich nach einer Regex suchen, die alle Parameter iterativ erfassen kann, aber ich muss zugeben, dass Regexs meine Ohren bluten lassen!
Andy Lorenz


5

Ich habe über Parameter für React Router v4 recherchiert und sie haben sie nicht für v4 verwendet, nicht wie React Router v2 / 3. Ich werde eine andere Funktion verlassen - vielleicht findet es jemand hilfreich. Sie benötigen nur es6 oder einfaches 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;
}

Auch diese Funktion kann verbessert werden


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

Ich habe dies gerade gemacht, damit Sie nicht die gesamte Codestruktur ändern müssen (wenn Sie eine Abfrage aus dem Redux-Router-Speicher verwenden), wenn Sie ein Update durchführen, um Router v4 oder höher von einer niedrigeren Version zu reagieren.

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


1
Ein Link zu einer Lösung ist willkommen, aber stellen Sie sicher, dass Ihre Antwort ohne sie nützlich ist: Fügen Sie dem Link einen Kontext hinzu, damit Ihre Mitbenutzer eine Vorstellung davon haben, was es ist und warum es dort ist, und zitieren Sie dann den relevantesten Teil der Seite, die Sie verwenden. erneutes Verknüpfen mit, falls die Zielseite nicht verfügbar ist. Antworten, die kaum mehr als ein Link sind, können gelöscht werden .
Mrun

-4

Ohne Paket:

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

Dann können Sie die zugehörigen Parameter mit erreichen params.id


3
this.props.match.paramsenthält Pfadparameter, diese Frage bezieht sich auf Abfrageparameter.
Hubert
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.