Как разобрать строку запроса в react-router v4

В react-router v3 я мог получить к нему доступ с помощью props.location.query.foo (если текущее местоположение было ?foo=bar)

В [email protected] props.location есть только props.location.search со строкой типа ?foo=bar&other=thing.

Возможно, мне нужно вручную проанализировать и разобрать эту строку, чтобы найти значение для foo или other.

Скриншот console.log(this.props): введите здесь описание изображения (Обратите внимание, как из ?artist=band здесь я хотел бы получить значение из artist, которое является значением band)


person Peter Bengtsson    schedule 17.03.2017    source источник
comment
Чтобы связать себя, я импортирую npmjs.com/package/query-string и сделать это вручную.   -  person Peter Bengtsson    schedule 17.03.2017
comment
у вас уже есть строка запроса здесь! ничего с React. Это больше о чистом Javascript.   -  person Thomas Decaux    schedule 16.01.2019


Ответы (7)


Похоже, вы уже предположили правильно. Возможность анализировать строки запроса была исключена из V4, поскольку на протяжении многих лет поступали запросы на поддержку различных реализаций. При этом команда решила, что пользователям будет лучше решать, как будет выглядеть эта реализация. Мы рекомендуем импортировать строку запроса lib. упомянутый вами до сих пор отлично работал у меня.

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

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

Вы также можете использовать new URLSearchParams, если вам нужно что-то родное, и это работает для ваших нужд.

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

Подробнее о решении можно прочитать здесь

person Tyler McGinnis    schedule 17.03.2017
comment
где вы добавили это, чтобы оно было доступно при рендеринге каждого маршрута? - person claya; 13.04.2017
comment
URLSearchParams недоступен на iOS и SSR. строка запроса является более стабильным решением. - person emil; 06.11.2017
comment
Если вам нужна поддержка IE11, этот пакет в настоящее время имеет проблемы с ним. - person Dina; 20.09.2018
comment
Второе решение работает блестяще. Спасибо. - person bombek; 11.07.2021

Я предлагаю свою маленькую функцию формы ES6, классную, легкую и полезную:

getQueryStringParams = query => {
    return query
        ? (/^[?#]/.test(query) ? query.slice(1) : query)
            .split('&')
            .reduce((params, param) => {
                    let [key, value] = param.split('=');
                    params[key] = value ? decodeURIComponent(value.replace(/\+/g, ' ')) : '';
                    return params;
                }, {}
            )
        : {}
};

Все здесь, надеюсь помочь вам.

person AmerllicA    schedule 16.07.2018
comment
Недурно, потому что Internet Explorer ПО-ПРЕЖНЕМУ не поддерживает URLSearchParams. ВТФ Билл Гейтс. - person BigRon; 22.06.2021
comment
@BigRon, спасибо за ваш голос, я знаю, мы должны использовать что-то подобное из-за обратной совместимости и поддержки устаревших браузеров, но иногда у нас должен быть договор или соглашение о бойкоте этой дерьмовой надоедливой штуки. В моем текущем проекте я никогда не проверяю IE, даже Edge. это мировой проект новая социальная сеть - person AmerllicA; 22.06.2021

Вы можете получить следующую ошибку при создании оптимизированной рабочей сборки при использовании модуля query-string.

Не удалось минимизировать код из этого файла: ./node_modules/query-string/index.js:8.

Чтобы решить эту проблему, используйте альтернативный модуль под названием stringquery, который хорошо выполняет тот же процесс без каких-либо проблем, в то время как запуск сборки.

import querySearch from "stringquery";

var query = querySearch(this.props.location.search);

Спасибо.

person Balasubramani M    schedule 13.06.2018
comment
Чтобы обойти это, вы также можете использовать более старую версию query-string. Вы можете установить его, выполнив yarn add query-string@5 или npm install query-string@5 - person MoonDawg; 30.08.2018

Рад, что нашел этот пост. Спасибо за ссылки, через пару часов я наконец-то обновил свой код.

Для тех из вас, кто использует строку запроса, вам, возможно, придется сделать что-то вроде

var nameYouWant = queryString.parse(this.props.location.search).nameYouWant;

В моем случае это произошло, и this.props.location.search.theUrlYouWant отказывался работать. Второй вариант, упомянутый Тайлером, также работал у меня с некоторыми аналогичными настройками.

person DORRITO    schedule 02.04.2017

Использование стороннего пакета является излишним для простых решений

componentDidMount() {
        const query = new URLSearchParams(
            this.props.location.search
        );

        let data= {};

        for (let params of query.entries()) {
            data[params[0]] = +params[1];
        }
        this.setState({ urldata: data});
    }

это просто преобразует данные URL в объект.

person midnightgamer    schedule 30.04.2020

Я удивлен, что никто не упомянул UrlSearchParams и .get метод.

person Thomas    schedule 16.07.2020

вместо установки пакета вы можете использовать простую функцию для извлечения параметров запроса.

//Param Extractor
const parseParams = (params = "") => {
  const rawParams = params.replace("?", "").split("&");
  const extractedParams = {};
  rawParams.forEach((item) => {
    item = item.split("=");
    extractedParams[item[0]] = item[1];
  });
  return extractedParams;
};

//Usage
const params = parseParams(this.props?.location?.search); // returns an object like:
// {id:1,name:john...}

person samad324    schedule 15.06.2020