Задать вопрос
Demonov
@Demonov
Frontend developer

Как сделать Hook, для работы с query parameters?

Я хочу задавать query параметры из компонента в строке URL, так как логика получается большой мне хочется вынести её в отдельный хук.
Я сделал это:
import { isBrowser } from '../lib/is-browser';

export const useQueryParams = (desiredParams: string[]) => {
  const params = isBrowser() ? window.location.search : null;

  const queryParams = params ? parseQueryParams(params, desiredParams) : null;

  const changeQueryParams = (queryParams: Record<string, string>): void => {
    const params = new URLSearchParams(Object.entries(queryParams).filter(([, value]) => !!value));
    updateURL(params.toString());
  };

  return [queryParams, changeQueryParams] as const;
};

const updateURL = (param: string): void => {
  if (history.pushState) {
    const baseUrl =
      window.location.protocol + '//' + window.location.host + window.location.pathname;
    const newUrl = baseUrl + (param ? `?${param}` : '');
    history.pushState(null, '', newUrl);
  } else {
    console.warn('History API не поддерживается');
  }
};

export const parseQueryParams = (params: string, desiredParams: string[],): Record<string, string> => {
  const searchParams = new URLSearchParams(params);

  return desiredParams.reduce((acc: Record<string, string>, key) => {
    if (searchParams.has(key)) acc[key] = searchParams.get(key) as string;
    return acc;
  }, {});
};

Хуку useQueryParams при вызове передаётся массив строк, это ключи параметры которые нужны для компонента.
useQueryParams возвращает объект ключ - значение, и функцию которая будет изменять параметры.

Проблемы:
1. Как можно убрать все сайд эффекты в useEffect?
2. Как использовать хук не в одном компоненте? т.е. что-бы два компонента используя useQueryParams, не перезаписывали параметры друг друга.
3. Как вообще правильно задавать параметры в URL?
  • Вопрос задан
  • 346 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Merion Academy
    Frontend-разработка на React
    4 месяца
    Далее
  • ProductStar
    React: отточите навыки интерфейсной разработки
    6 недель
    Далее
Пригласить эксперта
Ответы на вопрос 1
Robur
@Robur
Знаю больше чем это необходимо
1. не понятен вопрос, какие эффекты, при вем тут useEffect? не хватает кода как вы это все используете и что за проблемы.
2. updateUrl должна сохранять все параметры которые уже были в урл, и добавлять/обновлять новые. У вас все удаляется и ставятся только переданные.
3. Золотой стандарт - использовать роутинг. Если не хотите или не подходит - то любой велосипед, ваш тоже подойдет.

4. Вы точно хотите именно url? может вам localStorage больше подойдет?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽
ITK academy Казань
от 50 000 до 90 000 ₽