#javascript #reactjs #react-router-dom
#javascript #reactjs #react-router-dom
Вопрос:
Я столкнулся с проблемой использования параметров запроса и react router dom.
Когда я выполняю вызов API и он возвращает мне статус 200, я перенаправляю пользователя на страницу результатов с помощью history.push. Пока все работает нормально. Однако, когда я нахожусь на странице результатов и обновляю страницу, я хочу использовать URL с параметрами запроса для выполнения нового поиска, к сожалению, React Router Dom не может распознать URL и перенаправляет меня.
App.tsx
<PrivateRoute path="/search?value=:searchValueamp;type=:searchType">
<Dashboard />
</PrivateRoute>
<Route path="/redirection" component={RedirectionPage} />
<Redirect to="/login" />
Search.tsx
history.push({
pathname: `/search?${formattedSearch
.map((search) => `value=${search.value}amp;type=${search.type}`)
.toString()
.replace(",", "|")}`,
state: search
});
Этот history.push отлично работает и перенаправляет пользователя на нужную страницу.
Но когда я обновляю страницу с тем же URL, React Router Dom не распознает маршрут и не перенаправляет меня на компонент.
У вас есть какие-нибудь идеи? Спасибо и желаю вам хорошего дня.
Ответ №1:
Параметры сопоставления маршрутов — это не то же самое, что параметры строки запроса URL.
Вы захотите получить доступ к строке запроса из объекта location .
{ key: 'ac3df4', // not with HashHistory! pathname: '/somewhere', search: '?some=search-string', <-- query string hash: '#howdy', state: { [userDefined]: true } }
Демонстрация параметров запроса React-router-dom
Они создают пользовательский useQuery
хук:
const useQuery = () => new URLSearchParams(useLocation().search);
Для вашего варианта использования на странице, отображающей Dashboard
, которую вы хотите затем извлечь, параметры строки запроса. Учитывая path='/search?value=:searchValueamp;type=:searchType'
:
const query = useQuery();
const email = query.get('value');
const token = query.get('type');
Компонент на основе классов?
Если Dashboard
это компонент на основе класса, то вам нужно будет получить доступ props.location
и обработать строку запроса самостоятельно в методе жизненного цикла. Это связано с тем, что перехватчики React корректно используются только функциональными компонентами.
componentDidMount() {
const { location } = this.props;
const query = new URLSearchParams(location.search);
const email = query.get('value');
const token = query.get('type');
...
}
Примечание относительно пути
path='/search?value=:searchValueamp;type=:searchType'
Параметры пути относятся только к части пути URL-адреса, вы не можете определить параметры для части URL-адреса queryString. Приведенный выше путь эквивалентен path='/search'
from react-router-dom
‘s perspective .
<PrivateRoute path="/search">
<Dashboard />
</PrivateRoute>