首页 > 解决方案 > 是否可以在没有无限循环的情况下创建异步重置的组件局部原子?

问题描述

我想创建一个包含由 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是唯一可能的解决方案,还是有办法用局部原子解决这个问题?

标签: ajaxclojurescriptreagent

解决方案


我相信如果你使用第二种形式的试剂视图,它应该不会自行触发:

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

如果视图函数返回一个函数,则该函数将成为renderReact 组件的函数。否则视图函数本身变为render.


推荐阅读