Как получить параметры запроса и параметры URL в React

Прежде чем перейти к примерам, сначала разберемся, в чем разница между параметрами запроса и параметрами URL:

Рассмотрим URL: https://example.com/search?term=pizza.

Здесь term — это параметр запроса (или параметр поиска), который имеет значение pizza. Параметры URL отображаются в виде пар ключ-значение.

Что же такое параметры URL? Параметры URL — это те, которые появляются перед ? в URL.

https://example.com/orders/10001

В приведенном выше URL 10001 является параметром URL. В параметрах URL нет явного упоминания ключа, к которому относится значение. Код должен сам решить, что представляет собой 10001, основываясь на позиции или формате URL. Конечно, когда мы читаем URL как человек, мы поймем, что они представляют orderId.

Чтение параметров запроса

Мы можем получить часть запроса URL с помощью location.search.
То есть, если я нахожусь на странице https://example.com/search?term=pizza&location=Bangalore, то вызов location.search вернет ?term=pizza&location=Bangalore.

Но как извлечь из этого пары ключ-значение? Именно тогда на помощь приходит URLSearchParams.

Использование URLSearchParams

URLSearchParams помогает в разборе и доступе к параметрам запроса.
Мы можем использовать следующий код для получения значения term:

const queryParams = new URLSearchParams("?term=pizza&location=Bangalore")
const term = queryParams.get("term")
console.log(term) //pizza
Войти в полноэкранный режим Выйти из полноэкранного режима

Мы можем перебирать параметры запроса, как показано в приведенном ниже коде:

const queryParams = new URLSearchParams("?term=pizza&location=Bangalore")
for (const [key, value] of queryParams) {
  console.log({ key, value }) // {key: 'term', value: 'pizza'} {key: 'location', value: 'Bangalore'}
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Мы можем использовать это в компоненте react, как показано ниже:

function App() {
  const queryParams = new URLSearchParams(window.location.search)
  const term = queryParams.get("term")
  const location = queryParams.get("location")

  return (
    <div className="App">
      <p>Value of term: {term}</p>
      <p>Value of location: {location}</p>
    </div>
  )
}

export default App
Войти в полноэкранный режим Выход из полноэкранного режима

Теперь, если вы откроете http://localhost:3000/?term=pizza&location=Bangalore, вы увидите отображение термина и местоположения:

Использование пакета query-params

Мы можем использовать библиотеку query-string для достижения той же цели. Сначала установите query-string с помощью следующей команды (или npm i query-string):

yarn add query-string
Войдите в полноэкранный режим Выйти из полноэкранного режима

Мы можем использовать его в React, как показано ниже:

import queryString from "query-string"

function App() {
  const queryParams = queryString.parse(window.location.search)

  return (
    <div className="App">
      <p>Value of term: {queryParams.term}</p>
      <p>
        All query params <pre>{JSON.stringify(queryParams, null, 2)}</pre>
      </p>
    </div>
  )
}

export default App
Войти в полноэкранный режим Выход из полноэкранного режима

Теперь, если вы запустите приложение, вы увидите, что параметры запроса напечатаны.

Преимущество использования query-string в том, что он возвращает объект JavaScript и имеет дополнительные возможности.

Использование React Router

Если вы используете React Router для маршрутизации в вашем приложении, то вы можете использовать хук useSearchParams.

Сначала установите React Router в свой проект с помощью следующей команды:

yarn add history@5 react-router-dom@6
Войдите в полноэкранный режим Выйти из полноэкранного режима

В index.js импортируйте компонент BrowserRouter и оберните его вокруг компонента App:

import React from "react"
import ReactDOM from "react-dom"
import "./index.css"
import App from "./App"
import { BrowserRouter } from "react-router-dom"

ReactDOM.render(
  <React.StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </React.StrictMode>,
  document.getElementById("root")
)
Вход в полноэкранный режим Выход из полноэкранного режима

Создайте компонент Search со следующим кодом:

import React from "react"
import { useSearchParams } from "react-router-dom"

const Search = () => {
  let [searchParams, setSearchParams] = useSearchParams()
  const term = searchParams.get("term")
  const location = searchParams.get("location")

  return (
    <div className="App">
      <p>Value of term: {term}</p>
      <p>Value of location: {location}</p>
    </div>
  )
}

export default Search
Войти в полноэкранный режим Выйти из полноэкранного режима

Здесь мы используем useSearchParams для получения параметров запроса. Способ доступа к параметрам поиска такой же, как и у URLSearchParams, потому что useSearchParams внутренне использует URLSearchParams.

Наконец, в App.js создайте маршрут для компонента Search.

import { Routes, Route } from "react-router-dom"
import Search from "./Search"

function App() {
  return (
    <div className="App">
      <Routes>
        <Route path="search" element={<Search />} />
      </Routes>
    </div>
  )
}

export default App
Вход в полноэкранный режим Выйдите из полноэкранного режима

Теперь, если вы откроете http://localhost:3000/search?term=pizza&location=Bangalore, вы увидите выведенные параметры поиска:

Вы можете узнать больше о react router в моей предыдущей статье

Чтение параметров URL

Поскольку в параметре URL не указаны явные ключи, нам придется использовать библиотеки типа react router для доступа к ним. Мы можем использовать хук useParams для доступа к параметрам URL.

Создайте компонент Order в вашем проекте, который использует react router.

import { useParams } from "react-router-dom"

export default function Order() {
  let params = useParams()
  return <h2>Order: {params.orderId}</h2>
}
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Теперь обновите определение маршрута с помощью маршрута order/:orderId:

import { Routes, Route } from "react-router-dom"
import Order from "./Order"

function App() {
  return (
    <div className="App">
      <Routes>
        <Route path="order/:orderId" element={<Order />} />
      </Routes>
    </div>
  )
}

export default App
Войти в полноэкранный режим Выйти из полноэкранного режима

Обратите внимание, что :orderId в определении маршрута и orderId в params.orderId должны совпадать.

Теперь, если вы откроете http://localhost:3000/order/10001, вы увидите, что отображается идентификатор заказа:

Если вы хотите изучить программную маршрутизацию, вы можете прочитать об этом подробнее здесь.

Оцените статью
devanswers.ru
Добавить комментарий