Декларативная маршрутизация в Polymer основана на
принципах веб-компонентов и позволяет управлять состоянием приложения
через URL без необходимости вручную отслеживать изменения состояния.
Основным инструментом для реализации маршрутизации является элемент
<app-location> и связанный с ним
<app-route> из набора компонентов
App Toolbox.
<app-location> Этот компонент
связывает состояние URL с объектом route. Он наблюдает
изменения в адресной строке и обновляет соответствующие свойства в
компоненте.
Пример использования:
<app-location route="{{route}}"></app-location>
Здесь route — это объект, который содержит ключевые
поля:
path — текущий путь URL.__queryParams — объект с параметрами запроса.__queryParamsChanged — флаг, сигнализирующий об
изменении параметров запроса.<app-route> Этот компонент
позволяет разделять путь на сегменты и связывать их с состоянием
конкретного компонента. Он используется для декомпозиции URL и передачи
параметров дочерним компонентам.
Пример:
<app-route
route="{{route}}"
pattern="/user/:id"
data="{{routeData}}"
tail="{{subroute}}">
</app-route>
Ключевые свойства:
pattern — шаблон пути, поддерживающий динамические
сегменты (например, :id).data — объект, содержащий значения динамических
сегментов.tail — оставшаяся часть пути для вложенной
маршрутизации.Polymer использует двухстороннюю привязку данных, что позволяет
компонентам автоматически реагировать на изменения маршрута. Например,
для отображения страницы пользователя по id достаточно
наблюдать за routeData.id:
static get properties() {
return {
routeData: Object
};
}
static get observers() {
return [
'_routeChanged(routeData.id)'
];
}
_routeChanged(id) {
if (id) {
this._loadUser(id);
}
}
_loadUser(id) {
fetch(`/api/users/${id}`)
.then(res => res.json())
.then(data => this.user = data);
}
Для сложных приложений часто требуется вложенная маршрутизация. В
этом случае дочерний <app-route> получает свой
route через свойство tail родительского
маршрута:
<app-route
route="{{subroute}}"
pattern="/settings/:section"
data="{{settingsData}}">
</app-route>
Таким образом, родительский компонент обрабатывает основной путь
(/user/123), а дочерний может управлять подстраницами
(/user/123/settings/profile).
Перемещение между маршрутами можно выполнять декларативно с помощью
свойства route.path:
this.set('route.path', '/user/456');
Это автоматически обновит URL и инициирует реакцию всех связанных
<app-route> компонентов.
<app-location> позволяет работать с
query-параметрами через объект route.__queryParams:
this.set('route.__queryParams.filter', 'active');
console.log(this.route.__queryParams.filter); // active
Изменение параметра запроса также вызывает обновление связанных компонентов, что позволяет реализовать фильтрацию и поиск без перезагрузки страницы.
В контексте одностраничного приложения Polymer маршрутизация позволяет:
data для хранения значений. Это упрощает реактивное
обновление компонентов.tail родительского маршрута с дочерним.{{}}
позволяет автоматизировать синхронизацию состояния URL и компонента без
дополнительных обработчиков событий.Декларативная маршрутизация в Polymer предоставляет мощный и лаконичный механизм управления навигацией, полностью интегрированный с реактивной моделью данных и системой веб-компонентов.