Reagent输入框无响应问题求助:React/Clojure新手技术咨询
问题分析与解决
嘿,我一眼就揪出问题啦!你遇到的输入无响应问题,根源是ClojureScript的函数调用语法错误——你在输入框的on-change回调里调用reset!时,漏掉了包裹参数的括号!
错误原因
在Clojure/ClojureScript里,所有函数调用必须用括号把函数和参数整体包裹起来。你之前的代码里,reset! state (-> event .-target .-value)这种写法并没有真正调用reset!函数,只是把reset!作为一个符号放在代码里,自然不会更新你的状态atom,页面也就不会响应输入变化了。
修正后的代码
只需要给reset!的调用加上括号就行,下面是修正后的两个输入组件:
; 修正后的Reagent组件`atom-input` (defn atom-input [state] [:input {:type "text" :style {:display "block"} :placeholder "Username" :value @state :on-change (fn [event] ; 给reset!调用加上括号 (reset! state (-> event .-target .-value)))}]) ; 修正后的Reagent组件`atom-pw` (defn atom-pw [state] [:input {:type "password" :style {:display "block"} :placeholder "Password" :value @state :on-change (fn [event] ; 同样给reset!调用加上括号 (reset! state (-> event .-target .-value)))}])
补充说明
其实你其他部分的代码都没问题:
- 你正确使用
defonce保留了全局状态 - 在
loginForm里用let创建了局部的状态atom(unVal和pwVal) - 也正确地把这些atom传递给了子组件
只是Clojure的函数调用语法和JavaScript差异比较大,新手很容易在这里踩坑,改完括号之后,输入框的内容应该就能正常同步到状态里,页面也会跟着更新啦!
内容的提问来源于stack exchange,提问作者Agent 008
相关产品推荐
相关产品推荐

