首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojurescript使用Reagent,插入组件函数会使组件不断地重新呈现随机生成的道具

Clojurescript使用Reagent,插入组件函数会使组件不断地重新呈现随机生成的道具
EN

Stack Overflow用户
提问于 2020-07-08 07:37:17
回答 1查看 139关注 0票数 0

我有一个带有规范的Reagent组件,并尝试在开发过程中对其进行检测以验证属性:

代码语言:javascript
复制
(ns generic-components.numeric-input.view
  (:require
   [reagent.core :as r]
   [clojure.spec.alpha :as s]

   [clojure.test.check.generators]
   [clojure.test.check.properties]
   [clojure.test.check]
   [clojure.spec.test.alpha :as stest]
   ))

(s/def ::input-attr map?)
(s/def ::message-attr map?)

(s/def ::placeholder string?)

(s/def ::display-value string?)
(s/def ::message string?)
(s/def ::is-valid boolean?)
(s/def ::is-disabled boolean?)

(s/def ::handle-change
  (s/fspec
   :args (s/cat :val (s/or :string string? :nil nil?))
   :ret any?))

(s/def ::handle-blur
  (s/fspec
   :args (s/cat :val (s/or :string string? :nil nil?))
   :ret any?))

(s/def ::props (s/keys :req-un [::display-value
                                ::is-valid
                                ::handle-blur
                                ::handle-change]
                       :opt-un [::input-attr
                                ::message-attr
                                ::message
                                ::placeholder
                                ::is-disabled]))

(defn numeric-input [props]
  (println props)
  [:<>
   [:input (merge
            (:input-attr props)
            (select-keys props [:placeholder])
            {:class (r/class-names [(-> props :input-attr :class)
                                    (when
                                     (= false (:is-valid props))
                                      "invalid")])
             :value (:display-value props)
             :on-change #((:handle-change props) (-> % .-target .-value))
             :on-blur #((:handle-blur props) (-> % .-target .-value))}
            (when (::is-disabled props) {:disabled true}))]
   (when-let [message (:message props)]
     [:div (:message-attr props) message])])

(s/fdef numeric-input
  :args (s/cat :props ::props)
  :ret any?)

(stest/instrument `numeric-input)

我将其呈现如下:

代码语言:javascript
复制
(defn root []
  (let [input-val (r/atom "dv")]
    (fn [] [:div#app-root
     [:div.main-logo "Welcome to Crazy Ivan Motors"]
     [:div.screens
      [numeric-input {:display-value (or @input-val "") 
                      :is-valid true
                      :handle-change #(reset! input-val %)
                      :handle-blur #(reset! input-val %)}]]])))

当我打开页面时,我要么得到异常,要么页面呈现,但随后组件开始以尽可能快的速度使用随机字符串重新呈现。以下是道具的console.log输出(我每秒收到几十个):

代码语言:javascript
复制
{:display-value 5iMJEW6wq587mS2s, :is-valid true, :handle-change #object[Function], :handle-blur #object[Function]} core.cljs:198:60
{:display-value , :is-valid true, :handle-change #object[Function], :handle-blur #object[Function]} 2 core.cljs:198:60
{:display-value PR2JMw9G6UJ, :is-valid true, :handle-change #object[Function], :handle-blur #object[Function]} core.cljs:198:60

我知道spec的生成功能,但我不明白,为什么/如何在这种情况下激活它们?

EN

回答 1

Stack Overflow用户

发布于 2020-07-08 16:58:52

显然,问题是由以下原因引起的:

代码语言:javascript
复制
(s/def ::handle-change
  (s/fspec
   :args (s/cat :val (s/or :string string? :nil nil?))
   :ret any?))

(s/def ::handle-blur
  (s/fspec
   :args (s/cat :val (s/or :string string? :nil nil?))
   :ret any?))

看起来,在测试包含映射时,为映射密钥设置fspec会导致valid?通过生成来测试该密钥。切换到

代码语言:javascript
复制
(s/def ::handle-change fn?)
(s/def ::handle-blur fn?)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62785391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档