作为一个 React/Om 新手,我不确定这个问题是否是特定于 Om 的。
我想构建一个基于自由文本输入的日期输入组件。它包括一个<input>
他们可以输入的字段,以及一个<p>
显示解析日期(如果有效)。
我将其实现为:
(defn parse-date [e owner]
(let [text (.. e -target -value)]
(om/set-state! owner :parsed-date text)))
(defn date-entry [app owner]
(reify
om/IInitState
(init-state [_] {:parsed-date ""})
om/IRenderState
(render-state [this state]
(dom/div nil
(dom/input #js {:type "text"
:ref "date"
:id "new-date"
:onChange #(parse-date % owner)})
(dom/p nil (:parsed-date state))))))
不幸的是,一旦我插入这个更改处理程序,它就不会像预期的那样运行。当我在输入字段中输入一个数字时,我可以看到它出现在输入和<p>
旁边,但随后它立即从输入中消失。
我可以通过将文本置于状态来解决它:
(defn parse-date [e owner]
(let [text (.. e -target -value)]
(om/set-state! owner :parsed-date text)
(om/set-state! owner :text text)))
(defn date-entry [app owner]
(reify
om/IInitState
(init-state [_] {:parsed-date "" :text ""})
om/IRenderState
(render-state [this state]
(dom/div nil
(dom/input #js {:type "text"
:ref "date"
:id "new-date"
:onChange #(parse-date % owner)
:value (:text state)})
(dom/p nil (:parsed-date state))))))
然而,我很惊讶我不得不这样做。真的有必要吗?有人可以解释一下这里发生了什么或指向相关文档吗?为什么插入更改处理程序调用会set-state!
吞下事件?