是否可以创建一个局部局部原子,而该原子可以无限循环地进行异步复位?

时间:2018-09-08 20:45:06

标签: ajax clojurescript reagent

我想创建一个试剂组件,该组件的内容由ajax请求的处理程序更改。使用局部原子会产生无限循环GET,从而浪费资源并更新原子,从而触发组件的重新渲染。

示例:

(ns example
  (:require
    [reagent.core :as r]
    [ajax.core :refer [GET POST]]))

(defn get-data []
  (let [ret (r/atom "")]
    (GET "/ajax/" {:handler (partial reset! ret)})
    ret))

(defn page []
  (let [data @(get-data)]
    [:div data]))

(defn init! []
  (r/render [#'page] (.-body js/document)))

“全局”原子将起作用,因为不会在每次重新渲染时都重新创建它:

(ns example
  (:require
    [reagent.core :as r]
    [ajax.core :refer [GET POST]]))

(def global-atom (r/atom ""))
(defn get-data []
  (let [ret global-atom]
    (GET "/ajax/" {:handler (partial reset! ret)})
    ret))

(defn page []
  (let [data @(get-data)]
    [:div data]))

(defn init! []
  (r/render [#'page] (.-body js/document)))

全局def是唯一可行的解​​决方案,还是有办法解决局部原子的问题?

1 个答案:

答案 0 :(得分:1)

我相信,如果您使用试剂视图的第二种形式,它不应触发自身:

(defn page []
  (let [data (get-data)]
    (fn []
      [:div @data])))

如果视图函数返回一个函数,则该函数将成为React组件的render函数。否则,视图函数本身将变为render