有点老调重弹了, 写短一点, 这篇文档介绍一下 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,
所以这些组件后面会继续维护, 保证我自己的代码没有问题.