Парсинг URL параметров
Чтение и запись query string (
?page=2&sort=asc) через нативныйURLSearchParams— без ручного split и decode.
Задача
Нужно прочитать параметры из URL (например, текущую страницу или фильтры), а также обновить URL при навигации без перезагрузки страницы.
Решение
Чтение параметров:
// URL: https://example.com/products?page=3&sort=price&order=asc&tag=js
const params = new URLSearchParams(window.location.search);
const page = params.get('page'); // '3' (всегда строка или null)
const sort = params.get('sort'); // 'price'
const order = params.get('order'); // 'asc'
const tag = params.get('tag'); // 'js'
const missing = params.get('foo'); // null
// Преобразование в число
const pageNum = Number(params.get('page')) || 1;
// Проверка наличия
params.has('sort'); // true
// Несколько значений одного ключа: ?tag=js&tag=css
const tags = params.getAll('tag'); // ['js', 'css']
// Итерация
for (const [key, value] of params) {
console.log(key, value);
}
Изменение URL без перезагрузки:
function updateParams(updates) {
const params = new URLSearchParams(window.location.search);
Object.entries(updates).forEach(([key, value]) => {
if (value === null || value === undefined || value === '') {
params.delete(key);
} else {
params.set(key, value);
}
});
const newUrl = `${window.location.pathname}?${params.toString()}`;
window.history.pushState({}, '', newUrl); // добавить в историю
// или window.history.replaceState({}, '', newUrl); // заменить текущую
}
// Перейти на страницу 2 с сортировкой
updateParams({ page: 2, sort: 'price' });
// Убрать параметр
updateParams({ tag: null });
Утилита для типизированного чтения:
function getParam<T extends string = string>(
key: string,
defaultValue?: T
): T | null {
const value = new URLSearchParams(window.location.search).get(key);
return (value as T | null) ?? defaultValue ?? null;
}
const page = getParam('page', '1'); // всегда строка
Ключевые моменты
URLSearchParamsавтоматически декодирует%20→ пробел и%2B→+; не нужен ручнойdecodeURIComponent.params.getвсегда возвращает строку илиnull; числа конвертируй явно черезNumberилиparseInt.pushStateдобавляет запись в историю (работает «назад»);replaceState— заменяет текущую.params.toString()возвращает готовую query string без?— добавляй?вручную при формировании URL.