假设我有以下地图:
(def m {"a" {"d" {}
"e" {}}
"b" {"f" {}
"g" {"h" {}
"i" {}}}
"c" {}})
我需要像这样渲染它:
(om.dom/div #js {} "a"
(om.dom/div #js {} "d")
(om.dom/div #js {} "e"))
(om.dom/div #js {} "b"
(om.dom/div #js {} "f")
(om.dom/div #js {} "g"
(om.dom/div #js {} "h")
(om.dom/div #js {} "i")))
(om.dom/div #js {} "c")
我该怎么做呢?我已经搞砸了clojure.walk
,但无法让它先调用om.dom/div
叶子,然后调用直接父母等。
我认为该解决方案可能涉及将递归函数映射到vals
给定子图的 。它会将地图分开,直到它看到一片叶子,然后将om.dom/div
调用冒泡到地图上。
到目前为止,我有这个功能:
(defn build-tree [data]
(apply dom/div #js {}
(->> (clojure.walk/postwalk
#(cond (map? %) (vec %)
(vector? %) %
(string? %) %) data)
(clojure.walk/postwalk
#(if (and (vector? %) (string? (first %)))
(apply dom/div #js {} %) %)))))
结果是:
在检查器中使用这个:
dom/ul
生成嵌套和元素的奖励积分dom/li
..