React-router v4'te sorgu parametreleri nasıl alınır


89

Projemde react-router-dom 4.0.0-beta.6 kullanıyorum. Aşağıdaki gibi bir kodum var:

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

Ve HomePagebileşende sorgu parametreleri almak istiyorum . Ben location.searchşuna benzeyen bir param buldum : ?key=valueyani ayrıştırılmamış.

React-router v4 ile sorgu parametreleri almanın doğru yolu nedir?

Yanıtlar:


184

Yıllar boyunca farklı uygulamaları desteklemek için talepler olduğu için sorgu dizelerini ayrıştırma yeteneği V4'ten çıkarıldı. Ekip, bununla birlikte, kullanıcıların bu uygulamanın neye benzediğine karar vermesinin en iyisi olduğuna karar verdi. Bir sorgu dizesi kütüphanesini içe aktarmanızı öneririz. İşte kullandığım biri

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

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

new URLSearchParamsYerel bir şey istiyorsanız da kullanabilirsiniz ve ihtiyaçlarınız için çalışır

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

Sen karar hakkında daha fazla bilgi bulabilirsiniz burada


12
URLSearchParams'ı polyfill olmadan kullanmayın. Mart 2018 itibarıyla Googlebot, URLSearchParams'ı desteklemeyen Chrome 41'i ( developer.google.com/search/docs/guides/rendering ) kullanıyor ve uygulamanız kritik bir yolda ( caniuse.com/#feat=urlsearchparams ) kullanılırsa bozulacaktır .
Joshua Robinson

15

Verilen cevap sağlam.

Sorgu dizesi yerine qs modülünü kullanmak istiyorsanız (bunlar popülerlik açısından eşittir), işte sözdizimi:

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

İgnoreQueryPrefix seçeneği lider soru işareti göz ardı etmektir.


1
Güzel. Ocak 2019'da qs, haftalık 12 milyon indirmeye karşılık, sorgu dizesi için 2,7 milyon indirmeye sahip.
oyalhi

6

Kabul edilen cevap iyi çalışıyor ancak ek bir paket kurmak istemiyorsanız, bunu kullanabilirsiniz:

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

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

getUrlParameter('key');

dönecek value


Çok teşekkürler dostum .. "sorgu dizisi" kitaplığı benim için bir nedenden ötürü işe yaramadı, ancak çözümünüz harika çalıştı. "React-dom": "^ 16.0.0", "react-router": "^ 4.2.0", "react-router-dom": "^ 4.2.2" ve "query-string" kullanıyordum: "^ 5.0.1",
Rohan_Paul

bu yalnızca sorgu dizenizde tek bir parametreniz olduğunu varsayar. OP, sorgu parametrelerinin nasıl alınacağını açıkça sorar - ve bahsedilen npm modüllerinin yaptığı budur. Bunu, sorgu dizesinden anahtar / değer çiftlerinin bir nesnesini döndüren bir işleve dönüştürün ve bu gerçekten yararlı olacaktır!
Andy Lorenz

@AndyLorenz, birden fazla sorgu parametreniz olduğunda bile çalışır, verilen işlevi değerini almak istediğiniz anahtarla çağırın. Yes yöntemi de anahtar değerlerin haritasını verecek şekilde dönüştürülebilir.
kartikag01

bu işe yarayacak ama iyi bir çözüm değil @Kartik_Agarwal. (a) Esasen aynı (potansiyel olarak pahalı) kodun birden fazla yürütülmesini gerektirecektir, (b) her parametre için ayrı değişkenlerin kullanılması gerekirken, ideal olarak anahtar / değer çiftlerinden oluşan bir nesneyi doldurmanız gerekir, (c) parametre adlarınızı bilmeniz ve var olup olmadıklarını görmek için ek kontrol yapmanız gerekir. Bu benim kodum olsaydı, tüm parametreleri yinelemeli olarak alabilen bir normal ifade arardım, ancak regex'lerin kulaklarımı kanarttığını itiraf etmeliyim!
Andy Lorenz


5

React router v4 için parametreler hakkında araştırma yapıyordum ve v4 için kullanmadılar, react router v2 / 3 gibi değil. Başka bir işlevi bırakacağım - belki birileri onu yararlı bulacaktır. Yalnızca es6 veya düz javascript'e ihtiyacınız var.

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;
}

Ayrıca bu işlev geliştirilebilir


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

Bunu az önce yaptım, bu nedenle daha düşük bir sürümden yönlendirici v4 veya daha yüksek bir sürümden yanıt vermek için güncelleme yaparsanız, tüm kod yapısını (redux yönlendirici deposundan sorgu kullandığınız yerde) değiştirmeniz gerekmez.

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


1
Bir çözüme bağlantı memnuniyetle karşılanır, ancak lütfen cevabınızın o olmadan yararlı olduğundan emin olun: Bağlantının etrafına bağlam ekleyin, böylece diğer kullanıcılarınız bunun ne olduğu ve neden orada olduğu konusunda fikir sahibi olur, ardından sayfanın en alakalı bölümünü alıntı yapın hedef sayfanın mevcut olmaması durumunda yeniden bağlanma. Bir bağlantıdan biraz daha fazla olan cevaplar silinebilir .
mrun

-1

Çok kolay

sadece kanca kullan useParams()

Misal:

Yönlendirici :

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

Bileşeninizde :

export default function UserComponent() {

  const { id } = useParams();

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

Bu, soruda açıklanan kullanım durumu için işe yaramaz (en azından React-Router v4: reactrouter.com/web/api/Hooks/useparams ile ) useParams, arama parametrelerini değil, yalnızca yol parametrelerini ortaya çıkarır.
Bennit

-4

Herhangi bir pakete ihtiyaç duymadan:

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

Ardından ilgili parametrelere ulaşabilirsiniz. params.id


3
this.props.match.paramsyol parametreleri içerir, bu soru sorgu parametreleri hakkındadır.
Hubert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.