React Router: запрос Param Match?

Согласно принятому ответу на этот вопрос, React Router 4 больше не соответствует параметрам запроса. Если я перейду с URL-адреса, совпадающего с одним из моих <Route>, на тот же URL-адрес с другой строкой запроса, содержимое, похоже, не изменится. Я считаю, что это связано с тем, что переход между URL-адресами, соответствующими одному и тому же <Route>, не меняет содержимое, но, пожалуйста, поправьте меня, если я ошибаюсь. Учитывая это, как мне использовать React Router для набора URL-адресов, которые должны отличаться только параметром запроса?

Например, многие поисковые системы и другие сайты, использующие панели поиска, включая сайт, над которым я работаю, используют параметр запроса, обычно q или query. Пользователь может искать что-то одно, затем решить, что это не то, что ему нужно, и искать другое. Пользователь может ввести второй URL-адрес или снова выполнить поиск в строке поиска. На самом деле в пути URL-адреса нет места для поискового запроса, поэтому он должен быть в строке запроса. Как нам справиться с этой ситуацией?

Есть ли способ с помощью React Router связать URL-адрес, который отличается только строкой запроса, и изменить содержимое, не обновляя всю страницу? Желательно, чтобы для этого не требовалась какая-либо внешняя библиотека, кроме React и React Router.

Можете ли вы предоставить код, чтобы мне было легче увидеть, что вы пытаетесь сделать

Omar 09.04.2018 03:06

Извините, я делал это на своем телефоне ночью, когда возвращался домой из отпуска. (Я не был за рулем.) Мои компоненты также немного сложнее, чем учебники по реакции, но я постараюсь получить демо.

trysis 10.04.2018 01:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
7
2
7 603
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуйте использовать Функция render опора вместо component в Route. Что-то вроде этого:

<Route render = {props => {
  // look for some param in the query string...
  const useComponentA = queryStringContains('A');
  if (useComponentA) {
    return <ComponentA {...props}/>;
  } else {
    return <ComponentB {...props}/>;
  }
}}/>

Я делаю это с некоторыми другими компонентами. Я не думал об этом в этой ситуации. Даже если бы я это сделал, я бы не подумал, что это сработает, но это работает!

trysis 10.04.2018 02:15

@AmerllicA Я вас не совсем понимаю, вы спрашиваете, действительно ли мой ответ работает? Я сам этим не пользовался, вы можете спросить ОП, как это происходит в его проекте.

PanJunjie潘俊杰 17.07.2018 05:17

что это за метод queryStringContains? из какого файла вы его импортируете? реагировать-роутер?

theprogrammer 04.03.2021 18:09

@theprogrammer Это какой-то псевдокод, означает, что вы должны расширить его до нескольких строк, которые выполняют то, что описывает это имя функции. Чтобы быть более прямым, замените queryStringContains('A') чем-то вроде window.location.search.includes('A').

PanJunjie潘俊杰 05.03.2021 07:05

Это можно сделать двумя способами:

1) Используйте location.search в компоненте реакции, чтобы получить строку запроса, затем передайте ее дочернему компоненту, чтобы предотвратить повторную визуализацию всего компонента. React-router имеет об этом официальный пример.

2) Определите путь регулярного выражения маршрутизатора, чтобы перехватить строку запроса, а затем передать ее компоненту реакции. Возьмем, к примеру, разбиение на страницы:

routes.js, для конфигурации маршрутизатора вы можете обратиться к это

const routerConfig = [
  {
    path: '/foo',
    component: 'Foo',
  },
  {
    path: '/student/listing:pageNumber(\\?page=.*)?',
    component: 'Student'
  },

Student.js

  render() {
    // get the page number from react router's match params
    let currentPageNumber = 1;
    // Defensive checking, if the query param is missing, use default number.
    if (this.props.match.params.pageNumber) {
      // the match param will return the whole query string, 
      // so we can get the number from the string before using it.
      currentPageNumber = this.props.match.params.pageNumber.split('?page=').pop();
    }
    return <div> 
             student listing content ...
             <Pagination pageNumber = {currentPageNumber}> 
           </div>
  }

Pagination.js

render() {
    return <div> current page number is {this.props.pageNumber} </div>
  }

Второе решение длиннее, но более гибкое. Один из вариантов использования - рендеринг на стороне сервера:

Помимо компонентов реакции, остальная часть приложения (например, предварительно загруженная сага) должна знать URL-адрес, включая строку запроса, для вызова API.

Другие вопросы по теме