我们的 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
避免订阅整个数据库。