<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Chris Maas</title>
    <description>The latest articles on DEV Community by Chris Maas (@cm).</description>
    <link>https://dev.to/cm</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F227690%2F71f54d8c-636a-44e6-90fc-357efb38de03.jpeg</url>
      <title>DEV Community: Chris Maas</title>
      <link>https://dev.to/cm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cm"/>
    <language>en</language>
    <item>
      <title>Stencil: Routing with ion-router, ion-tabs, and how to pass params to tab pages (without using Angular)</title>
      <dc:creator>Chris Maas</dc:creator>
      <pubDate>Wed, 11 Sep 2019 12:42:35 +0000</pubDate>
      <link>https://dev.to/cm/stencil-routing-with-ion-router-ion-tabs-and-how-to-pass-params-to-tab-pages-without-using-angular-4lfl</link>
      <guid>https://dev.to/cm/stencil-routing-with-ion-router-ion-tabs-and-how-to-pass-params-to-tab-pages-without-using-angular-4lfl</guid>
      <description>&lt;p&gt;Setting up &lt;code&gt;&amp;lt;ion-router&amp;gt;&lt;/code&gt; in combination with &lt;code&gt;&amp;lt;ion-tabs&amp;gt;&lt;/code&gt; in a Stencil-only project (without Angular) can be quite tricky. This article covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to use &lt;code&gt;&amp;lt;ion-router&amp;gt;&lt;/code&gt; with &lt;code&gt;&amp;lt;ion-tabs&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;How to assign a &lt;code&gt;root&lt;/code&gt; route with &lt;code&gt;&amp;lt;ion-tabs&amp;gt;&lt;/code&gt;, especially if no tab has the URL &lt;code&gt;/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;How to pass parameters to tab pages without using Angular&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisite: Install ionic-pwa
&lt;/h2&gt;

&lt;p&gt;Start with the &lt;code&gt;ionic-pwa&lt;/code&gt; starter template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm init stencil
→ select ionic-pwa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to use &lt;code&gt;ion-router&lt;/code&gt; with &lt;code&gt;ion-tabs&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;First, here’s the full working example with all features. It works when switching between tabs, when calling a route through a button and when reloading the browser with a different URL. Later, I show you what doesn’t quite work.&lt;/p&gt;

&lt;p&gt;Modify &lt;code&gt;app-root.tsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ion-app&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ion-router&lt;/span&gt; &lt;span class="na"&gt;useHash=&lt;/span&gt;&lt;span class="s"&gt;{false}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ion-route-redirect&lt;/span&gt; &lt;span class="na"&gt;from=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt; &lt;span class="na"&gt;to=&lt;/span&gt;&lt;span class="s"&gt;"/home"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-tabs"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/home"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"tab-home"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-home"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/ion-route&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/profile"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"tab-profile"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/:name"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-profile"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/ion-route&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ion-route&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ion-router&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ion-nav&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ion-app&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add a new file &lt;code&gt;app-tabs.tsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@stencil/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-tabs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;AppTabs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;tabs&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;tab&lt;/span&gt; &lt;span class="na"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"tab-home"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;nav&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;tab&lt;/span&gt; &lt;span class="na"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"tab-profile"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;nav&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;tab&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;bar&lt;/span&gt; &lt;span class="na"&gt;slot&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bottom"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;tab&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"tab-home"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;icon&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"home"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;home&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;tab&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;tab&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"tab-profile"&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/profile/notangular"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;icon&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"person"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Profile&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;tab&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;tab&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ion&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;tabs&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This setup does the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When your app starts under &lt;code&gt;localhost:3333&lt;/code&gt;, it will redirect to &lt;code&gt;localhost:3333/home&lt;/code&gt; via a &lt;code&gt;&amp;lt;ion-route-redirect&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;name&lt;/code&gt; is passed as a URL parameter to &lt;code&gt;app-profile&lt;/code&gt; and received as a &lt;code&gt;Prop()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Tapping the tab also passes a parameter to &lt;code&gt;app-profile&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What doesn’t work
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;root&lt;/code&gt;-attribute in &lt;code&gt;ion-router&lt;/code&gt; instead of &lt;code&gt;ion-route-redirect&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ion-app&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ion-router&lt;/span&gt; &lt;span class="na"&gt;useHash=&lt;/span&gt;&lt;span class="s"&gt;{false}&lt;/span&gt; &lt;span class="na"&gt;root=&lt;/span&gt;&lt;span class="s"&gt;"/home"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-tabs"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/home"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"tab-home"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-home"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/ion-route&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/profile"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"tab-profile"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/:name"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-profile"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/ion-route&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ion-route&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ion-router&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ion-nav&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ion-app&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will result in the following error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ion-router] URL is not part of the routing set
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why? Probably because &lt;code&gt;&amp;lt;ion-router&amp;gt;&lt;/code&gt; has only one direct child route, which doesn’t have a &lt;code&gt;url&lt;/code&gt; attribute. When the router is set up, the root is unknown, because it is nested somewhere in the tabs route (note: this is my assumption, I didn’t check the code).&lt;/p&gt;

