小编Chr*_*phy的帖子

Reagent React Clojurescript警告:seq中的每个元素都应该有一个唯一的:key

我从这里复制了一份两年前的要点.它现在正在使用Figwheel并使用更新版本的Reagent/React.我正在寻找一种隔离来自Javascript控制台的警告消息的通用方法:Warning: Every element in a seq should have a unique :key.我们的想法是在:key所有组件中添加一个生成的唯一值.然后消息应该消失,我将能够看到哪些组件需要唯一的:key.我的问题是,尽管:key所有这些都被放入了一个唯一的,但仍然可以看到警告信息.

所以 - 有人能够告诉我我错过了哪个组件或者我做错了什么?正如可以从看到源(永久)我已经添加:key (gen-key)到这两种组分:[:polyline {:key (gen-key) ...[:svg {:key (gen-key) ...分别在线43和68.

编辑所以这就是答案(永久链接),无论如何都是代码.只需查看第^{:key (gen-key)}44和60行的位置.

请注意,该功能gen-key是为调试而设计的.自然键要更换.

这是您可以实现的方式gen-key:

(defn gen-key []
  (gensym "key-"))
Run Code Online (Sandbox Code Playgroud)

这是在上面的链接中完成的方式:

(def uniqkey (atom 0))
(defn gen-key []
  (let [res (swap! uniqkey inc)]
    (u/log res)
    res))
Run Code Online (Sandbox Code Playgroud)

clojurescript reagent

11
推荐指数
1
解决办法
5086
查看次数

Clojure:在特定命名空间中启动repl

我安装了boot-clj并希望能够在外部编辑器中编辑.clj文件,并且单独运行命令行REPL,我可以从中调用我在.clj文件中更改的函数.不需要特殊的重新加载命令.

另一件事是我不想手动输入命令来包含命名空间 - 我想只运行一个脚本将我带入命名空间,所以我可以立即调用现有的函数.

文件名:

C:\dev\my-project\src\my_project\utils.clj
Run Code Online (Sandbox Code Playgroud)

文件内部的东西:

(ns my-project.utils
  (:require
    [clojure.string :as s]))

(defn my-range [start end]
  (take (- end start) (iterate inc start)))
Run Code Online (Sandbox Code Playgroud)

我想直接进入REPL (my-range 0 3),看看它是否产生了我想要的结果.

这是什么设置?我需要运行的脚本文件是什么样的?

我目前的理解是答案看起来像这样:

(deftask dev-repl
  (set-env! …)
  (repl))
Run Code Online (Sandbox Code Playgroud)

clojure boot-clj

7
推荐指数
1
解决办法
1182
查看次数

交换什么!使用 assoc 和 (-> % .-target .-value) 语法在 ClojureScript 中是什么意思?

我正在尝试理解 Web Development With Clojure 书中的这段代码。它关于 clojure 脚本:

(defn message-form [] 
  (let [fields (atom {})] 
   (fn [] 
    [:div.content
     [:div.form-group 
      [:p "Name:"
       [:input.form-control 
        {:type :text 
         :name :name 
         :on-change #(swap! fields assoc :name (-> % .-target .-value)) 
         :value (:name @fields)}]]] 
    [:p "Message:"
     [:textarea.form-control 
      {:rows 4 
       :cols 50 
       :name :message 
       :on-change #(swap! fields assoc :message (-> % .-target .-value))} 
      (:message @fields)]] 
    [:input.btn.btn-primary {:type :submit :value "comment"}]]))) 
Run Code Online (Sandbox Code Playgroud)

谁能解释一下这部分:

#(swap! fields assoc :name (-> % .-target .-value)
Run Code Online (Sandbox Code Playgroud)

尤其是这个: ...(-> % .-target .-value)

clojure clojurescript

6
推荐指数
2
解决办法
856
查看次数

如何在Clojure中消除歧义

我在一个名称空间中有这个函数,它不导入/要求/使用任何其他包:

(defn crash [msg]
  (throw (Throwable. msg)))
Run Code Online (Sandbox Code Playgroud)

Cursive(IntelliJ IDEA IDE插件)突出显示Throwable并给我留言Cannot disambiguate overloads of Throwable.我用Exception和获得相同的消息Error.

我不明白这条消息的来源 - 我怀疑这些Java类是在除Java语言之外的任何其他jar文件中定义的.我可以做些什么来消除这个消息?

这些是project.clj:

  :dependencies [[org.clojure/clojure "1.6.0"]
                 [net.mikera/imagez "0.8.0"]
                 [org.clojure/math.numeric-tower "0.0.4"]]
Run Code Online (Sandbox Code Playgroud)

clojure cursive

5
推荐指数
1
解决办法
1172
查看次数

音色`set-config!` 已经改变了 arity,因此不知道如何使用它来将 std err/out 输出到文件

我正在尝试使用https://github.com/ptaoussanis/timbre登录到文件而不是控制台。这是我找到的一些有关如何执行此操作的文档:

; The default setup is simple console logging.  We with to turn off console logging and
; turn on file logging to our chosen filename.
(timbre/set-config! [:appenders :standard-out   :enabled?] false)
(timbre/set-config! [:appenders :spit           :enabled?] true)
(timbre/set-config! [:shared-appender-config :spit-filename] log-file-name)
(timbre/set-config! [:shared-appender-config :spit-filename] log-file-name)
Run Code Online (Sandbox Code Playgroud)

这适用于先前版本的 sente,但不适用于版本 [com.taoensso/timbre "4.3.1"]。(由于无关的原因,我需要使用最新的)。上面代码的问题是set-config!现在需要一个参数 - 一个哈希映射。而且我找不到任何文档可以帮助我将上述“两个参数”代码转换为新的“一个参数”代码。

我知道有一个非常类似的问题了那里。这个问题有实际的代码,所以更具体。我也提出了一个问题。上面的代码基本上直接来自here

clojure timbre

5
推荐指数
1
解决办法
530
查看次数

如何在 clojure Hiccup 中嵌入 javascript?

我正在用 clojure 编写一个带有 Hiccup(和其他东西)的网络服务器应用程序。我正在尝试使用一个小 JS 启用和禁用两个下拉字段的复选框,但我无法使其工作。

[:head
[:script "function toggleText(cb, t1, t2) {
    document.getElementById(t1).disabled = !cb.checked;
    document.getElementById(t2).disabled = !cb.checked;
}"]]

[:td (hf/check-box {:on-change (str "toggleText(" (name endtag) "," (name tytag) "," (name tmtag) ")")} endtag)]
[:td (hf/drop-down tytag (range 2013 2031) 2017)]
[:td (hf/drop-down tmtag (range 1 13) 6)]
Run Code Online (Sandbox Code Playgroud)

html javascript clojure hiccup clojurescript

5
推荐指数
1
解决办法
1671
查看次数

当您想要Clojure中的副作用和保留值时,使用什么功能?

人们说避免使用map顺序执行副作用,这是有道理的.

但在现实世界中,我发现自己需要保留结果并map急切地评估,即插入数据库并返回记录时.

这是(doall (map ..))我唯一的选择吗?有没有比较惯用的方法呢?

clojure

5
推荐指数
2
解决办法
189
查看次数

从Scala.js调用Javascript

我使用a Page.scala来启动Scala.js应用程序的客户端.因此Page.scala取代了index.html.Scalatags raw函数允许包含实际的JavaScript.在Scalatags文档中,示例是alert('Hello!').我实际上有一些JavaScript可以解决浏览器的问题,但是说"你好!" 一开始就好.JavaScript本身就是这里get_browser_info()功能.

所以我的问题是,我可以在Scala代码中调用这一点JavaScript吗?这是一种明智的方式来发现用户正在使用的浏览器吗?我想将此信息发送回服务器.

当然我可以将函数转换为Scala,但是检查浏览器的JavaScript并不容易让我阅读 - 我从来都不是一个JavaScript程序员.

翻译会很棒,即使它几乎只能回答核心问题.

编辑@sjrd给出了启动Scala代码的答案.为了给出完整的图片,这就是Page.scala的样子:

object Page{
  val boot =
    "simple.MyScalaClient().main(document.getElementById('contents'))"
  val browserVersionFn = "<script>function get_browser_info(){var ua=navigator.userAgent ... version: M[1]};}</script>"
  val skeleton =
    html(
      head(
        meta(charset:="utf-8"),
        script(src:= "/myappname/myappname-fastopt.js"),
        link(
          rel:="stylesheet",
          href:="http://yui.yahooapis.com/pure/0.5.0/pure-min.css"
        )
      ),
      body(
        style := "margin:30",
        onload := boot,
        div(id:="contents"),
        raw(browserVersionFn)
      )
    )
}
Run Code Online (Sandbox Code Playgroud)

javascript scala.js

4
推荐指数
1
解决办法
617
查看次数

Clojure打印矢量的内容

在Clojure中,如何打印矢量的内容?(我想到了控制台,通常用于调试目的).如果答案可以推广到任何好的Seq.

编辑: 我应该补充一点,它应该是一个简单的函数,它提供看起来合理的输出,因此每行打印一个项目 - 因此可以很容易地用于调试目的.我确信有些库可以做到这一点,但使用库确实看起来有点过分.

clojure

4
推荐指数
2
解决办法
2194
查看次数

如何让开发卡与 shadow-cljs 一起工作

我的开发卡曾经与 Figwheel 一起使用。但是我无法让它们用 shadow-cljs 显示。

阴影发出此消息:

shadow-cljs - 用于 :cards 的 HTTP 服务器,可在http://localhost:3450

命名空间cards.card-ui只是一系列的需求。

我有一条println消息cards.card-ui正在显示。

shadow-cljs.edn我有两个:builds. 这是第二个:

      :cards {:target           :browser
              :output-dir       "resources/public/js/cards"
              :asset-path       "js/cards"
              :modules          {:main {:entries [cards.card-ui]}}
              :compiler-options {:static-fns false}
              :devtools         {:http-root          "resources/public"
                                 :http-resource-root "resources/public"
                                 :http-port          3450
                                 :http-handler       shadow.http.push-state/handle
                                 :push-state/index   "cards.html"
                                 :preloads           [devtools.preload
                                                      default-db-format.preload]}
              :dev              {:compiler-options {:devcards true}}
              }
Run Code Online (Sandbox Code Playgroud)

cards.html有一个body标签,它有一个id为“app”的div标签。我将浏览器带到http://localhost:3450/cards.html并得到一个空白页面。我最好的理论是cards.card-ui命名空间没有安装在app.

fulcro

4
推荐指数
1
解决办法
798
查看次数