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 に答える