gpt4 book ai didi

clojurescript - 为什么镭不能与试剂(Clojurescript)一起使用?

转载 作者:行者123 更新时间:2023-12-04 08:23:41 30 4
gpt4 key购买 nike

我正在努力工作 FormidableLabs/radium · GitHubreagent-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 代码以找出问题所在。
    好兆头是 Radium 正确分配了 onMouseEnter onMouseLeave组件和设置的 Prop :hover组件状态为真。

    这被正确触发: 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 是否会以某种方式阻止重新渲染?

    最佳答案

    我已经翻译了与 Reagent 一起使用的基本按钮 Radium 示例:

    (def Radium js/Radium)

    (def styles {:base {:color "#fff"
    ":hover" {:background "#0A8DFF"}}
    :primary {:background "#0074D9"}
    :warning {:background "#FF4136"}})

    (defn button
    [data]
    (let [kind (keyword (:kind data))]
    [:button
    {:style (clj->js [(:base styles)
    (kind styles)])}
    (:children data)]))

    (def btn (Radium. (reagent/reactify-component button)))

    (def rbtn (reagent/adapt-react-class btn))

    (defn hello-world
    []
    [:div
    [rbtn {:kind :primary} "Hello Primary"]
    [rbtn {:kind :warning} "Hello Warning"]])

    关键是我转换了 button试剂组件到 react 组件(使用 reactify-component ),然后通过镭,然后将其转换回我在试剂中消耗的东西(使用 adapt-react-class )。

    在我的例子中, hover作品。

    希望这可以帮助。

    我已将工作版本放在 GitHub 上.

    关于clojurescript - 为什么镭不能与试剂(Clojurescript)一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32355688/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com