2

我想将以下 JavaScript 翻译成 ClojureScript:

var myScale = d3.scaleLinear()
  .domain([0, 10])
  .range([0, 600]);

创建此函数后,您应该能够使用数字调用它:

myScale(3);   // returns 180 

我的尝试如下:

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

(let [f (-> scaleLinear
            (. (domain (clj->js [0 10])))
            (. (range (clj->js [0 600]))))]
      (f 3))

给出:

react-dom.development.js:16545 Uncaught TypeError: module$node_modules$d3_scale$dist$d3_scale.scaleLinear.domain is not a function

4

2 回答 2

3

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你需要的话就使用它。iejs是另一个你可以忘记的“互操作”。

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

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

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

于 2018-08-08T07:09:51.097 回答
1

经过一些试验和错误,我确实让它工作了。这些都是等价的:

(-> (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]))
于 2018-08-07T14:05:05.510 回答