-
Notifications
You must be signed in to change notification settings - Fork 2.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
docs(nav): component playground examples #2498
base: main
Are you sure you want to change the base?
Changes from all commits
b886a32
550396c
847a21c
37f85ed
8a168d7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,5 @@ | ||
--- | ||
title: "ion-nav" | ||
hide_table_of_contents: true | ||
demoUrl: "/docs/demos/api/nav/index.html" | ||
demoSourceUrl: "https://github.com/ionic-team/ionic-docs/tree/main/static/demos/api/nav/index.html" | ||
--- | ||
import Tabs from '@theme/Tabs'; | ||
import TabItem from '@theme/TabItem'; | ||
|
@@ -24,19 +21,31 @@ import APITOCInline from '@components/page/api/APITOCInline'; | |
|
||
<EncapsulationPill type="shadow" /> | ||
|
||
<h2 className="table-of-contents__title">Contents</h2> | ||
Nav is a standalone component for loading arbitrary components and pushing new components on to the stack. | ||
|
||
<APITOCInline | ||
toc={toc} | ||
maxHeadingLevel={2} | ||
autogenerated={[Props, Events, Methods, Parts, CustomProps, Slots]} | ||
/> | ||
Unlike Router Outlet, Nav is not tied to a particular router. This means that if we load a Nav component, and push other components to the stack, they will not affect the app's overall router. This fits use cases where you could have a modal, which needs its own sub-navigation, without making it tied to the apps URL. | ||
|
||
## Using NavLink | ||
|
||
NavLink is a simplified API when interacting with Nav. Developers can customize the component, pass along component properties, modify the direction of the route animation or define a custom animation when navigating. | ||
|
||
Nav is a standalone component for loading arbitrary components and pushing new components on to the stack. | ||
import NavLinkExample from '@site/static/usage/nav/nav-link/index.md'; | ||
|
||
Unlike Router Outlet, Nav is not tied to a particular router. This means that if we load a Nav component, and push other components to the stack, they will not affect the app's overall router. This fits use cases where you could have a modal, which needs its own sub-navigation, without making it tied to the apps URL. | ||
<NavLinkExample /> | ||
|
||
## Navigation within a Modal | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In the React example, it looks like the inner contents are not mounted until the modal is fully presented. Is that an Ionic bug? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Correct the React example uses I can work to get a bug logged around this behavior. |
||
Modal can use Nav to offer a linear navigation that is independent of the URL. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The page transitions are not running in the Vue sample. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This appears to be a bug in the Vue implementation (or underlying Core bug), but I will dig in further and confirm. Seeing new page elements being constructed for each operation (pop/push/replace), but not seeing the pages unmounted or transitioned correctly. |
||
|
||
:::note | ||
|
||
The example below uses a reference to Nav and the public method APIs to push and pop views. It is recommended to use NavLink in implementations that do not require this level of granular access and control. | ||
|
||
::: | ||
|
||
import ModalNavigationExample from '@site/static/usage/nav/modal-navigation/index.md'; | ||
|
||
<ModalNavigationExample /> | ||
|
||
## Interfaces | ||
|
||
|
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
```ts | ||
import { NgModule } from '@angular/core'; | ||
import { BrowserModule } from '@angular/platform-browser'; | ||
import { RouterModule } from '@angular/router'; | ||
|
||
import { IonicModule } from '@ionic/angular'; | ||
|
||
import { AppComponent } from './app.component'; | ||
import { ExampleComponent } from './example.component'; | ||
|
||
import { PageOneComponent } from './page-one.component'; | ||
import { PageTwoComponent } from './page-two.component'; | ||
import { PageThreeComponent } from './page-three.component'; | ||
|
||
@NgModule({ | ||
imports: [BrowserModule, RouterModule.forRoot([]), IonicModule.forRoot({})], | ||
declarations: [AppComponent, ExampleComponent, PageOneComponent, PageTwoComponent, PageThreeComponent], | ||
bootstrap: [AppComponent], | ||
}) | ||
export class AppModule {} | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
```html | ||
<ion-header> | ||
<ion-toolbar> | ||
<ion-title>Modal Navigation</ion-title> | ||
</ion-toolbar> | ||
</ion-header> | ||
<ion-content class="ion-padding"> | ||
<ion-button id="openModal">Open Modal</ion-button> | ||
<ion-modal #modal trigger="openModal" (willPresent)="onWillPresent()"> | ||
<ng-template> | ||
<ion-header> | ||
<ion-toolbar> | ||
<ion-title>Modal</ion-title> | ||
<ion-buttons slot="end"> | ||
<ion-button (click)="modal.dismiss()"> Close </ion-button> | ||
</ion-buttons> | ||
</ion-toolbar> | ||
</ion-header> | ||
<ion-content> | ||
<ion-nav #nav></ion-nav> | ||
</ion-content> | ||
</ng-template> | ||
</ion-modal> | ||
</ion-content> | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
```ts | ||
import { Component, ViewChild } from '@angular/core'; | ||
import { IonNav } from '@ionic/angular'; | ||
|
||
import { PageOneComponent } from './page-one.component'; | ||
|
||
@Component({ | ||
selector: 'app-example', | ||
templateUrl: 'example.component.html', | ||
}) | ||
export class ExampleComponent { | ||
@ViewChild('nav') private nav: IonNav; | ||
|
||
onWillPresent() { | ||
this.nav.setRoot(PageOneComponent); | ||
} | ||
} | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
```ts | ||
import { Component } from '@angular/core'; | ||
import { IonNav } from '@ionic/angular'; | ||
|
||
import { PageTwoComponent } from './page-two.component'; | ||
|
||
@Component({ | ||
selector: 'app-page-one', | ||
template: ` | ||
<ion-content class="ion-padding"> | ||
<h1>Page One</h1> | ||
<ion-button (click)="navigateToPageTwo()">Go to Page Two</ion-button> | ||
</ion-content> | ||
`, | ||
}) | ||
export class PageOneComponent { | ||
constructor(private nav: IonNav) {} | ||
|
||
navigateToPageTwo() { | ||
this.nav.push(PageTwoComponent); | ||
} | ||
} | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
```ts | ||
import { Component } from '@angular/core'; | ||
import { IonNav } from '@ionic/angular'; | ||
|
||
@Component({ | ||
selector: 'app-page-one', | ||
template: ` | ||
<ion-content class="ion-padding"> | ||
<h1>Page Three</h1> | ||
<ion-button (click)="navigateBack()">Go Back</ion-button> | ||
<ion-button (click)="navigateToRoot()">Go to Root</ion-button> | ||
</ion-content> | ||
`, | ||
}) | ||
export class PageThreeComponent { | ||
constructor(private nav: IonNav) {} | ||
|
||
navigateBack() { | ||
this.nav.pop(); | ||
} | ||
|
||
navigateToRoot() { | ||
this.nav.popToRoot(); | ||
} | ||
} | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
```ts | ||
import { Component } from '@angular/core'; | ||
import { IonNav } from '@ionic/angular'; | ||
|
||
import { PageThreeComponent } from './page-three.component'; | ||
|
||
@Component({ | ||
selector: 'app-page-two', | ||
template: ` | ||
<ion-content class="ion-padding"> | ||
<h1>Page Two</h1> | ||
<ion-button (click)="navigateToPageThree()">Go to Page Three</ion-button> | ||
</ion-content> | ||
`, | ||
}) | ||
export class PageTwoComponent { | ||
component = PageThreeComponent; | ||
|
||
constructor(private nav: IonNav) {} | ||
|
||
navigateToPageThree() { | ||
this.nav.push(PageThreeComponent); | ||
} | ||
} | ||
``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like the button is partially cut off in the Angular example:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In React and Vue, the usage of
ion-app
creates a container element around the children content, creating a DOM tree like:Angular does not do the same thing (likely we never noticed/wasn't an issue because
ion-router-outlet
handles this implementation detail).Should I track this as a bug in Ionic or would we rather update our Playground demo code to workaround this issue (e.g.):
Developers using
ion-router-outlet
should never run into this issue.