Reactjs 在clojurescript中,如何评估列表

Reactjs 在clojurescript中,如何评估列表,reactjs,material-ui,clojurescript,Reactjs,Material Ui,Clojurescript,假设有 (def defining-list `(def one 1)) 如何评估定义列表,使其变为1? (在clojurescript中) 编辑: 为了避免陷入X/y问题,我将给出一个更广泛的概念,以及我在这里试图实现的目标 我正在尝试使用cljsjs包中的cljsjs/material ui 而不是定义react组件每次使用它的时间,如下所示: (def app-bar (r/adapt-react-class (aget js/MaterialUI (name :AppBar)))

假设有

(def defining-list `(def one 1))
如何评估定义列表,使其变为1? (在clojurescript中)

编辑: 为了避免陷入X/y问题,我将给出一个更广泛的概念,以及我在这里试图实现的目标

我正在尝试使用cljsjs包中的cljsjs/material ui 而不是定义react组件每次使用它的时间,如下所示:

(def app-bar 
  (r/adapt-react-class (aget js/MaterialUI (name :AppBar)))
我想从标记数组中定义所有组件:

(def material-ui-tags '[AppBar Avatar Backdrop])
所以我在想,如果不使用我发现的宏,是否有可能做到这一点

比如:

(doseq [component material-ui-tags]
  `(def ~(symbol (->kebab-case component)) (r/adapt-react-class (aget js/MaterialUI ~(name component)))))
(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"]])

但是上面只创建了一个DEF列表,我想对它们进行评估。在clojure eval中就可以做到这一点。

对于试剂,您可以使用
:>
作为
适应反应类的缩写,如中所述

此外,您可以将点符号与
js/
一起使用,我认为在1.9.854以上的阴影cljs或cljs中,您可以
要求
导入符号,而不是使用
aget

在您的情况下,它将类似于:

(doseq [component material-ui-tags]
  `(def ~(symbol (->kebab-case component)) (r/adapt-react-class (aget js/MaterialUI ~(name component)))))
(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"]])
要使用def执行所需操作,您需要eval或macro。正如贾里德·史密斯在评论中解释的那样,Eval并不理想

从试剂材质ui链接的示例使用宏。调用宏实际上执行扩展,然后执行求值。因此,您的代码需要如下所示:

clj文件

(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))))))
cljs文件

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

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

对于试剂,您可以使用
:>
作为
适应反应类的缩写,如中所述

此外,您可以将点符号与
js/
一起使用,我认为在1.9.854以上的阴影cljs或cljs中,您可以
要求
导入符号,而不是使用
aget

在您的情况下,它将类似于:

(doseq [component material-ui-tags]
  `(def ~(symbol (->kebab-case component)) (r/adapt-react-class (aget js/MaterialUI ~(name component)))))
(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"]])
要使用def执行所需操作,您需要eval或macro。正如贾里德·史密斯在评论中解释的那样,Eval并不理想

从试剂材质ui链接的示例使用宏。调用宏实际上执行扩展,然后执行求值。因此,您的代码需要如下所示:

clj文件

(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))))))
cljs文件

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

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

def是一个常数。它永远不会改变。你为什么想要一个常数的重新定义呢?我正在寻找的案例有点复杂,我正试图实现这样的目标,但在clojurescript:@m-arch中,简短的答案是永远不要在浏览器中这样做。答案涉及到
eval
,忽略安全方面一分钟将是一场性能噩梦:您必须通过网络发送整个clojurescript编译器,并在客户端运行它。不要这样做。你到底想在这里完成什么?像这样的问题通常(但不总是)表明问题的严重性。@JaredSmith我编辑我的问题是为了让事情更清楚,避免X/Y问题。但据我所知,不应该这样做?有可能吗?@m-arch正确,不要这样做。把样板打出来就行了。您的编辑器甚至应该能够为您自动生成它。def是一个常量。它永远不会改变。你为什么想要一个常数的重新定义呢?我正在寻找的案例有点复杂,我正试图实现这样的目标,但在clojurescript:@m-arch中,简短的答案是永远不要在浏览器中这样做。答案涉及到
eval
,忽略安全方面一分钟将是一场性能噩梦:您必须通过网络发送整个clojurescript编译器,并在客户端运行它。不要这样做。你到底想在这里完成什么?像这样的问题通常(但不总是)表明问题的严重性。@JaredSmith我编辑我的问题是为了让事情更清楚,避免X/Y问题。但据我所知,不应该这样做?有可能吗?@m-arch正确,不要这样做。把样板打出来就行了。您的编辑器甚至应该能够为您自动生成它。