Jak uzyskać parametry zapytania w React-router v4


91

W moim projekcie używamreak-router-dom 4.0.0-beta.6. Mam następujący kod:

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

Chcę uzyskać parametry zapytania w HomePagekomponencie. Znalazłem location.searchparametr, który wygląda ?key=valuetak:, więc nie został przeanalizowany.

Jaki jest właściwy sposób uzyskiwania parametrów zapytania za pomocą routera React-router v4?

Odpowiedzi:


184

Możliwość analizowania ciągów zapytań została usunięta z V4, ponieważ przez lata pojawiały się prośby o obsługę różnych implementacji. W związku z tym zespół zdecydował, że najlepiej będzie, jeśli użytkownicy zdecydują, jak wygląda ta implementacja. Zalecamy zaimportowanie ciągu zapytania lib. Oto jeden, którego używam

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

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

Możesz również użyć, new URLSearchParamsjeśli chcesz coś natywnego i działa na Twoje potrzeby

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

Więcej o decyzji przeczytasz tutaj


12
Nie używaj URLSearchParams bez polyfill. Od marca 2018 r. Googlebot korzysta z przeglądarki Chrome 41 ( developers.google.com/search/docs/guides/rendering ), która nie obsługuje URLSearchParams, a Twoja aplikacja ulegnie awarii, jeśli zostanie użyta w ścieżce krytycznej ( caniuse.com/#feat=urlsearchparams ).
— Joshua Robinson,

15

Podana odpowiedź jest solidna.

Jeśli chcesz użyć modułu qs zamiast ciągu zapytania (mają one podobną popularność), oto składnia:

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

Opcja ignoreQueryPrefix służy do ignorowania wiodącego znaku zapytania.


1
Miły. w styczniu 2019 r. qs ma 12 milionów pobrań tygodniowo w porównaniu do 2,7 miliona w przypadku ciągu zapytania.
— oyalhi


6

Zaakceptowana odpowiedź działa dobrze, ale jeśli nie chcesz instalować dodatkowego pakietu, możesz użyć tego:

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

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

getUrlParameter('key');

wróci value


Dzięki za tonę. Biblioteka „ciąg zapytania” z jakiegoś powodu nie działała dla mnie, ale twoje rozwiązanie działało jak marzenie. Używałem „reaguj-dom”: „^ 16.0.0”, „reaguj-router”: „^ 4.2.0”, „reaguj-router-dom”: „^ 4.2.2” i „ciąg-zapytania”: „^ 5.0.1”,
— Rohan_Paul

zakłada to tylko, że masz jeden parametr w swoim kwerendie. OP wyraźnie pyta, jak uzyskać parametry zapytania - i to właśnie robią wspomniane moduły npm. Zamień to w funkcję, która zwraca obiekt par klucz / wartość z ciągu zapytania i to byłoby naprawdę przydatne!
— Andy Lorenz

@AndyLorenz to działa nawet, gdy masz wiele parametrów zapytania, wywołaj daną funkcję z kluczem, którego wartość chcesz uzyskać. Tak, metodę można również przekształcić, aby uzyskać mapę wartości kluczowych.
— kartikag01

to by działało, ale nie jest dobrym rozwiązaniem @Kartik_Agarwal. (a) Wymagałoby to wielu wykonań zasadniczo tego samego (potencjalnie kosztownego) kodu, (b) dla każdego parametru należałoby użyć oddzielnych zmiennych, podczas gdy idealnie byłoby wypełnić obiekt parami klucz / wartość, (c) wymaga poznanie nazw parametrów i dodatkowe sprawdzenie, czy istnieją, czy nie. Gdyby to był mój kod, szukałbym wyrażenia regularnego, które może przechwytywać wszystkie parametry iteracyjnie, ale muszę przyznać, że wyrażenia regularne powodują krwawienie uszu!
— Andy Lorenz

5

Szukałem parametrów dla routera reagującego v4, a oni nie używali go dla wersji 4, a nie jak router reagujący v2 / 3. Zostawię inną funkcję - może komuś się to przyda. Potrzebujesz tylko es6 lub zwykłego 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;
}

Tę funkcję można również ulepszyć


2

Ech?

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

Właśnie to zrobiłem, więc nie musisz zmieniać całej struktury kodu (gdzie używasz zapytania ze sklepu routera Redux), jeśli aktualizujesz, aby reagować na router v4 lub nowszy z niższej wersji.

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


1
Link do rozwiązania jest mile widziany, ale upewnij się, że Twoja odpowiedź jest przydatna bez niego: dodaj kontekst wokół linku, aby inni użytkownicy mieli pojęcie, co to jest i dlaczego się tam znajduje, a następnie zacytuj najbardziej odpowiednią część strony, którą podałeś. ponowne łącze w przypadku, gdy strona docelowa jest niedostępna. Odpowiedzi, które są niewiele więcej niż linkiem, mogą zostać usunięte .
— mrun

-1

Bardzo łatwe

po prostu użyj haka useParams()

Przykład:

Router :

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

W twoim składniku :

export default function UserComponent() {

  const { id } = useParams();

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

To nie działa w przypadku użycia opisanym w pytaniu (przynajmniej nie z React-Router v4: awarerouter.com/web/api/Hooks/useparams ) useParams ujawnia tylko parametry ścieżki, a nie parametry wyszukiwania.
— Bennit

-4

Bez potrzeby jakiegokolwiek pakietu:

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

Następnie możesz dotrzeć do powiązanych parametrów za pomocą params.id


3
this.props.match.paramszawiera parametry ścieżki, to pytanie dotyczy parametrów zapytania.
— Hubert
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.