docs(router): some docs

This commit is contained in:
Manu Mtz.-Almeida
2018-04-26 19:27:54 +02:00
parent 3328314339
commit bf17a01f36
7 changed files with 2128 additions and 2019 deletions

3996
core/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -4984,7 +4984,7 @@ declare global {
/** /**
* A redirect route, redirects "from" a URL "to" another URL. This property is that "to" URL. When the defined `ion-route-redirect` rule matches, the router will redirect to the path specified in this property. The value of this property is always an absolute path inside the scope of routes defined in `ion-router` it can't be used with another router or to perfom a redirection to a different domain. Note that this is a virtual redirect, it will not cause a real browser refresh, again, it's a redirect inside the context of ion-router. When this property is not specified or his value is `undefined` the whole redirect route is noop, even if the "from" value matches. * A redirect route, redirects "from" a URL "to" another URL. This property is that "to" URL. When the defined `ion-route-redirect` rule matches, the router will redirect to the path specified in this property. The value of this property is always an absolute path inside the scope of routes defined in `ion-router` it can't be used with another router or to perfom a redirection to a different domain. Note that this is a virtual redirect, it will not cause a real browser refresh, again, it's a redirect inside the context of ion-router. When this property is not specified or his value is `undefined` the whole redirect route is noop, even if the "from" value matches.
*/ */
'to': string|undefined; 'to': string;
} }
} }
@ -5018,7 +5018,7 @@ declare global {
/** /**
* A redirect route, redirects "from" a URL "to" another URL. This property is that "to" URL. When the defined `ion-route-redirect` rule matches, the router will redirect to the path specified in this property. The value of this property is always an absolute path inside the scope of routes defined in `ion-router` it can't be used with another router or to perfom a redirection to a different domain. Note that this is a virtual redirect, it will not cause a real browser refresh, again, it's a redirect inside the context of ion-router. When this property is not specified or his value is `undefined` the whole redirect route is noop, even if the "from" value matches. * A redirect route, redirects "from" a URL "to" another URL. This property is that "to" URL. When the defined `ion-route-redirect` rule matches, the router will redirect to the path specified in this property. The value of this property is always an absolute path inside the scope of routes defined in `ion-router` it can't be used with another router or to perfom a redirection to a different domain. Note that this is a virtual redirect, it will not cause a real browser refresh, again, it's a redirect inside the context of ion-router. When this property is not specified or his value is `undefined` the whole redirect route is noop, even if the "from" value matches.
*/ */
'to'?: string|undefined; 'to'?: string;
} }
} }
} }
@ -5033,11 +5033,11 @@ declare global {
*/ */
'component': string; 'component': string;
/** /**
* Props to pass when the `component` specified in this route load. * A key value `{ 'red': true, 'blue': 'white'}` containing props that should be passed to the defined component when rendered.
*/ */
'componentProps': {[key: string]: any}; 'componentProps': {[key: string]: any};
/** /**
* Relative path that needs to match in order for this route to apply. * Relative path that needs to match in order for this route to apply. Accepts paths similar to expressjs so that you can define parameters in the url /foo/:bar where bar would be available in incoming props.
*/ */
'url': string; 'url': string;
} }
@ -5067,7 +5067,7 @@ declare global {
*/ */
'component'?: string; 'component'?: string;
/** /**
* Props to pass when the `component` specified in this route load. * A key value `{ 'red': true, 'blue': 'white'}` containing props that should be passed to the defined component when rendered.
*/ */
'componentProps'?: {[key: string]: any}; 'componentProps'?: {[key: string]: any};
/** /**
@ -5075,7 +5075,7 @@ declare global {
*/ */
'onIonRouteDataChanged'?: (event: CustomEvent<any>) => void; 'onIonRouteDataChanged'?: (event: CustomEvent<any>) => void;
/** /**
* Relative path that needs to match in order for this route to apply. * Relative path that needs to match in order for this route to apply. Accepts paths similar to expressjs so that you can define parameters in the url /foo/:bar where bar would be available in incoming props.
*/ */
'url'?: string; 'url'?: string;
} }
@ -5130,9 +5130,15 @@ declare global {
namespace StencilComponents { namespace StencilComponents {
interface IonRouter { interface IonRouter {
'base': string;
'navChanged': (direction: RouterDirection) => Promise<boolean>; 'navChanged': (direction: RouterDirection) => Promise<boolean>;
'push': (url: string, direction?: RouterDirection) => Promise<boolean>; 'push': (url: string, direction?: RouterDirection) => Promise<boolean>;
/**
* By default `ion-router` will match the routes at the root path ("/"). That can be changed when T
*/
'root': string;
/**
* The router can work in two "modes": - With hash: `/index.html#/path/to/page` - Without hash: `/path/to/page` Using one or another might depend in the requirements of your app and/or where it's deployed. Usually "hash-less" navigation works better for SEO and it's more user friendly too, but it might requires aditional server-side configuration in order to properly work. On the otherside hash-navigation is much easier to deploy, it even works over the file protocol. By default, this property is `true`, change to `false` to allow hash-less URLs.
*/
'useHash': boolean; 'useHash': boolean;
} }
} }
@ -5156,8 +5162,14 @@ declare global {
} }
namespace JSXElements { namespace JSXElements {
export interface IonRouterAttributes extends HTMLAttributes { export interface IonRouterAttributes extends HTMLAttributes {
'base'?: string;
'onIonRouteChanged'?: (event: CustomEvent<RouterEventDetail>) => void; 'onIonRouteChanged'?: (event: CustomEvent<RouterEventDetail>) => void;
/**
* By default `ion-router` will match the routes at the root path ("/"). That can be changed when T
*/
'root'?: string;
/**
* The router can work in two "modes": - With hash: `/index.html#/path/to/page` - Without hash: `/path/to/page` Using one or another might depend in the requirements of your app and/or where it's deployed. Usually "hash-less" navigation works better for SEO and it's more user friendly too, but it might requires aditional server-side configuration in order to properly work. On the otherside hash-navigation is much easier to deploy, it even works over the file protocol. By default, this property is `true`, change to `false` to allow hash-less URLs.
*/
'useHash'?: boolean; 'useHash'?: boolean;
} }
} }

