试剂在第一次转变时不会重新呈现

时间:2017-01-19 01:58:22

标签: reactjs clojurescript reagent

我一直在处理链接的文本框和列表组件,类似于组合框或先行组件。我希望能够在文本框中键入自由文本,除非单击列表中的项目,在这种情况下用所选项目的文本覆盖文本框。

这两个组件包含在一个父div中,该div拥有维持选择状态的ratom。 ratom最初为零,但在选择列表项时会更新。我希望只有当ratom的内容不为零时才更新文本框的值,并且当ratom的值为零时不允许自由输入。

不幸的是,这仅适用于list-component的第二次不同点击,之后。即使控制台检查显示其值属性已更新,第一次单击时文本框也不会更新。所以,它看起来像是一个触发渲染的问题。

这里是代码(使用dommy)......

 (defn text-box [selection]
  [:input.jdropbtn
   (into
     {:type        :text
      :placeholder "Dropdown"
      :on-change   #(.log js/console
                          (let [v (-> % .-target .-value)
                                opts (-> % .-target .-nextSibling dom/children array-seq)]
                            ;(doseq [t opts] (dom/toggle! t (clojure.string/includes? (dom/text t) v)))
                            ))}

     (when @selection
       {:value (:value @selection)} )  ; This fails on first selection!

     ; {:value  (:value @selection)} ; This prevents free typing!

     )
   ]
)

(defn list-component [selection data-key items]
  [:div.jdropdown-content

   (for [i items]
     (let [{:keys [id value] :as item} i]
       ^{:key id} [:a {data-key id :on-click #(reset! selection {:id id :value value}) } value])
     )
   ]
)

;;;;;;;;;;;;;;  parent 
(defn my-droplist [data-key items]
  (let [selection (r/atom nil) ]
    (fn []
      [:div.jdropdown {:id "jack"}
       [text-box selection]
       [list-component selection data-key items]
       ])
    ))


    ; invoked as:

[my-droplist :data-appid 
     [{:id 11 :value "Hey there!"}
      {:id 22 :value "Hi there!"}
      {:id 33 :value "Ho there!"}]]

样式与w3schools(http://www.w3schools.com/css/css_dropdowns.asp)的下拉菜单css示例基本相同。

TIA。

1 个答案:

答案 0 :(得分:1)

好的,这都是关于控制的;试剂不喜欢分享。如果我总是从ratom设置文本框的值,并更新ratom on-change,它就可以工作。此外,ratom初始化为空字符串而不是nil。

事情是,每次(正如我原来做的那样)只是解除引用 ratom并没有帮助。似乎我每次都必须 ratom的值到文本框的值。