【发布时间】:2018-02-25 10:36:47
【问题描述】:
我正在尝试格式化输入“文本”试剂组件的值,但没有成功。我预计,在更改了随机变量的值之后,组件的值将在重新渲染时被格式化。 我使用 cl-format 格式化带有千位分隔符的数字。我在第一次加载时效果很好,但在更改价格值之后就不行了。
是否可以在保存新值后格式化本示例的价格值?
(ns shopping.app
(:require [reagent.core :as r]
[cljs.pprint :refer [cl-format]]))
(defonce shoppinglist (r/atom (sorted-map
1 {:id 1 :name "Bread" :price 20},
2 {:id 2 :name "Milk" :price 12})))
(defn update-item! [fn & args]
(apply swap! shoppinglist fn args))
(defn shopping-item [{:keys [id name price]} item]
(let [rreadonly (r/atom true)
rprice (r/atom price)]
(fn [{:keys [id name price]} item]
[:div
[:label id]
[:label (str " | " name)]
[:input { :type "text"
:readOnly @rreadonly
:value (cl-format nil "~,,' :d" @rprice)
:on-change #(reset! rprice (-> % .-target .-value))}]
[:button { :id "button-edit"
:hidden (not @rreadonly)
:on-click #(swap! rreadonly not)}
"Edit"]
[:button { :id "button-delete"
:hidden (not @rreadonly)
:on-click #(update-item! dissoc id)}
"Delete"]
[:button { :id "button-save"
:hidden @rreadonly
:on-click #(do
(update-item! assoc id (assoc {} :id id :name name :price (js/parseInt @rprice)))
(swap! rreadonly not))}
"Save"]
[:button { :id "button-reset"
:hidden @rreadonly
:on-click #(do (reset! rprice price)
(update-item! assoc id (assoc {} :id id :name name :price (js/parseInt @rprice)))
(swap! rreadonly not))}
"Reset"]])))
(defn shopping-list []
[:div.container
(doall (for [item (vals @shoppinglist)]
^{:key (:id item)} [:div
[shopping-item item]]))])
(defn init
"Initialize components."
[]
(let [container (.getElementById js/document "container")]
(r/render-component
[shopping-list]
container)))
【问题讨论】:
标签: text input format clojurescript reagent