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?

andrfas
quelle

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

Tyler McGinnis
quelle
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.

fisch2
quelle
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

kartikag01
quelle
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
6

Ein weiterer nützlicher Ansatz könnte darin bestehen, das Out-of-the-Box-Verfahren URLSearchParamswie folgt zu verwenden.

  let { search } = useLocation();

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

Sauber, lesbar und benötigt kein Modul. Weitere Infos unten;

user10750437
quelle
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

Xopsie
quelle
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);
Faheem
quelle
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

Dimitris Saltaferis
quelle
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

Mesarikaya
quelle
3
this.props.match.paramsenthält Pfadparameter, diese Frage bezieht sich auf Abfrageparameter.
Hubert