san-router

Router for San

Usage no npm install needed!

<script type="module">
  import sanRouter from 'https://cdn.skypack.dev/san-router';
</script>

README

san-router

NPM version License

San 框架的官方 router。通常,单页或同构的 Web 应用都会需要一个 router。

你可以从下面找到 san-router 的下载和使用说明,也可以直接从 示例项目 看看实际项目中的使用方法。

注意:使用 san-router,要求 San 的版本号 >= 3.0.2

下载

NPM:

$ npm i san-router

使用

Webpack + Babel

通过 named import 导入

import {router, Link} from 'san-router';

router.add({
    rule: '/book/:id',
    Component: BookDetail
});
router.start();

webpack 环境配置网上有太多文章,在此不赘述了

AMD

通过 require 拿到的 exports 上包含 router 和 Link

var sanRouter = require('san-router');
var router = sanRouter.router;
var Link = sanRouter.Link;

router.add({
    rule: '/book/:id',
    Component: BookDetail
});
router.start();

请为 amd loader 正确配置 san-router 的引用路径。通过 npm 安装的项目可以采用下面的配置

require.config({
    baseUrl: 'src',
    paths: {
        'san-router': '../dep/san-router/dist/san-router.source'
    }
});

API

router

路由器对象。

路由用于将特定的 URL 对应到组件类上。在 URL 变化并匹配路由规则时,路由将初始化特定组件并渲染到页面上。你也可以将 URL 对应到函数上,路由将在 URL 规则匹配时执行特定函数。

add({Object}options)

说明

添加一条路由规则。

你可以指定 Component 和 target 参数,让规则匹配时在 target 中渲染一个 Component。

router.add({
    rule: '/book/:id',
    Component: san.defineComponent({
        route() {
            let route = this.data.get('route');
            // route.query.id
        }
    }),
    target: '.app-main'
});

Component 属性也可以用来加载一个异步的组件:

const BookComponent = () => import('./BookComponent');

router.add({
    rule: '/book/:id',
    Component: BookComponent,
    target: '.app-main'
});

你也可以指定一个 handler 函数,让规则匹配时执行这个函数。

router.add({
    rule: '/book/:id',
    handler(e) {
        e.query.id
    }
});

路由规则有2种形式:

  • string URL 的 path 部分与字符串完全匹配。支持 : 标记的路径参数,根据名称作为 query 的参数传递给相应的组件或函数。
  • RegExp URL 的 path 部分匹配该正则。正则中的 group 将根据序号作为 query 的参数传递给相应的组件或函数。

参数

  • string|RegExp options.rule - 路由规则
  • Function options.Component - 规则匹配时渲染的组件类
  • string options.target - 组件渲染的容器元素,默认值为 #main
  • Function options.handler 规则匹配时的执行函数

listen({Function}listener)

说明

添加路由监听器。当发生路由行为时,监听器函数被触发。

router.listen(function (e, config) {
    e.query.id
});

参数

  • Function listener - 监听器函数

监听器函数参数

  • Object e - 路由信息对象
  • Object config - 路由配置对象

路由监听器作为所有路由的切面函数,通常承担权限判断之类基础的任务。所以路由监听器可以通过 stop 方法阻断当前路由过程,并进行 URL 跳转。

router.listen(function (e) {
    if (!checkPermission()) {
        e.stop();
        this.locator.redirect('/forbidden');
    }
});

路由监听器可以通过 suspendresume 方法中断和唤醒路由过程,实现异步。不过异步过程会导致路由对应的视图渲染延迟,慎用。

router.listen(function (e) {
    e.suspend();
    checkPermission().then(invalid => {
        if (invalid) {
            e.stop();
            this.locator.redirect('/forbidden');
            return;
        }

        e.resume();
    });
});

unlisten({Function}listener)

说明

移除路由监听器。

参数

  • Function listener - 监听器函数

setMode({string}mode)

说明

设置路由模式。支持两种模式:hash | html5,默认为 hash。

参数

  • string mode - 路由模式,hash | html5

push({Object}url[,{Object}options])

说明

功能类似 router.locator.redict 方法,并增加了 query 对象的处理。同时在 san 组件中可通过实例的 $router 方法访问当前路由实例

router.push({
    query: {
        name: 'erik',
        sex: 1,
        age: 18
    }
});

// san 组件中
this.$router.push({
    query: {
        name: 'erik',
        sex: 1,
        age: 18
    }
});

start()

说明

启动路由

stop()

说明

停止路由

Link

具有路由功能的应用中,建议使用 Link 组件代替 a 标签。Link 组件可以根据路由模式渲染一个链接。通过 to 属性指定目标地址,Link 组件将渲染一个带有正确地址的 a 标签。

san.defineComponent({
    components: {
        'router-link': Link
    },

    template: `
        <div>
            <header>
                <router-link to="/user">用户信息</router-link>
            </header>
        </div>
    `
});

ChangeLogs

1.2.4

  • [feature] router 增加 push 方法
  • [feature] 在 san 组件中通过 this.$router 可以访问 router 实例
  • [fix] 修复 HashLocator 原型指向问题

1.2.3

  • [fix] 修复在 san 3.10.2 版本不支持 callHook 的问题,不再依赖此实现。