ionic-team/ionic-framework

bug: SelectedTab on ion-tab-bar does not activate selected tab as default

Tommertom opened this issue · 3 comments

Bug Report

Ionic version:
[x] 4.x

Current behavior:
Preferred tab as per property selectedTab when opening tabs is not selected

Expected behavior:
Preferred tab as per property selectedTab when opening tabs is selected (as per documentation).

Steps to reproduce:
Take sample code as per https://github.com/ionic-team/ionic-docs/tree/master/src/demos/api/tabs/index.html and put in a separate file with extension html.

Replace code <ion-tab-bar slot="bottom"> with <ion-tab-bar slot="bottom" selectedTab="movies">

Open file in Chrome. Tab movies is not selected.

Related code:
See above

Other information:
Plain javascript file, no framework used. Same issue seems to appear when trying to set selected="true" on ion-tab-button.

Related issue reported https://stackoverflow.com/questions/53860450/ionic-4-preselect-a-tab-in-a-modal. Using selected-tab as property does not work. Using JS is not desired (through controller).

Ionic info:

[WARN] You are not in an Ionic project directory. Project context may be missing.

Ionic:

   Ionic CLI : 5.4.5

Utility:

   cordova-res : not installed
   native-run  : not installed

System:

   NodeJS : v12.13.0
   npm    : 6.12.0
   OS     : Windows 10

Looking at the tsx code in ion-tabs componentWillLoad(): if no router is used, it defaults to tab 0, which then requires a present action to change it. This gives an ugly UI as tab 0 is always shown, irrespective of selectedTab in ion-tab-bar. So programmatically through present I have to do a switch given the intended route..

https://github.com/ionic-team/ionic/blob/master/core/src/components/tabs/tabs.tsx
Line 50: await this.select(tabs[0]);

componentWillRender() interestingly takes the selectedTab property from the ion-tab-bar and sets the internal property, but not invoking this.select(....) to assure that tab is actually really selected in the view.

See svelte example with dirty workaround in https://github.com/Tommertom/svelte-ionic-tab-routing-spa

It would be very nice if a selectedTab property on ion-tabs or ion-tab-bar can be defined (and working) from the start making it possible to use it in JS, svelte and maybe other frameworks.

Alternatively you could offer three options in useRouter: yes, no, default so the developer can choose the startup behaviour (option no now is overridden if there is no ion-router present.

Thanks for the issue! I can confirm that this is still an issue in the latest version of Ionic. I was able to replicate it in core (i.e. no framework). Thanks for the added dive into the potential cause; there might be a conflict between the code you mentioned in tabs and the componentWillLoad of tab-bar (which looks like it's supposed to set up selectedTab, alongside the @Watch).

Hi - any update on this? @amandaejohnston

Maybe you can point out how it is done in the Angular/Vue/React package of Ionic - so I can try to do this for svelte? In the source code? Happy to look it up