Отримання параметрів запиту з фрагмента хеша реакції-маршрутизатора


112

Я використовую реактор та реактор-маршрутизатор для свого застосування на стороні клієнта. Я не можу зрозуміти, як отримати такі параметри запиту з URL-адреси, як:

http://xmen.database/search#/?status=APPROVED&page=1&limit=20

Мої маршрути виглядають приблизно так (шлях я абсолютно невірний):

var routes = (
<Route>
    <DefaultRoute handler={SearchDisplay}/>
    <Route name="search" path="?status=:status&page=:page&limit=:limit" handler={SearchDisplay}/>
    <Route name="xmen" path="candidate/:accountId" handler={XmenDisplay}/>
</Route>
);

Мій маршрут працює нормально, але я просто не впевнений, як відформатувати шлях для отримання потрібних параметрів. Вдячні за будь-яку допомогу з цього приводу!


Я озирнувся і зміг знайти лише приклади вилучення параметрів рядка запиту в компонентах черезgetCurrentQuery
Cory Danielson


Можна використовувати willTransitionToгачки на вашому оброблювачі. Він отримує параметри рядка запиту. github.com/rackt/react-router/commit/…
Cory Danielson

Також тут для документів про гачки переходу: github.com/rackt/react-router/blob/master/docs/api/components/… Ви повинні відповісти на це запитання у своєму рішенні, як тільки ви зрозуміли його. Я впевнений, ви не будете останньою людиною, яка натрапила на цю ситуацію.
Cori Danielson

Відповіді:


133

Примітка: Скопіювати / вставити з коментаря. Обов’язково сподобається оригінальний пост!

Написання в es6 та використання реактора 0,14.6 / реактор-маршрутизатор 2.0.0-rc5. Я використовую цю команду для пошуку параметрів запитів у своїх компонентах:

this.props.location.query

Він створює хеш усіх доступних параметрів запитів у URL-адресі.

Оновлення:

Для React-Router v4 дивіться цю відповідь . В основному, використовуйте this.props.location.searchдля отримання рядка запиту та розбору з query-stringпакетом або URLSearchParams :

const params = new URLSearchParams(paramsString); 
const tags = params.get('tags');

2
Це вже не спосіб React-router 1.x, а потім 2.x ////
Пітер Арон Зентай

7
За Петра, цей приклад з дати: см stackoverflow.com/a/35005474/298073
btown

2
queryздається, пішов у React Router 4. github.com/ReactTraining/react-router/isissue/…
Sung Cho

57

СТАРИЙ (до v4):

Написання в es6 та використання реактора 0,14.6 / реактор-маршрутизатор 2.0.0-rc5. Я використовую цю команду для пошуку параметрів запитів у своїх компонентах:

this.props.location.query

Він створює хеш усіх доступних параметрів запитів у URL-адресі.

ОНОВЛЕННЯ (React Router v4 +):

this.props.location.query в React Router 4 видалено (зараз використовується v4.1.1). Більше про проблему тут: https://github.com/ReactTraining/react-router/isissue/4410

Схоже, вони хочуть, щоб ви використовували власний метод для розбору парам запитів, використовуючи цю бібліотеку, щоб заповнити проміжок: https://github.com/sindresorhus/query-string


2
Я перевірив React 0.14.8, і ваша відповідь не працює: надання: error TypeError: Cannot read property 'location' of undefined:: |
Томас Моденей

3
Привіт, @ThomasModeneis, це найвищий батьківський компонент, який надає ваш маршрутизатор? чи це дочірній компонент? Якщо я правильно пам’ятаю, ви повинні передати this.props.location.query у ваші дочірні компоненти з батьківського компонента, який роутер видавав, єдине, що я можу придумати з верхньої частини голови.
Marrs

55

Наведені вище відповіді не працюватимуть react-router v4. Ось що я зробив для вирішення проблеми -

Спочатку встановіть рядок запиту, який буде потрібен для розбору.

npm install -save query-string

Тепер у маршрутизованому компоненті ви можете отримати доступ до непроаналізованого рядка запиту на зразок цього

this.props.location.search

Ви можете перехрестити перевірку, увійшовши в консоль.

Нарешті проаналізуйте доступ до параметрів запиту

const queryString = require('query-string');
var parsed = queryString.parse(this.props.location.search);
console.log(parsed.param); // replace param with your own 

Тож якщо запит схожий ?hello=world

console.log(parsed.hello) увійде в журнал world


16
Або без lib: const query = new URLSearchParams(props.location.search); console.log(query.get('hello'));(потрібен поліфіл для старих браузерів).
Нін Фам

Це має спрацювати, коли я будую додаток, правда?
Вальтер

16

