我试图让FormidableLabs/radium · GitHub与reagent-project/reagent · GitHub一起工作,但我走到了死胡同。
我能够通过create-class
像这样的“破解”试剂功能使其部分工作(它几乎与原始相同,我只是添加了js/Radium
包装器)。
(ns myproject.components.radium
(:require [reagent.core :as r]
[reagent.impl.component :as c]
[reagent.impl.util :as util]
[reagent.interop :refer-macros [.' .!]]))
(defn create-class
[body]
(assert (map? body))
(let [
spec (c/cljsify body)
res (js/Radium (.' js/React createClass spec))
;res (.' js/React createClass spec)
f (fn [& args]
(r/as-element (apply vector res args)))]
(util/cache-react-class f res)
(util/cache-react-class res res)
f))
然后我为这样的组件制作了函数
(defn radium []
(create-class
{:reagent-render
(fn []
[:button {:style
[{:backgroundColor "red"
:width 500
:height 100
"@media (min-width: 200px)" {:backgroundColor "blue"}
":hover" {:backgroundColor "green"}}
{:height 200}]}
"Heres something"])}))
我在其他一些试剂渲染功能中使用它,例如:[radium/radium]
- 因此,将样式向量合并在一起效果很好(这就是 Radium 功能)。
- 媒体查询也有效,但仅在第一次渲染时,当我更改屏幕尺寸时它不会动态反应。
:hover :focus :active
根本不起作用
我正在挖掘镭代码以找出问题所在。好的迹象是 Radium 正确地为组件分配onMouseEnter
onMouseLeave
了 props 并将组件的:hover
状态设置为 true。
这会被正确触发:https ://github.com/FormidableLabs/radium/blob/master/modules/resolve-styles.js#L412
问题是该render
函数根本没有被触发,该函数应该基于新状态(由 Radium 更改)重新渲染组件。这个render
函数:
https ://github.com/FormidableLabs/radium/blob/master/modules/enhancer.js#L22
当我运行 JS Radium 示例(没有 Clojurescript 和 Reagent)时,这个渲染函数会在每个onMouseEnter
onMouseLeave
. 完全不用试剂。
当组件状态发生变化时,Reagent 是否会以某种方式阻止重新渲染?