动态路由匹配
很多时候,我们需要将命中匹配模式的路由映射到同一个组件。例如,我们可能有一个 BookDetail 组件,它应该对所有书籍进行渲染,但不同的书籍的 ID 也不同。为了处理这种关系,在 san-router 中,我们可以在路径中使用一个动态字段来实现,我们称之为 路径参数:
import san from 'san';
import {router} from 'san-router';
router.setMode('html5');
const BookDetail = san.defineComponent({
template: '<div></div>'
})
router.add({
rule: '/book/:id',
Component: BookDetail
});
现在像 /book/a 和 /book/b 这样的 URL 都会映射到同一个路由。
路径参数用冒号 : 表示。当一个路由被匹配时,它的 params 的值将在路由组件中以 this.data.get('route.query.name') 的形式暴露出来。因此,我们可以通过更新 BookDetail 的模板来呈现当前的书籍的 ID:
const BookDetail = san.defineComponent({
template: '<div>{{route.query.name}}</div>'
})
如果想在 BookDetail 中的子组件中获取路由参数,那么你可以借助 withRoute 来实现。
你可以在同一个路由中设置多个 路径参数,它们会映射到 this.data.get('route.query') 上的相应字段。例如:
| 匹配模式 | 匹配路径 | this.data.get('route.query') |
|---|---|---|
| /book/:id | /book/1 | {id: 1} |
| /book/:id/post/:version | /book/1/post/1 | {id: 1, version:1} |