оновлення 2017.12.25

"react-router-dom": "^4.2.2"

URL як

BrowserHistory: http://localhost:3000/demo-7/detail/2?sort=name

HashHistory: http://localhost:3000/demo-7/#/detail/2?sort=name

із залежністю від запиту :

this.id = props.match.params.id;
this.searchObj = queryString.parse(props.location.search);
this.from = props.location.state.from;

console.log(this.id, this.searchObj, this.from);

результати:

2 {sort: "name"} home


"react-router": "^2.4.1"

URL як http://localhost:8080/react-router01/1?name=novaline&age=26

const queryParams = this.props.location.query;

queryParams - це об'єкт, що містить параметри запиту: {name: novaline, age: 26}


Якщо у вас є щось подібне: http://localhost:8090/#access_token=PGqsashgJdrZoU6hV8mWAzwlXkJZO8ImDcn&expires_in=7200&token_type=bearer(тобто не /після #), то для реагування маршрутизатора v4 вам слід використовувати location.hashзамістьlocation.search
codeVerine

10

З пакетом stringquery:

import qs from "stringquery";

const obj = qs("?status=APPROVED&page=1limit=20");  
// > { limit: "10", page:"1", status:"APPROVED" }

З пакетом рядків запитів:

import qs from "query-string";
const obj = qs.parse(this.props.location.search);
console.log(obj.param); // { limit: "10", page:"1", status:"APPROVED" } 

Немає пакету:

const convertToObject = (url) => {
  const arr = url.slice(1).split(/&|=/); // remove the "?", "&" and "="
  let params = {};

  for(let i = 0; i < arr.length; i += 2){
    const key = arr[i], value = arr[i + 1];
    params[key] = value ; // build the object = { limit: "10", page:"1", status:"APPROVED" }
  }
  return params;
};


const uri = this.props.location.search; // "?status=APPROVED&page=1&limit=20"

const obj = convertToObject(uri);

console.log(obj); // { limit: "10", page:"1", status:"APPROVED" }


// obj.status
// obj.page
// obj.limit

Сподіваюся, що це допомагає :)

Щасливого кодування!


5
"react-router-dom": "^5.0.0",

вам не потрібно додавати будь-який додатковий модуль просто у ваш компонент, у якого є така URL-адреса:

http: // localhost: 3000 / # /? повноваження "

ви можете спробувати наступний простий код:

    const search =this.props.location.search;
    const params = new URLSearchParams(search);
    const authority = params.get('authority'); //

4

Прочитавши інші відповіді (Спочатку @ duncan-finney, а потім @Marrs), я вирішив знайти журнал змін, який пояснює ідіоматичний 2.x спосіб вирішення цього питання. Документація по використанню розташування (що вам потрібно для запитів) в компонентах фактично суперечать фактичному коду. Тож якщо ви дотримуєтесь їхніх порад, ви отримуєте великі гнівні попередження, як це:

Warning: [react-router] `context.location` is deprecated, please use a route component's `props.location` instead.

Виявляється, ви не можете мати властивість контексту, що називається location, що використовує тип місцезнаходження. Але ви можете використовувати властивість контексту під назвою loc, що використовує тип місцезнаходження. Тож рішення - це невелика модифікація їх джерела:

const RouteComponent = React.createClass({
    childContextTypes: {
        loc: PropTypes.location
    },

    getChildContext() {
        return { location: this.props.location }
    }
});

const ChildComponent = React.createClass({
    contextTypes: {
        loc: PropTypes.location
    },
    render() {
        console.log(this.context.loc);
        return(<div>this.context.loc.query</div>);
    }
});

Ви також можете передавати вниз лише ті частини об'єкта, який ви хочете, щоб ваші діти отримували однакові переваги. Це не змінило попередження про зміну типу об’єкта. Сподіваюся, що це допомагає.


1

Просте рішення js:

queryStringParse = function(string) {
    let parsed = {}
    if(string != '') {
        string = string.substring(string.indexOf('?')+1)
        let p1 = string.split('&')
        p1.map(function(value) {
            let params = value.split('=')
            parsed[params[0]] = params[1]
        });
    }
    return parsed
}

І ви можете зателефонувати йому з будь-якого місця, використовуючи:

var params = this.queryStringParse(this.props.location.search);

Сподіваюся, це допомагає.


0

Ви можете отримати таку помилку під час створення оптимізованої збірки виробництва при використанні модуля запиту рядків .

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

Щоб подолати це, будь ласка, використовуйте альтернативний модуль під назвою stringquery, який добре виконує той самий процес без будь-яких проблем під час запуску збірки.

import querySearch from "stringquery";

var query = querySearch(this.props.location.search);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.