Можно ли создать компонент локального атома, сбрасываемый асинхронно без бесконечного цикла? - PullRequest
0 голосов
/ 08 сентября 2018

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

Я считаю, что если вы используете вторую форму представления реагента, она не должна срабатывать сама по себе:

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

Если функция представления возвращает функцию, эта функция становится функцией render компонента React. В противном случае сама функция просмотра становится render.

...