प्रतिक्रिया-राउटर v4 में क्वेरी पैरामीटर कैसे प्राप्त करें


87

मैं अपनी परियोजना में प्रतिक्रिया-राउटर-डोम 4.0.0-beta.6 का उपयोग कर रहा हूं। मेरे पास निम्नलिखित जैसा एक कोड है:

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

और मैं HomePageघटक में क्वेरी परम प्राप्त करना चाहता हूं । मुझे location.searchपरम मिला है , जो इस तरह दिखता है: ?key=valueइसलिए यह अप्रकाशित है।

प्रतिक्रिया-राउटर v4 के साथ क्वेरी परम प्राप्त करने का सही तरीका क्या है?

जवाबों:


181

क्वेरी स्ट्रिंग को पार्स करने की क्षमता को V4 से बाहर निकाल दिया गया था क्योंकि विभिन्न कार्यान्वयन का समर्थन करने के लिए वर्षों से अनुरोध किए गए हैं। इसके साथ, टीम ने फैसला किया कि उपयोगकर्ताओं के लिए यह तय करना सबसे अच्छा होगा कि कार्यान्वयन कैसा दिखता है। हम एक क्वेरी स्ट्रिंग lib आयात करने की सलाह देते हैं। यहाँ एक है जो मैं उपयोग करता हूं

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

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

आप भी उपयोग कर सकते हैं new URLSearchParamsयदि आप कुछ देशी चाहते हैं और यह आपकी आवश्यकताओं के लिए काम करता है

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

आप यहाँ निर्णय के बारे में अधिक पढ़ सकते हैं


