Как сделать dom-компоненты в реагенте асинхронно? - PullRequest
1 голос
/ 29 февраля 2020

Я делаю http-запрос и пытаюсь поместить возвращенный val в компонент реагента следующим образом:

[div
    (a/take! (http/get "http://localhost:5000/data"))
             #(into [:div]
                     (map render-method
                          (into [] (map (fn [res] (:name res)) (-> % :body :results))))

                     )
                )
]

Но это, понятно, не работает, потому что a / take! Сам не возвращает компонент. Так как же заставить асин c запрос на получение работать с реагентом?

1 Ответ

1 голос
/ 01 марта 2020

Вы не можете сделать это. Вместо этого вам нужно сохранить результат в атоме, и реагент будет перерисован для вас после загрузки.

(def data (reagent/atom nil))

(defn fetch-data []
  (take! (http/get "http://localhost:5000/data") #(reset! data %)))

(defn names-list []
  [:div
   (doall (map :name @data))])

(defn my-component []
  [:div
   (if @data
     [names-list]
     [:div "loading"])])
...