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"]]))

有没有更好的办法?

4

1 回答 1

3

事实证明,Hiccup 对列表的处理与向量不同,因此您可以返回 () 而不是 [] 并使其正确展开:

[:div.menu
  [:div.item "Home"]
    (if authenticated?
      (list
        [:div.item "Private"]
        [:div.item "Private"]))
  [:div.item "Public"]]
于 2016-07-07T09:58:07.200 回答