在 ClojureScript 中,如何正确使用 cljsjs/react-mdl?

In ClojureScript, how do I properly use cljsjs/react-mdl?

我真的一直在与 cljsjs 库作斗争,我可能花了整整 2 天的时间来玩 react-bootstrap 的互操作和各种 material clojurescript 中的库。

基本上,我只想能够将 UI 组件添加到我的 ClojureScript 项目中。如果你能推荐比 cljsjs/react-mdl 更好的东西,我会喜欢的。如果您知道如何帮助我解决当前的错误,我也很乐意!

我目前有:

(ns project.views
  (:require [cljsjs.react-mdl]))

(def Button (aget js/ReactMDL "Button"))

我得到错误:

ReactMDL is not defined

在 javascript 控制台中。

我只想在屏幕上显示一个 react-mdl 按钮。

我正在使用这个包装器: https://github.com/cljsjs/packages/tree/master/react-mdl

对于这个图书馆: https://github.com/tleunen/react-mdl

以及这些关于 cljsjs 的互操作指令:https://github.com/cljsjs/packages/wiki/Using-Packages

如果重要的话,我也在使用 clojure 的 reagent, and reframe。老实说,我只是想得到一些用 Clojure 和相关库构建的项目,如果你能推荐我使用不同的堆栈,请做!

我是不是忽略了一些简单的东西?

我只会回答让按钮启动。

我没有使用任何 cljs 库。我只是使用了提供的 cssjs。它们需要在您的标记中,以及 link 到 Material 设计图标库。

这是试剂中的例子:

[:input {:type "submit"
:className "mdl-button mdl-js-button mdl-button--fab mdl-js-ripple-effect mdl-button--colored"
:value "ok"}]

接下来是 Om:

(defui MDSubmitButton
  Object
  (render [this]
    (dom/button (clj->js {:className "mdl-button mdl-js-button mdl-button--fab mdl-js-ripple-effect mdl-button--colored"})
                (dom/i (clj->js {:className "material-icons"}) "add"))))
(def md-submit-button (om/factory MDSubmitButton {:keyfn :id}))

我对这一切都很陌生,但我更喜欢只使用 css,将 Javascript 保持在最低限度,然后在项目的任何 React 包装器中手动构建组件使用。

应该这样使用:

(js/MaterialCheckbox element)
(js/MaterialDataTable ...)
;; and so on

您仍然需要 require 它才能导入 jscss 文件(实际上就是这样)。一开始它也让我失望(当我为 cljsjs 打包它时)。

这是因为 react-mdl 通过全局范围公开对象,例如参见 [​​=18=]

注意:可以只对某些对象使用css,比如@Chris Murphy的回答,但是重点react-mdl(而不是 mdl),它可以在需要时作为 React 组件管理生命周期。否则你只需要 mdl (这完全没问题)。不过,对于一个简单的按钮来说可能并不重要。

这就是我让 react-mdlReagent 一起工作的方式。

客户端应用代码

需要 project.clj 中的软件包:

[reagent "0.6.0" :exclusions [cljsjs/react]]
[cljsjs/react-with-addons "15.3.1-0"]
[cljsjs/react-mdl "1.5.4-0"]

命名空间要求:

(ns ,,,
 (:require  ,,,
            [cljsjs.react-mdl]))

为您将使用的组件创建助手:

(def Button (.-Button js/ReactMDL))
(def Slider (.-Slider js/ReactMDL))
,,,

现在它们可以像这样在 Reagent 视图中使用:

[:> Button "Hello!"]
[:> Slider {:min 0 :max 10}]

服务器应用代码

react-mdl CSS 文件和 Material UI 图标应包含在 HTML 中。

CSS 文件嵌入在 cljsjs/react-mdl 包中。为了提取它,我使用了 ring-cljsjs 中间件:

; Add dependencies to project.clj
[ring-cljsjs "0.1.0"]
[cljsjs/react-mdl "1.5.4-0"]

; Apply middleware to the Ring handler
(ns app.handler
  (:require ,,,
            [ring.middleware.cljsjs :refer [wrap-cljsjs]]))
,,, 
(-> ,,,
   wrap-cljsjs)

; Add link to CSS into Hiccup template for the served HTML file
(ns ,,,
  (:require ,,,
            [hiccup.page :as h]))
,,,
[:head
  [:meta {:charset "UTF-8"}]
  [:meta {:name "viewport" :content "width=device-width, initial-scale=1"}]

  (h/include-css "/cljsjs/react-mdl/material.min.css")
  ,,,

cljsjs 包中提取非 JS 资产的其他方法在 project's wiki.

中进行了描述