【问题标题】:How to conditionally unroll Hiccup data structures in Clojure如何在 Clojure 中有条件地展开 Hiccup 数据结构
【发布时间】:2016-07-07 09:44:13
【问题描述】:

如何在 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"]]))

有没有更好的办法?

【问题讨论】:

    标签: clojure hiccup


    【解决方案1】:

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

    [:div.menu
      [:div.item "Home"]
        (if authenticated?
          (list
            [:div.item "Private"]
            [:div.item "Private"]))
      [:div.item "Public"]]
    

    【讨论】:

    • 这种方法的缺点是,如果您使用的是 Reagent 或基于 React 的库,您将收到唯一的键警告。
    猜你喜欢
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2023-03-17
    • 1970-01-01
    • 2014-03-30
    • 2015-06-09
    相关资源
    最近更新 更多