如何在Clojure中有条件地展开Hiccup数据结构

3

如何在Clojure的Hiccup数据结构中优雅地呈现一个有条件的菜单项列表?我的模板函数最终会充斥着对into的调用,而且不够自然。

期望的结果:

[:div.menu
  [:div.item "Home"]
  [:div.item "Private"]
  [:div.item "Private"]
  [:div.item "Public"]

如果我把私有项目放在if中,我仍然需要展开返回的向量或处理nil,所以这种方法行不通:
[:div.menu
  [:div.item "Home"]
  (if authenticated?
    [[:div.item "Private"]
     [:div.item "Private"]])
  [:div.item "Public"]]

我发现可以使用(into [:div.menu] ...)并传入一个项目列表,但这样做不太方便且不易阅读。最终我得到了以下表达式:

(-> [:div.menu
      [:div.item "Home"]]
  (into (if (auth/authenticated?)
      [[:div.item "Private"]
       [:div.item "Private"]]
  (into [[:div.item "Public"]]))

有更好的方式吗?
1个回答

3
原来,Hiccup(Clojure的HTML/XML生成库)对待列表和向量的方式不同,因此您可以返回“()”而不是“[]”,以使其正确展开。
[:div.menu
  [:div.item "Home"]
    (if authenticated?
      (list
        [:div.item "Private"]
        [:div.item "Private"]))
  [:div.item "Public"]]

这种方法的缺点是,如果您正在使用Reagent或基于React的库,则会收到唯一键警告。 - Petrus Theron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接