在 om-cookbook 的本地状态示例中,我可以使用update-state更新计数器!和set-state!,但不是与transact!
我使用栗子模板初始化项目。
(def app-state (atom {:button-presses 0}))
这些工作
(defn clicks [data owner]
(om/update-state! owner [:button-presses] inc))
(defn clicks [data owner]
(let [value (om/get-state owner :button-presses)]
(om/set-state! owner :button-presses (inc value))))
这不起作用
(defn clicks [data owner]
(om/transact! data :button-presses inc))
来自IRenderState的电话
om/IRenderState
(render-state [_ state]
(dom/div nil
(dom/button #js
{:onClick #(clicks data owner)}
"Click Moi")
(dom/br nil)
(dom/p nil
(str "Button Presses: " (:button-presses state)))))))
答案 0 :(得分:0)
您混淆了应用程序状态和组件的状态。请注意update-state!
和set-state!
如何将owner
(组件)作为参数,而transact!
和update!
采用cursor。
(defn clicks [data owner]
(om/transact! data :button-presses inc))
您的上述示例实际上对光标(data
)起作用,而不是状态,但您的IRenderState
实现正在组件的状态中查找:button-presses
。如果您将(:button-presses state)
更改为(:button-presses data)
,一切都应该没问题。
答案 1 :(得分:0)
根据Om Dcumentation,您正在使用transact!并传递一个函数但不是一个应用于旧状态的函数。 你可以做一个
(defn clicks [data owner]
(om/transact! data :button-presses #(apply inc %))
或只是(partial inc)
,它会期望值传入。
另外作为旁注,交易的唯一区别!并更新!是更新!忽略参数(光标的旧值)