10

我正在从我的 Reagent 应用程序中执行 Ajax GET,以从数据库中加载一些内容。

我不完全确定将这种 ajax 调用结果获取到我的页面的最佳方法是什么,考虑到如果我将它放在一个原子中,那么 Reagent 会在取消引用原子时自动重新渲染一个组件,这意味着我得到一个无限的ajax调用序列。

对于一些代码,

(def matches (atom nil))

(defn render-matches [ms]
  (reset! matches (into [:ul] (map (fn [m] ^{:key m}[:li m])
                                   (walk/keywordize-keys (t/read (t/reader :json) ms)))))

这个函数基本上创建了一个[:ul [:li "Stuff here"] [:li "And here"]]

我想在我的页面上显示,现在有以下代码。

(defn standings-page []
  (GET "/list-matches"
       {:handler render-matches})
  @matches)
4

1 回答 1

12

我认为最好只将数据保存在原子中并生成 HTML 作为组件逻辑的一部分。

此外,最好在渲染阶段之外触发 AJAX 调用,例如,在组件挂载之前,或者作为事件的结果(例如单击按钮)。

像这样:

(def matches (atom nil))
(defn component []
  (let [get-stuff (fn [] (GET "/..." :handler (fn [response] 
                           (reset! matches (:body response))))]
    (get-stuff) <-- called before component mount
    (fn []
      [:ul
        (for [m match]
          ^{:key ...} 
          [:li ...])])))

这在本文中称为 form-2 。

于 2015-05-09T07:13:49.997 回答