বিক্রিয়া-রাউটার ভি 4-এ কীভাবে প্যারামিতি পাবেন


89

আমি আমার প্রকল্পে প্রতিক্রিয়া-রাউটার-ডম 4.0.0-বিটা 6 ব্যবহার করছি। আমার নীচের মতো একটি কোড রয়েছে:

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

এবং আমি HomePageউপাদানটিতে ক্যোয়ারী প্যারামগুলি পেতে চাই । আমি পরম পেয়েছি location.search, যা দেখতে এরকম দেখাচ্ছে: ?key=valueতাই এটি অংশীদারি করা যায় না।

বিক্রিয়া-রাউটার ভি 4 এর সাথে ক্যোয়ারী প্যারামগুলি পাওয়ার সঠিক উপায় কী?

উত্তর:


184

ক্যোয়ারী স্ট্রিংগুলিকে পার্স করার ক্ষমতা ভি 4 এর বাইরে নেওয়া হয়েছিল কারণ বিভিন্ন বাস্তবায়নের সমর্থনের জন্য কয়েক বছর ধরে অনুরোধ রয়েছে। এটির সাথেই, টিম সিদ্ধান্ত নিয়েছে যে ব্যবহারকারীর পক্ষে বাস্তবায়ন কেমন তা সিদ্ধান্ত নেওয়া সবচেয়ে ভাল be আমরা একটি ক্যোরি স্ট্রিং 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
পলিফিল ছাড়াই ইউআরএল সার্চপ্যারাম ব্যবহার করবেন না। মার্চ 2018 এর মধ্যে গুগলবোট ক্রোম 41 ( ডেভেলপার্স.কম / সার্চ / ডকস / গাইডস / রেন্ডারিং) ব্যবহার করে যা ইউআরএল সার্চপ্যারামগুলিকে সমর্থন করে না এবং একটি জটিল পথে ( caniuse.com/#feat=urlsearchparams ) ব্যবহৃত হলে আপনার অ্যাপ্লিকেশনটি ভেঙে যাবে ।
জোশুয়া রবিনসন

15

প্রদত্ত উত্তরটি শক্ত।

আপনি যদি ক্যোরি -স্ট্রিংয়ের পরিবর্তে qs মডিউলটি ব্যবহার করতে চান (তারা জনপ্রিয়তার প্রায় সমান হয়), এখানে বাক্য গঠন রয়েছে:

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

IgnoreQueryPrefix বিকল্প নেতৃস্থানীয় প্রশ্ন চিহ্ন উপেক্ষা করার নয়।


4
ভাল লাগল জানুয়ারী 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",
রোহান_পল 3'17

এটি কেবলমাত্র আপনার ক্যোরিস্ট্রিংয়ে আপনার একক প্যারামিটার ধরেছে। ওপি স্পষ্টভাবে জিজ্ঞাসা প্যারামগুলি কীভাবে পেতে পারে তার জন্য জিজ্ঞাসা করে - এবং এটি এনপিএম মডিউলগুলি উল্লিখিত করে। এটিকে এমন একটি ফাংশনে পরিণত করুন যা ক্যোয়ারী স্ট্রিং থেকে কী / মান জোড়ার একটি অবজেক্ট ফেরত দেয় এবং এটি সত্যই কার্যকর হবে!
অ্যান্ডি লরেঞ্জ

@ অ্যান্ডিলোরেনজ এটি এমনকি যখন আপনার একাধিক ক্যোয়ারী প্যারাম থাকে তখন কী কাজ করে যার মান আপনি পেতে চান তার সাথে কল দেওয়া ফাংশনটি কল করুন works হ্যাঁ পদ্ধতিটি কী মানগুলির মানচিত্র দেওয়ার জন্যও রুপান্তরিত হতে পারে।
kartikag01

এটি কার্যকর হবে তবে @ কার্তিক_আরওয়াল ভাল সমাধান নয়। (ক) এটির জন্য মূলত একই (সম্ভাব্য ব্যয়বহুল) কোডের একাধিক মৃত্যুদন্ডের প্রয়োজন হবে, (খ) প্রতিটি প্যারামিটারের জন্য পৃথক ভেরিয়েবলগুলি ব্যবহার করা প্রয়োজন, যেখানে আদর্শভাবে আপনি কী / মান জোড়ের কোনও বস্তু প্রস্তুত করবেন, (সি) এটির প্রয়োজন আপনাকে আপনার প্যারামিটারের নামগুলি জানতে হবে এবং সেগুলি রয়েছে কি না তা দেখার জন্য অতিরিক্ত চেকিং। এটি যদি আমার কোড হয় তবে আমি এমন একটি রেজেক্সের সন্ধান করতাম যা সমস্ত পরামিতি পুনরাবৃত্তভাবে বাছাই করতে পারে, তবে আমাকে স্বীকার করতে হবে রেজেক্সগুলি আমার কান রক্তাক্ত করে তুলবে!
অ্যান্ডি লরেনজ

6

এর URLSearchParamsমতো বাক্সের বাইরে ব্যবহার করার জন্য আরেকটি দরকারী পন্থা হতে পারে ;

  let { search } = useLocation();

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

পরিষ্কার, পঠনযোগ্য এবং একটি মডিউল প্রয়োজন হয় না। নীচে আরও তথ্য;


5

আমি প্রতিক্রিয়া রাউটার ভি 4 এর জন্য প্যারামগুলি নিয়ে গবেষণা করছিলাম এবং তারা এটি ভি 4 এর জন্য ব্যবহার করেনি, রাউটার ভি 2/3 প্রতিক্রিয়াটির মতো নয়। আমি অন্য একটি ফাংশন ছেড়ে যাব - সম্ভবত কেউ এটি সহায়ক বলে মনে করবে। আপনার কেবল এসআই 6 বা সরল জাভাস্ক্রিপ্টের প্রয়োজন।

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

আমি কেবল এটি তৈরি করেছি তাই আপনি যদি কোনও রাউটার ভি 4 বা তার চেয়ে কম সংস্করণ থেকে উচ্চতর প্রতিক্রিয়া আপডেট করে থাকেন তবে পুরো কোড কাঠামোটি (যেখানে আপনি রিডেক্স রাউটার স্টোর থেকে কোয়েরি ব্যবহার করবেন) পরিবর্তন করার দরকার নেই।

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


4
একটি সমাধানের একটি লিঙ্ক স্বাগত, তবে দয়া করে আপনার উত্তরটি কার্যকর না হওয়া নিশ্চিত করুন: লিঙ্কটির চারপাশে প্রসঙ্গ যুক্ত করুন যাতে আপনার সহ ব্যবহারকারীদের কিছু ধারণা থাকতে পারে এটি কী এবং কেন এটি রয়েছে, তারপরে আপনি পৃষ্ঠার সর্বাধিক প্রাসঙ্গিক অংশটি উদ্ধৃত করুন লক্ষ্য পৃষ্ঠাটি অনুপলব্ধ ক্ষেত্রে লিঙ্কটি পুনরায় সংযুক্ত করুন। লিঙ্কের চেয়ে সামান্য বেশি উত্তর মুছতে পারে
mrun

-1

খুব সহজ

শুধু হুক ব্যবহার করুন useParams()

উদাহরণ:

রাউটার :

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

আপনার কম্পোনেন টিতে:

export default function UserComponent() {

  const { id } = useParams();

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

প্রশ্নটিতে বর্ণিত ব্যবহারের ক্ষেত্রে এটি কাজ করে না (কমপক্ষে প্রতিক্রিয়া-রাউটার v4 এর সাথে নয়: রিঅ্যাক্ট্রোটার.com / web / api / Hooks / useparams ) ব্যবহারের প্যারামগুলি কেবলমাত্র প্যারামগুলিকেই উন্মোচিত করে, অনুসন্ধানের প্যারামগুলি নয়।
বেনিট

-4

কোনও প্যাকেজের প্রয়োজন ছাড়াই:

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

তারপরে আপনি এর সাথে সম্পর্কিত পরামিতিগুলিতে পৌঁছাতে পারেন params.id


4
this.props.match.paramsপাথের প্যারামগুলি রয়েছে, এই প্রশ্নটি ক্যোয়ারী প্যারামগুলি সম্পর্কে।
হুবার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.