Я хочу создать компонент реагента, содержимое которого изменяется обработчиком запроса 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
единственно возможным решением или есть способ решить эту проблему с локальным атомом?