我正在re-frame default template之上构建应用。
我有以下秘书路线:
(defroute "/users/:id" []
(re-frame/dispatch [:set-active-panel :user-panel])
我想从我的试剂组件中的URL访问id
参数。我发现实现它的唯一方法是将其设置为db
。类似的东西:
(defroute "/users/:id" [id]
(re-frame/dispatch [:set-user-id id])
(re-frame/dispatch [:set-active-panel :user-panel])
这肯定会污染我的数据库,这种方法对我来说似乎很奇怪,因为我曾经在反应中写过这样的东西(react-router):
<Route path="/user/:id" component={MyComponent}>
// object with params automatically attached as props to MyComponent
那么将秘书URL参数广播到试剂组件的正确方法是什么?
UPD:在评论中,有github discussion此问题的链接。 Ones指的是将URL params设置为db作为正确的方法。无论如何,我真的不喜欢它。它会导致更多的复杂性(设置params,订阅它们,取消设置)。而且我不喜欢将URL params视为app状态。是否有任何黑客攻击?
答案 0 :(得分:1)
关于https://github.com/gadfly361/reagent-seed/issues/4的讨论似乎完全涵盖了您的情景,我认为这种方法遵循&#34;单个数据库&#34;重新构建的理念,您的数据库内容决定了应用程序的整个状态(包括面板及其参数)。
我认为这是一个相信单个原子数据库是正确方法的问题。直接使用路径参数(比如Route
组件直接从URL中读取它们)就像编写一个不使用原子数据库的组件,而是使用一些替代数据源(在这种情况下是URL路径)。
有人可能会说Route
组件完全按照您所说的复杂逻辑(它订阅路径更改并管理另一个组件状态)。在这种情况下,您只是重用Route
组件中的现有代码,而不是在代码中根据秘书路径更新URL路径更改中的DB数据。
答案 1 :(得分:1)
可从您的浏览器网址
获取数据(.. js/window -location -pathname)
然后使用bidi(我们使用bidi和pushy而不是秘书。例如as blogged)然后
(bidi/match-route your-routes url)