Я пытался получить работу FormidableLabs/radium · GitHub с reagent-project/reagent · GitHub, но я пришел в тупик.Почему Radium не работает с реагентом (Clojurescript)?
Мне удалось заставить его работать частично с помощью функции «взлома» реагента 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
реквизит для компонента и устанавливает :hover
состояние компонента в true.
Это получает правильно уволили: https://github.com/FormidableLabs/radium/blob/master/modules/resolve-styles.js#L412
Проблема заключается в том, что render
функция, которая, как предполагается повторно вынести компонент на основе нового состояния (измененной радия) не обжигают при всех. Эта функция render
: https://github.com/FormidableLabs/radium/blob/master/modules/enhancer.js#L22 Принимая во внимание, что при запуске примеров JS Radium (без Clojurescript и Reagent) эта функция рендеринга срабатывает каждые . С реагентом совсем нет.
Реагент каким-то образом блокирует повторный рендеринг при изменении состояния компонента?