This guide build from a previous one, Standard open-wc project to a routing-aware app in 6 steps. To start this guide, make sure that you have a working version of the routing-app from the previous guide.
The aim is to create a page with a parameter. This is a very common pattern in applications.
To do this, the component page-one will be modified.
Changes to page-one
First of all, the URL page-one responds to must change to /page-one/:id:
static get pagePath () { return '/page-one/:id' }The id should be added as a property for the page:
static get properties() {
return {
title: { type: String },
counter: { type: Number },
id: { type: Number } // NEW property added
};
}Finally, a routerCallback() is also defined. This function will change the id property defined above with the routing’s id parameter.
routerCallback (params) {
this.id = params.id
}Finally, it’s useful to add some visual feedback to the page so that you can see that the id property is set. This is easily done by adding this code to render():
<span>URL parameter: ${this.id}</span>That’s it: the page-one page now needs a parameter, and it’s able to use it.
Changes to routing-app
In order to test page-one out, a few changes to the main app are necessary.
First of all, change the link to page-one into:
<li>
<a href="/page-one/30" ?selected="${this.page === 'page-one'}">
Page One
</a>
</li>Also, change the contents of the page-about element so that it has two links:
<page-about class="page" page-path="/page-about">
Link to id 40: <a href="page-one/40">page-one/40</a>
Link to page-one without id: <a href="page-one">page-one</a>
${templateAbout}
</page-about>Since routing-app now has more than simple 1-level routing, pagePath should also be changed to:
static get pagePath () { return ['/:page', '/:page/*'] }This will make sure that /page-one/40 and /page-one/30 (or any ID for that matter) will match; this will enable routerCallback() to be triggered, and this.id to be changed. Remember that this is just for the highlighting of the active link: the actual routing happens within each page.
Conclusion
Each page is always responsible of its own routing. This delegates routing complexity to each element. Adding a parameter to a route is very simple.
In a real-life example, when an element updates (via the update() callback), you would check whether the ID of the record displayed is the same as the element’s id property. If different, a database load might be triggered.