d3 JavaScript转换为ClojureScript

时间:2018-08-07 13:45:22

标签: clojurescript clojurescript-javascript-interop

我想将以下JavaScript转换为ClojureScript:

select

创建此函数后,您应该可以使用数字进行调用:

array

我的尝试如下:

toArray()

礼物:

  

react-dom.development.js:16545未捕获的TypeError:module $ node_modules $ d3_scale $ dist $ d3_scale.scaleLinear.domain不是函数

2 个答案:

答案 0 :(得分:2)

scaleLinear是可以从d3调用的函数。这不是应该构建的东西。因此,这是一个更好的答案:

(-> d3
    (.scaleLinear)
    (.domain #js [min-y max-y])
    (.range #js [1 0]))

我在需求上遇到了麻烦,所以这里是相关的:

["d3" :as d3]
["d3-scale" :refer (scaleLinear)]

这是使用shadow-cljs而不是cljsjs。

要求输入“ d3”的麻烦在于您需要拉入整个库。 这是另一种方法:

(-> (scaleLinear)
    (.domain #js [min-y max-y])
    (.range #js [1 0]))

似乎,每当您需要某些东西时,都可以按需直接使用它,而忘记了互操作点。

(:require ["d3" :as d3])表示您将d3拉入本地范围。 js/d3是全局范围,因此如果需要,请使用d3。即js是您可以忘记的另一项“互操作”内容。

另一方面,不需要domainrange,因此需要遵守互操作规则。

总而言之-解决的主要问题是scaleLinear是一个函数,因此实际上需要调用它!

这个问题是在探索通过React Vis使用d3的开始时提出的-见https://medium.com/@cjmurphy/using-react-vis-from-clojurescript-787d02281f7c

答案 1 :(得分:0)

经过反复试验,我确实可以正常使用它。这些都是等效的:

(-> (new scaleLinear)
    (.domain (clj->js [0 10]))
    (.range (clj->js [0 600])))

(-> (new scaleLinear)
    (. (domain (clj->js [0 10])))
    (. (range (clj->js [0 600]))))

(-> (scaleLinear.)
    (.domain #js [0 10])
    (.range #js [0 600]))