kam*_*uel 8 clojurescript reactjs reagent
我正在尝试用Reagent/React构建一个Hello World应用程序.我使用:value/ :on-changecombo 将输入与原子绑定.但是,当我输入时,输入仍为空:
(defn new-user []
; Atom declared in an inner `let`.
(let [v (atom "")]
[:div
[:input {:type "text"
:value @v
:on-change (fn [evt]
(reset! v (-> evt .-target .-value)))
}]]))
(defn app [state]
[:div
[:p "State" (pr-str @app-state)]
[new-user]])
(r/render-component [app app-state]
(.-body js/document))
Run Code Online (Sandbox Code Playgroud)
如果我将原子移出let,它将起作用:
; Atom is now top-level.
(defonce v (atom ""))
(defn new-user []
[:div
[:input {:type "text"
:value @v
:on-change (fn [evt]
(reset! v (-> evt .-target .-value)))
}]])
Run Code Online (Sandbox Code Playgroud)
是因为v每次React重新渲染时都会重新声明?如果是这样,我如何重构该代码,以便我不必使用全局变量来保存v?
事实证明我很容易 - "组件"函数不能返回模板,而是返回模板的函数.这样外部函数只执行一次(我们可以放在let那里),并且内部将在每次重新渲染时执行:
(defn new-user []
(let [v (atom "")]
; The returned function will be called on every re-render.
(fn []
[:div
[:input {:type "text"
:value @v
:on-change (fn [evt]
(reset! v (-> evt .-target .-value)))}]])))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1412 次 |
| 最近记录: |