&lt;h3&gt;
  
  
  Catch-all child route never receives the query parameter
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ion-app&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ion-router&lt;/span&gt; &lt;span class="na"&gt;useHash=&lt;/span&gt;&lt;span class="s"&gt;{false}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ion-route-redirect&lt;/span&gt; &lt;span class="na"&gt;from=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt; &lt;span class="na"&gt;to=&lt;/span&gt;&lt;span class="s"&gt;"/home"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-tabs"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/home"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"tab-home"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-home"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/ion-route&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/profile/:name"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"tab-profile"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-profile"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/ion-route&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ion-route&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ion-router&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ion-nav&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ion-app&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case, &lt;code&gt;name&lt;/code&gt; is passed to the &lt;code&gt;tab-profile&lt;/code&gt; component, but not to &lt;code&gt;app-profile&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two child routes to make the parameter optional
&lt;/h3&gt;

&lt;p&gt;I experimented with this setup to make the query parameter optional when using &lt;code&gt;&amp;lt;ion-router&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ion-app&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ion-router&lt;/span&gt; &lt;span class="na"&gt;useHash=&lt;/span&gt;&lt;span class="s"&gt;{false}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ion-route-redirect&lt;/span&gt; &lt;span class="na"&gt;from=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt; &lt;span class="na"&gt;to=&lt;/span&gt;&lt;span class="s"&gt;"/home"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-tabs"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/home"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"tab-home"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-home"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/ion-route&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/profile"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"tab-profile"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-profile"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/:name"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-profile"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/ion-route&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ion-route&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ion-router&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ion-nav&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ion-app&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first, this seems to work. You can call &lt;code&gt;/profile&lt;/code&gt; and &lt;code&gt;/profile/ionic&lt;/code&gt; and both render just fine. However, when I attached a bunch of &lt;code&gt;console.log&lt;/code&gt; statements to &lt;code&gt;constructor()&lt;/code&gt;, &lt;code&gt;componentDidLoad()&lt;/code&gt; and &lt;code&gt;componentDidUnload()&lt;/code&gt;, it showed that the &lt;code&gt;app-profile&lt;/code&gt; page gets created twice. It’s also unloaded at some point, although there is no noticeable visual difference. The behavior could generally be described as flaky.&lt;/p&gt;

&lt;p&gt;I didn’t figure out how to make the query parameter truly optional, but you could simply pass some generic value by setting the &lt;code&gt;href&lt;/code&gt; attribute of &lt;code&gt;ion-tab-button&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ion-tab-button&lt;/span&gt; &lt;span class="na"&gt;tab=&lt;/span&gt;&lt;span class="s"&gt;"tab-profile"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/profile/not-a-person"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, in &lt;code&gt;app-profile&lt;/code&gt;, parse the Prop &lt;code&gt;name&lt;/code&gt; and if it is equal to &lt;code&gt;not-a-person&lt;/code&gt; do something else.&lt;/p&gt;

&lt;h3&gt;
  
  
  Putting the &lt;code&gt;url&lt;/code&gt; in the child route
&lt;/h3&gt;

&lt;p&gt;If you move the &lt;code&gt;url&lt;/code&gt; attribute to the child route like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ion-app&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ion-router&lt;/span&gt; &lt;span class="na"&gt;useHash=&lt;/span&gt;&lt;span class="s"&gt;{false}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-tabs"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"tab-home"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-home"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/ion-route&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"tab-profile"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/profile/:name"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-profile"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/ion-route&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ion-route&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ion-router&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ion-nav&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ion-app&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can expect flaky behavior again. This setup works in some cases. If you click on the profile tab, it won’t show, but if you open the &lt;code&gt;app-profile&lt;/code&gt; page through pressing the button on &lt;code&gt;app-home&lt;/code&gt;, it seems to work and passes the prop. Then, if you hit the tab again, it shows the page, although the browser URL isn’t changed and from a component lifecycle view, the page actually should have unloaded. So, this doesn’t really work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Good to know: Observations about &lt;code&gt;ion-router&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Different parameter = different component
&lt;/h3&gt;

