dojo dragon main logo

路由 API

Dojo 路由公开了一个 API,用于生成链接并导航到链接,获取当前路由的参数,并校验路由 id 是否能匹配上。

  • link(route: string, params: Params = {}): string | undefined: 基于路由 id 和可选的参数生成一个链接。如果没有传入参数,将尝试使用当前路由的参数,然后再尝试使用路由配置中提供的默认参数。如果无法生成一个链接,则返回 undefined
  • setPath(path: string): void: S 设置路由中的路径。
  • get currentParams(): { [string: index]: string }: 返回当前路由的参数。
  • getRoute(id: string): RouteContext | undefined: 如果根据路由 id 能够匹配到路由,则返回 RouteContext。如果匹配不到,则返回 undefined

为路由生成链接

src/routes.ts

export default [
    {
        id: 'home',
        path: 'home',
        outlet: 'home'
    },
    {
        id: 'about',
        path: 'about',
        outlet: 'about-overview',
        children: [
            {
                id: 'about-services',
                path: '{services}',
                outlet: 'about',
                defaultParams: {
                    services: 'sewing'
                }
            },
            {
                id: 'about-company',
                path: 'company',
                outlet: 'about'
            },
            {
                id: 'about-history',
                path: 'history',
                outlet: 'about'
            }
        ]
    }
];

src/main.ts

import Router from '@dojo/framework/routing/Router';

import routes from './routes';

const router = new Router(routes);

// returns `#home`
console.log(router.link('home'));

// returns `#about`
console.log(router.link('about-overview'));

// returns `#about/company`
console.log(router.link('about-company'));

// returns `#about/history`
console.log(router.link('about-history'));

// returns `#about/knitting`
console.log(router.link('about-services'), { services: 'knitting' });

// Uses the current URL then default params to returns `#about/knitting`
// when the current route is `#about/cooking` returns `#about/cooking`
// when the current route does not contain the params returns `#about/sewing`
console.log(router.link('about-services'));

// returns `undefined` for an unknown route
console.log(router.link('unknown'));

更改路由

import Router from '@dojo/framework/routing/Router';

import routes from './routes';

const router = new Router(routes);

// goto `#home` route
router.setPath('#home');

获取当前参数

import Router from '@dojo/framework/routing/Router';

import routes from './routes';

const router = new Router(routes);

// returns the current params for the route
const params = router.currentParams;

获取匹配到的路由

如果根据路由 id 能够匹配到路由,则 getRoute 返回匹配到 RouteContext;如果匹配不到,则返回 undefined

RouteContext:

  • id: string: 路由 id
  • outlet: string: outlet id
  • queryParams: { [index: string]: string }: 匹配到路由的查询参数。
  • params: { [index: string]: string }: 匹配到路由的路径参数。
  • isExact(): boolean: 一个函数,指明路由是否与路径完全匹配。
  • isError(): boolean: 一个函数,指明路由是否与路径匹配错误。
  • type: 'index' | 'partial' | 'error': 路由的匹配类型,值为 indexpartialerror
import Router from '@dojo/framework/routing/Router';

import routes from './routes';

const router = new Router(routes);

// returns the route context if the `home` route is matched, otherwise `undefined`
const routeContext = router.getRoute('home');