在clojurescript中,如何评估列表

时间:2018-05-15 23:18:42

标签: reactjs material-ui clojurescript

假设有

(def defining-list `(def one 1))

如何评估定义列表以使其成为1? (在clojurescript中)

编辑: 我会想一下更广泛的形象以及我想在这里完成的工作,以避免陷入X / y问题。

我正在尝试使用cljsjs包中的cljsjs / material-ui 而不是每次定义反应组件使用它如下:

(def app-bar 
  (r/adapt-react-class (aget js/MaterialUI (name :AppBar)))

我想从一组标签中定义所有组件:

(def material-ui-tags '[AppBar Avatar Backdrop])

所以我在考虑是否可以在没有使用宏的情况下执行此操作,因为我发现this

类似的东西:

(doseq [component material-ui-tags]
  `(def ~(symbol (->kebab-case component)) (r/adapt-react-class (aget js/MaterialUI ~(name component)))))

但是上面只创建了一个defs列表,我想评估这些。在clojure eval可以做到这一点。

1 个答案:

答案 0 :(得分:2)

使用试剂,您可以使用:>作为adapt-react-class

中记录的js/的简写

此外,您可以在require处使用点表示法,我认为在1.9.854以上的shadow-cljs或cljs中,您可以aget导入符号而不是使用(ns example.core (:require [MaterialUI])) (defn component-two [] [:> MaterialUI/AppBar {:some-prop "some-value"} [:div "children-here"]]) (defn component-two [] ;; If the require above doesn't work [:> js/MaterialUI.AppBar {:some-prop "some-value"} [:div "children-here"]]) 。< / p>

在你的情况下,它会是这样的:

(def material-ui-tags '[AppBar Avatar Backdrop])

(defmacro adapt-components []
  (for [component material-ui-tags]
    `(def ~(symbol (->kebab-case component)) (reagent.core/adapt-react-class (aget js/MaterialUI ~(name component))))))

要使用def执行您想要的操作,您需要使用eval或macro。 Eared并不理想,因为Jared Smith在评论中解释道。

您从reagent-material-ui链接的示例使用宏。调用宏实际上执行扩展然后评估。所以你的代码必须是这样的:

clj文件

(adapt-components) ;; your defs will be available below this line

(defn my-component []
  [app-bar ...])

cljs文件

Whitelist