&lt;p&gt;Consider this route:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/profile/:name"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-profile"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you open &lt;code&gt;/profile/user1&lt;/code&gt; through a button and then &lt;code&gt;/profile/user2&lt;/code&gt; through another button (assuming you use tabs or a side menu to navigate away from the screen you just opened), Stencil will create a new &lt;code&gt;app-profile&lt;/code&gt; component (and destroy the old one). It does &lt;strong&gt;not&lt;/strong&gt; update the &lt;code&gt;Prop() name&lt;/code&gt; of &lt;code&gt;app-profile&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hashes with route params won’t work
&lt;/h3&gt;

&lt;p&gt;The same is true in this case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/profile/user1#a
/profile/user1#b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The parameter &lt;code&gt;name&lt;/code&gt; has the value &lt;code&gt;user1#a&lt;/code&gt; or &lt;code&gt;user1#b&lt;/code&gt;. It’s not &lt;em&gt;the same&lt;/em&gt;, as you might expect from traditional server-side routing in web apps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tabs with same name (and no parameter) get reused
&lt;/h3&gt;

&lt;p&gt;If you have a tab &lt;code&gt;app-profile&lt;/code&gt; with the route &lt;code&gt;/profile&lt;/code&gt;, it doesn’t matter if you open &lt;code&gt;/profile&lt;/code&gt; from a button or a tab. The very same component will be shown and &lt;strong&gt;not&lt;/strong&gt; re-created. Thus, it maintains its state, even when you move away from that page through a different tab.&lt;/p&gt;

&lt;h3&gt;
  
  
  Routes with &lt;code&gt;componentProps&lt;/code&gt; create new components
&lt;/h3&gt;

&lt;p&gt;Consider this route, which passes props via &lt;code&gt;componentProps&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ion-route&lt;/span&gt; &lt;span class="na"&gt;url=&lt;/span&gt;&lt;span class="s"&gt;"/profile"&lt;/span&gt; &lt;span class="na"&gt;component=&lt;/span&gt;&lt;span class="s"&gt;"app-profile"&lt;/span&gt; &lt;span class="na"&gt;componentProps=&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;name:&lt;/span&gt; &lt;span class="na"&gt;this.name&lt;/span&gt; &lt;span class="err"&gt;}}&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;this.name&lt;/code&gt; changes, &lt;strong&gt;the &lt;code&gt;app-profile&lt;/code&gt; component&lt;/strong&gt; will be destroyed and a new component created with the new name. It does &lt;strong&gt;not&lt;/strong&gt; update the props of the existing &lt;code&gt;app-profile&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is there a way to have a &lt;em&gt;global&lt;/em&gt; &lt;code&gt;app-profile&lt;/code&gt; component that gets reused when parameters or props change?
&lt;/h2&gt;

&lt;p&gt;Why would anyone need this? You need this when rendering a page is expensive. Let’s say you have a mapping library. Rendering the map of a city takes a few seconds. You want to keep the &lt;code&gt;page-citymap&lt;/code&gt; the same for performance reasons, but you also want to reflect the currently selected city in the URL like so: &lt;code&gt;/map/berlin&lt;/code&gt; or &lt;code&gt;/map/nyc&lt;/code&gt;. As far as I can see, this doesn’t work with the current &lt;code&gt;ion-router&lt;/code&gt;. If you navigate to a different URL, &lt;code&gt;page-citymap&lt;/code&gt; would be recreated and the expensive map-rendering would start again for the new component.&lt;/p&gt;

&lt;p&gt;Correct me if I’m wrong and if you have found a solution for this.&lt;/p&gt;

&lt;p&gt;One more note: Have a look at the &lt;a href="https://github.com/ionic-team/ionic-stencil-conference-app"&gt;Ionic Stencil Conference App&lt;/a&gt;, which shows how to use route parameters in a master-detail scenario.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>ionic</category>
      <category>stencil</category>
    </item>
  </channel>
</rss>