12
बिना पॉलीफ़िल के URLSearchParams का उपयोग न करें। मार्च 2018 तक Googlebot Chrome 41 ( Developers.google.com/search/docs/guides/rendering ) का उपयोग करता है, जो URLSearchParams का समर्थन नहीं करता है और यदि कोई महत्वपूर्ण पथ ( caniuse.com/#feat-urlsearchparams ) में उपयोग किया जाता है तो आपका ऐप टूट जाएगा ।
जोशुआ रॉबिन्सन

12

दिया गया उत्तर ठोस है।

यदि आप क्वेरी-स्ट्रिंग के बजाय qs मॉड्यूल का उपयोग करना चाहते हैं (वे लोकप्रियता में बराबर हैं), तो यहां वाक्यविन्यास है:

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

IgnoreQueryPrefix विकल्प प्रमुख प्रश्न चिह्न अनदेखी करने के लिए है।


1
अच्छा लगा। जनवरी 2019 में, क्यू-स्ट्रिंग के लिए क्यूएस में 12 मिलियन साप्ताहिक डाउनलोड बनाम 2.7 मिलियन हैं।
इलोहि

6

स्वीकृत उत्तर अच्छी तरह से काम करता है, लेकिन यदि आप एक अतिरिक्त पैकेज स्थापित नहीं करना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

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

दिया हुआ http://www.google.co.in/?key=value

getUrlParameter('key');

वापस होगा value


एक टन दोस्त का धन्यवाद .. "क्वेरी-स्ट्रिंग" लाइब्रेरी ने किसी कारण से मेरे लिए काम नहीं किया, लेकिन आपके समाधान ने एक आकर्षण की तरह काम किया। मैं "प्रतिक्रिया-डोम" का उपयोग कर रहा था: "^ 16.0.0", "प्रतिक्रिया-रूटर": "^ 4.2.0", "प्रतिक्रिया-रूटर-डोम": "^ 4.2.2" और "क्वेरी-स्ट्रिंग": "^ 5.0.1",
रोहन_पॉल

यह केवल यह मान लेता है कि आपके पास अपने querystring में एक ही पैरामीटर है। ओपी स्पष्ट रूप से पूछते हैं कि क्वेरी परम कैसे प्राप्त करें - और यही npm मॉड्यूल का उल्लेख करते हैं। क्वेरी स्ट्रिंग से कुंजी / मान जोड़े की एक वस्तु लौटाता है और वास्तव में उपयोगी होगा कि एक समारोह में यह बारी !
एंडी लोरेन्ज

@AndyLorenz यह तब भी काम करता है जब आपके पास कई क्वेरी परम हैं, कुंजी के साथ दिए गए फ़ंक्शन को कॉल करें जिसका मूल्य आप प्राप्त करना चाहते हैं। प्रमुख मूल्यों का मानचित्र देने के लिए हां विधि को भी रूपांतरित किया जा सकता है।
kartikag01

यह काम करेगा लेकिन अच्छा समाधान नहीं @Kartik_Agarwal। (ए) इसके लिए अनिवार्य रूप से समान (संभावित रूप से महंगा) कोड के कई निष्पादन की आवश्यकता होगी, (बी) प्रत्येक पैरामीटर के लिए अलग-अलग चर का उपयोग करने की आवश्यकता होगी, जबकि आदर्श रूप से आप कुंजी / मान जोड़े के एक ऑब्जेक्ट को पॉप्युलेट करेंगे, (ग) इसके लिए आवश्यकता होती है आप अपने पैरामीटर के नाम, और अतिरिक्त जाँच से पता कर सकते हैं कि वे मौजूद हैं या नहीं। अगर यह मेरा कोड होता है तो मैं एक regex की तलाश करूँगा जो सभी मापदंडों को पुनरावृत्त रूप से उठा सके, लेकिन मुझे यह स्वीकार करना होगा कि regexs मेरे कानों से खून निकालते हैं!
एंडी लोरेंज

6

एक और उपयोगी दृष्टिकोण URLSearchParamsइस तरह से बॉक्स से बाहर का उपयोग करना हो सकता है ;

  let { search } = useLocation();

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

साफ, पठनीय और एक मॉड्यूल की आवश्यकता नहीं है। नीचे अधिक जानकारी;


5

मैं राउटर v4 के लिए पैरामेट्स के बारे में शोध कर रहा था, और उन्होंने इसका उपयोग v4 के लिए नहीं किया, राउटर v2 / 3 की तरह नहीं। मैं एक और फंक्शन छोड़ दूंगा - शायद किसी को यह मददगार लगे। आपको केवल es6 या सादे जावास्क्रिप्ट की आवश्यकता है।

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

साथ ही, इस फ़ंक्शन को बेहतर बनाया जा सकता है


2

एह?

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

यदि आपने राउटर v4 या उच्चतर संस्करण से कम प्रतिक्रिया करने के लिए अद्यतन किया है, तो मैंने इसे पूरा कोड संरचना (जहाँ आप Redux राउटर स्टोर से क्वेरी का उपयोग करते हैं) को बदलने की आवश्यकता नहीं है।

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


1
किसी समाधान के लिए लिंक का स्वागत है, लेकिन कृपया सुनिश्चित करें कि आपका उत्तर इसके बिना उपयोगी है: लिंक के चारों ओर संदर्भ जोड़ें ताकि आपके साथी उपयोगकर्ताओं को कुछ पता चले कि यह क्या है और यह क्यों है, तो पृष्ठ के सबसे प्रासंगिक भाग को उद्धृत करें ' मामले में लक्ष्य पृष्ठ अनुपलब्ध होने पर पुनः लिंक करना। ऐसे लिंक जो किसी लिंक से बहुत कम हैं उन्हें हटाया जा सकता है
मारून

0

बहुत आसान

बस हुक का उपयोग करें useParams()

उदाहरण:

राउटर :

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

आपके इटैलियन टी में:

export default function UserComponent() {

  const { id } = useParams();

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

यह प्रश्न में वर्णित उपयोग के मामले के लिए काम नहीं करता है (कम से कम रिएक्ट-राउटर v4 के साथ नहीं: reactrouter.com/web/api/Hooks/useparams ) उपयोगपराम केवल पथ पार्म्स को उजागर करता है, न कि खोज पैरामस।
बेनिटिट

-4

किसी भी पैकेज की आवश्यकता के बिना:

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

फिर आप संबंधित मापदंडों तक पहुंच सकते हैं params.id


3
this.props.match.paramsइसमें पथ सम्‍मिलित हैं, यह प्रश्‍न क्वेरी परम के बारे में है।
ह्यूबर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.