【问题标题】:How to dispatch an event from an event in re-frame如何从 re-frame 中的事件调度事件
【发布时间】:2017-10-09 16:13:59
【问题描述】:

我遵循了这个例子: https://github.com/Day8/re-frame/blob/master/docs/FAQs/PollADatabaseEvery60.md

这是我的间隔处理程序

(defonce interval-handler
  (fn [{:keys [action id frequency event]}]
    (let [live-intervals (atom {})]
      (condp = action
        :start (swap! live-intervals assoc id (js/setInterval #(re-frame/dispatch event) frequency))
        :end (do (js/clearInterval (get live-intervals id))
                 (swap! live-intervals dissoc id))))))

(re-frame/reg-fx
  :interval
  interval-handler)

我正在尝试从此处的另一个事件中分派此间隔事件:

(re-frame/reg-event-db
  :start-playing
  (fn [db _]
    (re-frame/dispatch [:interval {:action :start
                       :id :some-awesome-id
                       :frequency 1000
                       :event [:tick]}])
    (assoc db :is-playing? true
           :fake (random-active-color db)
           :real (random-active-color db))))

但上面写着re-frame: no :event handler registered for: :interval

这不可能吗?

【问题讨论】:

    标签: clojure clojurescript reagent re-frame


    【解决方案1】:

    :interval 是一个效果,而不是一个事件。要调用效果,您需要将其作为键包含在事件处理程序返回的效果映射中 - 不要使用效果的键发出另一个事件:

    (re-frame/reg-event-fx
      :start-playing
      (fn [{:keys [db]} _]
        {:interval {:action :start
                    :id :some-awesome-id
                    :event [:tick]}]
         :db (assoc db :is-playing? true
                       :fake (random-active-color db)
                       :real (random-active-color db))}))
    

    上面的事件处理程序将返回一个描述两种效果的地图:

    • :db - 将应用数据库更新为新值(作为:db 值提供)

    • :interval - re-frame 将调用您的效果处理程序 (interval-handler),并在效果图中使用 :interval 条目的值

    【讨论】:

    • 您缺少db 作为assoc 的第一个参数。它不会让我编辑它,因为更改太小......
    猜你喜欢
    • 2019-07-18
    • 2021-08-23
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多