6

我正在re-frame default template之上构建一个应用程序。

我有以下秘书路线:

(defroute "/users/:id" []
  (re-frame/dispatch [:set-active-panel :user-panel])

我想id从我的试剂组件中的 URL 访问参数。我发现实现它的唯一方法是将其设置为db. 就像是:

(defroute "/users/:id" [id]
  (re-frame/dispatch [:set-user-id id])
  (re-frame/dispatch [:set-active-panel :user-panel])

这肯定会污染我的数据库,这种方法对我来说似乎很奇怪,因为我曾经在 react 中写过这样的东西(使用react-router):

<Route path="/user/:id" component={MyComponent}>
// object with params automatically attached as props to MyComponent

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

UPD:在评论中有一个关于这个问题的github 讨论的链接。一个是指将 URL 参数设置为 db 作为正确的方法。反正我不是很喜欢。它会导致更多的复杂性(设置参数,订阅它们,取消设置)。而且我不喜欢将 URL 参数视为应用程序状态。有什么黑客或什么吗?

4

2 回答 2

1

https://github.com/gadfly361/reagent-seed/issues/4上的讨论似乎完全涵盖了您的情况,我认为这种方法遵循重新框架的“单一数据库”理念,您的数据库内容决定了整个状态您的应用程序(包括面板及其参数)。

我认为这是一个相信单个原子数据库是否正确的问题。直接使用路径参数(比如Route直接从 URL 读取它们的组件)就像编写一个不使用 atom DB 而是使用一些替代数据源(在本例中为 URL 路径)的组件。

有人可能会说Route组件完全按照您所说的复杂逻辑执行(它订阅路径更改并管理另一个组件状态)。在这种情况下,您只是重用Route组件中的现有代码,而不是在您的代码中执行相同的操作,根据秘书路由更新 URL 路径更改的数据库数据。

于 2016-07-27T14:48:38.357 回答
1

数据可从您的浏览器 url 获得

(.. js/window -location -pathname)

然后使用bidi(我们使用bidi和pushy而不是秘书。例如博客)然后

(bidi/match-route your-routes url)
于 2016-07-28T13:13:10.250 回答