将秘书URL参数广播到试剂组件的正确方法是什么

时间:2016-07-19 22:07:10

标签: javascript clojure clojurescript reagent re-frame

我正在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状态。是否有任何黑客攻击?

2 个答案:

答案 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)