有点老调重弹了, 写短一点, 这篇文档介绍一下 router-as-view 组件的改进.
组件前身是在简聊当中使用的 router-view 组件, 独立实现的路由,
由于我重构了的简聊 Store 方案, 发现路由存在私有状态, 于是设计了这个方案.
后来简聊停在了那个版本, GitHub 上的代码也就大概锁死了,
所以最近我重命名了组件为 router-as-view 以便以后使用:
https://github.com/react-chin...
Demo 也更新了, 可以直接点击查看:
http://repo.react-china.org/r...

嵌套路由, 嵌套数据

这次修改主要改变的是路由的数据表示, 比如这个地址:

/team/23/room/34

我定义的路由规则是这样的, key 是名字, value 是参数, 可能有多个参数:

rules = Immutable.fromJS {
  home: []         # means / or /home
  demo: []         # means /demo
  team: ['teamId'] # means /team/:teamId
  room: ['roomId'] # means /room/:roomId
  '中文': ['中文']   # means /中文/:中文
}

然后解析路由时会按匹配名字, 再匹配参数个数, 然后生成嵌套的路由数据:

{
  "router": {
    "name": "team",
    "data": {
      "teamId": "23"
    },
    "query": {},
    "router": {
      "name": "room",
      "data": {
        "roomId": "34"
      },
      "query": {}
    }
  }
}

原先在简聊用的路由数据是一层的, 嵌套路由的情况在顶层判断并不方便.
现在是嵌套的 router, 那么父级路由直接就包含自路由了, 方便一些.
其他方面大概没什么改变, 主要还是为了扩展路由的灵活性.

增加的缺点

也带来一些问题, 就是要求路由比如有对应的数据,
一个是 / 路由, 另一个是 404 的处理上.
/ 是一个特殊的路由, 没有任何字段可用于判断, 所以我强制映射到和 /home,
或者说 /home 有些情况也要被映射成 /, 有点强制性..
404 表示的是"找不到目标", 那么, 所有找到不的路由就自动 404 了,
比如说父级路由找到了, 然后再匹配却找不到, 就是一个很自然的 404.

对于强迫症来说, 强制设置这么多规则是有问题的,
而且从灵活性上考量, 这比起其他的路由方案也增加了一些约束,
react-router 其实用的蛮漂亮的办法解决了嵌套路由的问题,
只是说它看起来太像是私有状态了, 我对它不信任.

小结

除了 router-as-view, 还有个 actions-in-recorder 也放出了,
以后写 React 我还是想用这套方案, 实在不行再用 Redux,
所以这些组件后面会继续维护, 保证我自己的代码没有问题.


题叶
17.3k 声望2.6k 粉丝

Calcit 语言作者