Clojure 使用defmulti和defn作为om/build all的函数有什么区别? om“0.8.0”

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

我最近开始使用om存储库的代码进行学习。现在,我正在检查示例,我可以理解这个程序的行为

单击“+”按钮后

  • 首先,打印“偶数(或奇数)小部件卸载”
  • 接下来,打印“奇数(或偶数)小部件安装”
但是当我添加以下代码时
(只需将奇偶小部件
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))))))