【问题标题】:Reagent input not updating试剂输入未更新
【发布时间】:2015-02-21 11:14:39
【问题描述】:

我正在尝试使用 Reagent/React 构建一个 Hello World 应用程序。我使用:value/:on-change 组合将输入与原子联系起来。但是,当我输入时,输入仍然为空:

(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))

如果我将原子移出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)))
            }]])

是不是因为每次 React 重新渲染时都会重新声明 v?如果是这样,我该如何重构该代码,这样我就不必使用全局变量来保存v

【问题讨论】:

    标签: reactjs clojurescript reagent


    【解决方案1】:

    结果证明我很简单——“组件”函数可以返回的不是模板,而是返回模板的函数。这样,外部函数将只执行一次(我们可以将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)))}]])))
    

    【讨论】:

    • 在我将 :value 更改为 :defaultValue 之前,此解决方案对我不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多