Як отримати параметри запиту в response-router v4


87

У своєму проекті я використовую response-router-dom 4.0.0-beta.6. У мене є такий код:

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

І я хочу отримати параметри запиту в HomePageкомпоненті. Я знайшов location.searchparam, який виглядає так:, ?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 року qs має 12 мільйонів завантажень щотижня проти 2,7 мільйона для рядка запитів.
oyalhi

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


Дякую тоні, товариш .. бібліотека “рядок запитів” мені чомусь не спрацювала, але ваше рішення спрацювало як шарм. Я використовував "response-dom": "^ 16.0.0", "response-router": "^ 4.2.0", "response-router-dom": "^ 4.2.2" та "query-string": "^ 5.0.1",
Rohan_Paul

це передбачає лише наявність у вашому запиті одного параметра. OP чітко запитує, як отримати параметри запиту - і це те, що роблять згадані модулі npm. Перетворіть це у функцію, яка повертає об'єкт пар ключ / значення із рядка запиту, і це було б дуже корисно!
Енді Лоренц,

@AndyLorenz це працює навіть тоді, коли у вас є кілька параметрів запиту, викликайте задану функцію з ключем, значення якого ви хочете отримати. Метод Так також може бути перетворений, щоб дати карту ключових значень.
kartikag01

це б працювало, але не є гарним рішенням @Kartik_Agarwal. (a) Це вимагало б багаторазового виконання по суті одного і того ж (потенційно дорогого) коду; (b) для кожного параметра потрібно було б використовувати окремі змінні, тоді як в ідеалі ви б заповнювали об’єкт пар ключ / значення, (c) це вимагає Вам потрібно знати імена параметрів та додаткову перевірку, чи існують вони чи ні. Якби це був мій код, я б шукав регулярний вираз, який може ітеративно підбирати всі параметри, але я повинен визнати, що регулярні вирази роблять вуха кровними!
Енді Лоренц,

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 або звичайний 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;
}

Крім того, цю функцію можна вдосконалити


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

Я щойно зробив це, тому не потрібно міняти всю структуру коду (де ви використовуєте запит із магазину redux router store), якщо ви оновлюєтесь, щоб реагувати на маршрутизатор v4 або новішої версії з нижчої версії.

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

Це не працює для випадку використання, описаного у питанні (принаймні, не з React-Router v4: responserouter.com/web/api/Hooks/useparams ) useParams виставляє лише параметри шляху, а не параметри пошуку.
Бенніт,

-4

Без потреби будь-якого пакета:

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

Тоді ви можете досягти відповідних параметрів за допомогою params.id


3
this.props.match.paramsмістить параметри шляху, це питання стосується параметрів запитів.
Губерт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.