Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何将新的道具传递到试剂中成分的状态?_Clojure_Clojurescript_Reagent - Fatal编程技术网

Clojure 如何将新的道具传递到试剂中成分的状态?

Clojure 如何将新的道具传递到试剂中成分的状态?,clojure,clojurescript,reagent,Clojure,Clojurescript,Reagent,我有一个组成部分: (defn inner-input [cljs_element activeEl title] (let [form (atom title)] (fn [cljs_element activeEl title] [:input {:type "text" :onChange #(reset! form (.. % -target -value)) :on-blur #(change-title cljs_e

我有一个组成部分:

(defn inner-input [cljs_element activeEl title]
  (let [form (atom title)]
    (fn [cljs_element activeEl title]
      [:input {:type "text"
           :onChange #(reset! form (.. % -target -value))
           :on-blur #(change-title cljs_element (.. % -target -value))
           :style {:display (if (:active (:node cljs_element)) "block" "none")
                   :width (* (+ 1 (count @form)) 8)
                   :max-width 730
                   :min-width 170}
           :value @form}])))
(defn card-input [cljs_element activeEl]
  (fn [cljs_element activeEl]
    (let [title (:title (:node cljs_element))]
      [:div
        [inner-input cljs_element activeEl title]])))
它嵌套在其他组件中:

(defn inner-input [cljs_element activeEl title]
  (let [form (atom title)]
    (fn [cljs_element activeEl title]
      [:input {:type "text"
           :onChange #(reset! form (.. % -target -value))
           :on-blur #(change-title cljs_element (.. % -target -value))
           :style {:display (if (:active (:node cljs_element)) "block" "none")
                   :width (* (+ 1 (count @form)) 8)
                   :max-width 730
                   :min-width 170}
           :value @form}])))
(defn card-input [cljs_element activeEl]
  (fn [cljs_element activeEl]
    (let [title (:title (:node cljs_element))]
      [:div
        [inner-input cljs_element activeEl title]])))
当我在内部输入组件中输入数据时,我需要更新本地状态表单。当外部组件卡输入更新时,我想从参数将我的表单重置为新的标题道具。我怎样才能做到这一点


我尝试将
(重置!表单标题)
放在内部输入组件的let和fn之间,但没有帮助

您可以使用
试剂/磁道
收听对标题的更改,
试剂/处置
停止收听。您也可以使用AddWatch和RemoveWatch,但track是一种更方便的语法

(defn inner-input [title]
  (reagent/with-let
    [form (reagent/atom @title)
     watch (reagent/track! (fn [] (reset! form @title)))]
    [:label
     "Inner input"
     [:input {:on-change (fn [e]
                           (reset! form (.. e -target -value)))
              :on-blur (fn [e]
                         (reset! title (.. e -target -value)))
              :value @form}]]
    (finally
      (reagent/dispose! watch))))

(defn card-input []
  (reagent/with-let
    [title (reagent/atom "hello")]
    [:div
     [:label "Title"
      [:input {:on-change (fn [e]
                            (reset! title (.. e -target -value)))
               :value @title}]]
     [inner-input title]]))
现在,如果您输入内部输入,它只会在您退出输入框时更新外部输入,但是更改外部标题将立即更改内部标题。这就是你想要的吗

但是,如果您不想将标题作为
ratom
传递,并且必须将其作为值传递,那么您可以将其与以前的值进行比较,以确定其是否已更改,并仅在更改时重置表单

(when (not= @previous-title title)
  (do (reset! previous-title title)
      (reset! form title)))

表单
更改时,可以安全地调用此代码,因此可以进入渲染。。。不会发生任何事情。

据我所知,您需要更新渲染函数中的
表单
原子,它将在外部组件的每次渲染调用后被调用。您只需在
(重置!表单标题)
之后添加
(fn[cljs_element activeEl title]…
@leetwinski,但在本例中是
(重置!表单标题)
将重写我的localstate changing in:onChange。仅当外部组件更新时,我需要将表单atom从参数更改为标题。好的,只有在外部组件更新的情况下才会调用渲染函数(reset)。之后,如果执行
(reset!formtitle
)方式(在内部fn中),您还必须将let放在外部fn之外,并将其转换为ratom。例如,
(let[title(atom(:title(:node cljs_element)))](fn[cljs_element activeEl]…)
谢谢!这正是我想要的。在阅读你的答案之前,我是在
试剂/create类
宏的帮助下完成的。我在
中编写了一个类似于你答案中第二个变量的代码:组件确实更新了
键,该键下的回调函数在参数中有以前的道具