【问题标题】:In clojurescript, how to evaluate a list在 clojurescript 中,如何评估列表
【发布时间】:2018-05-15 23:18:42
【问题描述】:

假设有

(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)))))

但是上面只创建了一个 def 列表,我想对这些进行评估。在 clojure 中,eval 可以解决问题。

【问题讨论】:

  • def 是一个常数。它永远不会改变。为什么要重新定义常量?
  • 我正在寻找的情况有点复杂,我正在尝试实现类似的东西,但在 clojurescript 中:stackoverflow.com/questions/2486752/…
  • @m-arch 简短的回答是永远不要在浏览器中这样做。答案涉及eval,并且暂时忽略安全方面将是一场性能噩梦:您必须通过网络传输整个 clojurescript 编译器并在客户端运行它。只是不要这样做。您实际上想在这里完成什么?像这样的问题通常(但不总是)表示X/Y problem
  • @JaredSmith 我编辑了我的问题以使事情更清楚并避免 X/Y 问题。但据我了解,这不应该这样做吗?有可能做到吗?
  • @m-arch 正确,不要这样做。只需输入样板文件。您的编辑器甚至应该能够为您自动生成它。

标签: reactjs material-ui clojurescript


【解决方案1】:

对于试剂,您可以使用:> 作为adapt-react-class 的简写,如https://github.com/reagent-project/reagent/blob/master/docs/InteropWithReact.md 中所述

此外,您可以在 js/ 中使用点符号,我认为在 1.9.854 以上的 shadow-cljs 或 cljs 中,您可以通过 require 导入符号而不是使用 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"]])

要使用 def 执行您想要的操作,您需要 eval 或宏。正如 Jared Smith 在评论中解释的那样,Eval 并不理想。

您从 reagent-material-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 ...])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    相关资源
    最近更新 更多