Clojure 使用defmulti和defn作为om/build all的函数有什么区别? om“0.8.0”
我最近开始使用om存储库的代码进行学习。现在,我正在检查示例,我可以理解这个程序的行为 单击“+”按钮后Clojure 使用defmulti和defn作为om/build all的函数有什么区别? om“0.8.0”,clojure,clojurescript,om,Clojure,Clojurescript,Om,我最近开始使用om存储库的代码进行学习。现在,我正在检查示例,我可以理解这个程序的行为 单击“+”按钮后 首先,打印“偶数(或奇数)小部件卸载” 接下来,打印“奇数(或偶数)小部件安装” 但是当我添加以下代码时 (只需将奇偶小部件defmulticode更改为defncode) 并尝试使用此功能而不是测试小部件,因此,没有打印消息 那么在这种情况下,defmulti和defn之间有什么区别呢? 这是错误还是正确的行为 提前感谢。协议方法om/IWillMount和om/IWillUnmoun
- 首先,打印“偶数(或奇数)小部件卸载”
- 接下来,打印“奇数(或偶数)小部件安装”
(只需将奇偶小部件
defmulti
code更改为defn
code)
并尝试使用此功能而不是测试小部件
,因此,没有打印消息
那么在这种情况下,defmulti和defn之间有什么区别呢?
这是错误还是正确的行为
提前感谢。协议方法
om/IWillMount
和om/IWillUnmount
仅在安装/卸载组件时调用一次。它不会在每次渲染时调用,因此,如果不会导致安装/卸载组件,则在单击“+”按钮时不会生成日志消息。多方法的使用对这种行为没有影响
使用multimethod版本时,您会看到重复的日志语句,原因是每次单击时都会返回不同的组件,因此每次单击“+”时也会装入/卸载组件,而使用普通函数,每次单击“+”时都会装入并保持装入状态
对于普通函数和多方法版本,您正在生成的日志消息将显示在浏览器的开发人员控制台中,但仅当组件装载/umounts时,而不是在每个渲染上
单击“+”按钮将在普通功能场景中的现有已安装组件中触发重新渲染。如果要登录组件的每个渲染,则需要执行以下操作:
(defn test-widget
[props owner]
(reify
om/IWillMount
(will-mount [_]
(println "Test widget mounting"))
om/IWillUnmount
(will-unmount [_]
(println "Test widget unmounting"))
om/IRender
(render [_]
(.log js/console "Rendering test widget!")
(dom/div nil
(dom/h2 nil (str "Test Widget: " (:my-number props)))
(dom/p nil (:text props))
(dom/button
#js {:onClick #(om/transact! props :my-number inc)}
"+")))))
(defn app [props owner]
(reify
om/IRender
(render [_]
(apply dom/div nil
(om/build-all test-widget (:widgets props))))))
谢谢,@Symfrog。我能理解原因。
(defn test-widget
[props owner]
(reify
om/IWillMount
(will-mount [_]
(println "Test widget mounting"))
om/IWillUnmount
(will-unmount [_]
(println "Test widget unmounting"))
om/IRender
(render [_]
(.log js/console "Rendering test widget!")
(dom/div nil
(dom/h2 nil (str "Test Widget: " (:my-number props)))
(dom/p nil (:text props))
(dom/button
#js {:onClick #(om/transact! props :my-number inc)}
"+")))))
(defn app [props owner]
(reify
om/IRender
(render [_]
(apply dom/div nil
(om/build-all test-widget (:widgets props))))))