我们的Re-frame应用程序数据库的组织方式如下(本文简化):
{:meta {:page/search {:page/component #'...} :page/details {:page/component #'...}}
:widget/base {:cur-page-id :page/search}
:page/search {:page/route {:query-params {:q "1"}, ...},
:page/details {:page/route {:query-params {:q "2"}}, ...}
考虑:meta
不可变的所有内容。
base
窗口小部件通过订阅[:widget/base :cur-page-id]
然后选择[:meta cur-page-id :page/component]
来处理呈现当前所选页面的工作。
它还需要当前页面的:page/route
,页面本身也需要它。通过订阅(fn [db] (get-in db [cur-page-id :page/route]))
得到这个。这可能是反模式,因为我们现在订阅了整个数据库。
我们可以重构这一点,但也许最好先了解这会带来什么样的性能。有没有办法正确衡量?
我们可以例如将路由存储在:widget/base
条目下,页面将通过仅选择:widget/base :routes
的订阅查找自己的路由,从而避免订阅整个数据库。