Передача данных через URL

Navigo — это легковесная библиотека для маршрутизации в JavaScript, которая позволяет управлять URL-путями и динамически подгружать содержимое на странице без перезагрузки. Одним из ключевых аспектов работы с Navigo является возможность передачи данных через URL. Эти данные могут передаваться как параметры пути, параметры запроса (query parameters) или через хеш-фрагменты.


Параметры пути

Параметры пути позволяют встроить динамические значения прямо в URL. В Navigo они обозначаются с помощью двоеточия :. Например, URL /user/:id может принимать любой идентификатор пользователя.

const router = new Navigo('/');

router.on('/user/:id', ({ data }) => {
    console.log('ID пользователя:', data.id);
});

router.navigate('/user/42'); // Выведет: ID пользователя: 42

Ключевые моменты:

  • Все параметры пути передаются через объект data.
  • Можно задавать несколько параметров: /product/:category/:id.
  • Если параметр не указан при навигации, он будет undefined.

Query-параметры (строка запроса)

Query-параметры — это часть URL после символа ?. Они позволяют передавать дополнительные данные без изменения структуры маршрута.

router.on('/search', ({ query }) => {
    console.log('Поиск:', query.q);
});

router.navigate('/search?q=javascript'); // Выведет: Поиск: javascript

Особенности работы с query-параметрами:

  • В Navigo объект query автоматически содержит все пары ключ=значение.
  • Можно передавать несколько параметров одновременно: /search?q=js&sort=asc.
  • Если параметр отсутствует, его значение будет undefined.

Динамические маршруты с параметрами пути и query одновременно

Navigo позволяет комбинировать параметры пути и query. Например, маршрут /user/:id/details может принимать как id в пути, так и дополнительные параметры через ?.

router.on('/user/:id/details', ({ data, query }) => {
    console.log('ID:', data.id);
    console.log('Фильтр:', query.filter);
});

router.navigate('/user/123/details?filter=active');
// ID: 123
// Фильтр: active

Это дает гибкость при построении сложных интерфейсов, где часть данных является обязательной (параметры пути), а часть — опциональной (query-параметры).


Использование хеша (#) для передачи состояния

Navigo поддерживает маршруты с хешем, что удобно для одностраничных приложений (SPA) с внутренними состояниями или вкладками.

router.on('/page', ({ hash }) => {
    console.log('Хеш:', hash);
});

router.navigate('/page#section2'); // Выведет: Хеш: section2

Особенности:

  • Хеш доступен через объект hash в обработчике маршрута.
  • Позволяет быстро ориентироваться на определенные подчасти страницы без изменения основных маршрутов.
  • Используется для реализации вкладок, быстрых переходов и якорей.

Опциональные параметры

Navigo поддерживает опциональные параметры пути с помощью скобок (). Это позволяет задавать маршруты, которые могут работать с разным количеством параметров.

router.on('/blog/:category(/:postId)', ({ data }) => {
    console.log('Категория:', data.category);
    console.log('ID поста:', data.postId);
});

router.navigate('/blog/tech');         // Категория: tech, ID поста: undefined
router.navigate('/blog/tech/101');     // Категория: tech, ID поста: 101

Преимущества:

  • Обеспечивает универсальность маршрута.
  • Упрощает обработку маршрутов с различными вариантами URL.
  • Сохраняет читаемость и структуру кода.

Ограничения и особенности передачи данных через URL

  1. Тип данных: все данные, передаваемые через URL, являются строками. Для передачи сложных объектов требуется сериализация (JSON.stringify) и последующая десериализация (JSON.parse).
  2. Безопасность: передача чувствительных данных через URL небезопасна, так как URL может сохраняться в истории браузера и логироваться.
  3. Согласованность: рекомендуется использовать параметры пути для обязательных данных и query-параметры для опциональных фильтров, сортировок и состояний интерфейса.
  4. Экранирование: специальные символы в query-параметрах должны быть корректно закодированы (encodeURIComponent).

Пример комплексного маршрута с передачей данных

router.on('/dashboard/:userId/settings(/:tab)', ({ data, query, hash }) => {
    console.log('Пользователь:', data.userId);
    console.log('Вкладка:', data.tab);
    console.log('Фильтр:', query.filter);
    console.log('Хеш:', hash);
});

router.navigate('/dashboard/42/settings/profile?filter=active#section1');
// Пользователь: 42
// Вкладка: profile
// Фильтр: active
// Хеш: section1

Этот пример демонстрирует полное использование возможностей Navigo для передачи данных через URL, включая параметры пути, опциональные параметры, query-параметры и хеш. Такой подход позволяет создавать гибкие и удобные маршруты для современных одностраничных приложений.