View File

@ -30,7 +30,7 @@ export class RouteRedirect {
* When this property is not specified or his value is `undefined` the whole redirect route is noop, * When this property is not specified or his value is `undefined` the whole redirect route is noop,
* even if the "from" value matches. * even if the "from" value matches.
*/ */
@Prop() to: string|undefined; @Prop() to?: string;
/** /**
* Internal event that fires when any value of this rule is added/removed from the DOM, * Internal event that fires when any value of this rule is added/removed from the DOM,

View File

@ -22,7 +22,8 @@ in ion-tabs it actually refers to the name of the `ion-tab` to select.
Props to pass when the `component` specified in this route load. A key value `{ 'red': true, 'blue': 'white'}` containing props that should be passed
to the defined component when rendered.
#### url #### url
@ -31,6 +32,9 @@ string
Relative path that needs to match in order for this route to apply. Relative path that needs to match in order for this route to apply.
Accepts paths similar to expressjs so that you can define parameters
in the url /foo/:bar where bar would be available in incoming props.
## Attributes ## Attributes
@ -49,7 +53,8 @@ in ion-tabs it actually refers to the name of the `ion-tab` to select.
Props to pass when the `component` specified in this route load. A key value `{ 'red': true, 'blue': 'white'}` containing props that should be passed
to the defined component when rendered.
#### url #### url
@ -58,6 +63,9 @@ string
Relative path that needs to match in order for this route to apply. Relative path that needs to match in order for this route to apply.
Accepts paths similar to expressjs so that you can define parameters
in the url /foo/:bar where bar would be available in incoming props.
## Events ## Events

View File

@ -8,6 +8,9 @@ export class Route {
/** /**
* Relative path that needs to match in order for this route to apply. * Relative path that needs to match in order for this route to apply.
*
* Accepts paths similar to expressjs so that you can define parameters
* in the url /foo/:bar where bar would be available in incoming props.
*/ */
@Prop() url = ''; @Prop() url = '';
@ -21,7 +24,8 @@ export class Route {
@Prop() component!: string; @Prop() component!: string;
/** /**
* Props to pass when the `component` specified in this route load. * A key value `{ 'red': true, 'blue': 'white'}` containing props that should be passed
* to the defined component when rendered.
*/ */
@Prop() componentProps?: {[key: string]: any}; @Prop() componentProps?: {[key: string]: any};

View File

@ -1,20 +1,38 @@
# ion-router # ion-router
You should have one single `ion-router` component in your project. This component controls all interactions with the browser history and it aggregates updates through an event system.
`ion-router` is just a URL coordinator for the navigation outlets of ionic: `ion-nav` and `ion-tabs`. `ion-router` is just a URL coordinator for the navigation outlets of ionic: `ion-nav` and `ion-tabs`.
That means the ion-router never touches the DOM, it does NOT show the components or emit any kind of lifecycle event, it just tell `ion-nav` and `ion-tabs` what to "show" based in the browser's URL. That means the ion-router never touches the DOM, it does NOT show the components or emit any kind of lifecycle events, it just tell `ion-nav` and `ion-tabs` what and when to "show" based in the browser's URL.
In order to configure this relationship between components (to load/select) and URLs, ion-router uses a declarative syntax using JSX/HTML to define a tree of routes. In order to configure this relationship between components (to load/select) and URLs, ion-router uses a declarative syntax using JSX/HTML to define a tree of routes.
## Ecosystem of components
### Configuration
- <ion-router>
- <ion-route>
- <ion-router-redirect>
### Outlets
- <ion-nav>
- <ion-router-outlet>
- <ion-tab>
## Tree of routes ## Tree of routes
The way to structure navigation in an ionic app is by nesting `ion-nav`s and `ion-tabs`, for example, you have an `ion-nav` at the root, where you "push" an page that has an `ion-tabs`, then inside each tab (`ion-tab`) you might have another `ion-nav` since you want navigation independent navigation for each tab. The way to structure navigation in an ionic app is by nesting `ion-nav`s and `ion-tabs`, for example, you have an `ion-nav` at the root, where you "push" an page that has an `ion-tabs`, then inside each tab (`ion-tab`) you might have another `ion-nav` since you might want independent navigation for each tab.
Obviously this structure is app-dependent, but in any case, nesting router-outlets (ion-nav or ion-tabs) is a common pattern. This is way the routes defined in `ion-router` are not a list of routes, but an tree. Obviously this structure is app-dependent, but in any case, nesting router-outlets (ion-nav or ion-tabs) is a common pattern. This is why the routes defined in `ion-router` are not a list of routes, but an tree.
Any route can have a list of nested routes: Any route can have a list of nested routes:
``` ```html
<ion-router> <ion-router>
<ion-route component="page-tabs"> <ion-route component="page-tabs">
<ion-route url="/schedule" component="tab-schedule"> <ion-route url="/schedule" component="tab-schedule">
@ -43,7 +61,17 @@ Any route can have a list of nested routes:
This hierarchy of routes matches the hierarchy of how `ion-tab`s and `ion-nav`s are nested together. This hierarchy of routes matches the hierarchy of how `ion-tab`s and `ion-nav`s are nested together.
## Router configuration
## Router guards and redirections
## Navigating Statically
## Navigating Dynamically
## URL params and data passing
## JSX reactiviness
<!-- Auto Generated Below --> <!-- Auto Generated Below -->
@ -51,27 +79,63 @@ This hierarchy of routes matches the hierarchy of how `ion-tab`s and `ion-nav`s
## Properties ## Properties
#### base #### root
string string
By default `ion-router` will match the routes at the root path ("/").
That can be changed when
T
#### useHash #### useHash
boolean boolean
The router can work in two "modes":
- With hash: `/index.html#/path/to/page`
- Without hash: `/path/to/page`
Using one or another might depend in the requirements of your app and/or where it's deployed.
Usually "hash-less" navigation works better for SEO and it's more user friendly too, but it might
requires aditional server-side configuration in order to properly work.
On the otherside hash-navigation is much easier to deploy, it even works over the file protocol.
By default, this property is `true`, change to `false` to allow hash-less URLs.
## Attributes ## Attributes
#### base #### root
string string
By default `ion-router` will match the routes at the root path ("/").
That can be changed when
T
#### use-hash #### use-hash
boolean boolean
The router can work in two "modes":
- With hash: `/index.html#/path/to/page`
- Without hash: `/path/to/page`
Using one or another might depend in the requirements of your app and/or where it's deployed.
Usually "hash-less" navigation works better for SEO and it's more user friendly too, but it might
requires aditional server-side configuration in order to properly work.
On the otherside hash-navigation is much easier to deploy, it even works over the file protocol.
By default, this property is `true`, change to `false` to allow hash-less URLs.
## Events ## Events

View File

@ -27,7 +27,28 @@ export class Router {
@Prop({ context: 'window' }) win!: Window; @Prop({ context: 'window' }) win!: Window;
@Prop({ context: 'isServer' }) isServer!: boolean; @Prop({ context: 'isServer' }) isServer!: boolean;
@Prop() base = ''; /**
* By default `ion-router` will match the routes at the root path ("/").
* That can be changed when
*
* T
*/
@Prop() root = '/';
/**
* The router can work in two "modes":
* - With hash: `/index.html#/path/to/page`
* - Without hash: `/path/to/page`
*
* Using one or another might depend in the requirements of your app and/or where it's deployed.
*
* Usually "hash-less" navigation works better for SEO and it's more user friendly too, but it might
* requires aditional server-side configuration in order to properly work.
*
* On the otherside hash-navigation is much easier to deploy, it even works over the file protocol.
*
* By default, this property is `true`, change to `false` to allow hash-less URLs.
*/
@Prop() useHash = true; @Prop() useHash = true;
@Event() ionRouteChanged!: EventEmitter<RouterEventDetail>; @Event() ionRouteChanged!: EventEmitter<RouterEventDetail>;
@ -187,11 +208,11 @@ export class Router {
private setPath(path: string[], direction: RouterDirection) { private setPath(path: string[], direction: RouterDirection) {
this.state++; this.state++;
writePath(this.win.history, this.base, this.useHash, path, direction, this.state); writePath(this.win.history, this.root, this.useHash, path, direction, this.state);
} }
private getPath(): string[] | null { private getPath(): string[] | null {
return readPath(this.win.location, this.base, this.useHash); return readPath(this.win.location, this.root, this.useHash);
} }
private emitRouteChange(path: string[], redirectPath: string[]|null) { private emitRouteChange(path: string[], redirectPath: string[]|null) {