是否可以创建一个没有无限循环的异步重置的组件本地原子?
Is it possible to create a component-local atom being asynchronously reset without an infinite loop?
我想创建一个试剂组件,其内容已被 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)))
一个 "global" 原子将起作用,因为它不会在每次重新渲染时重新创建:
(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
是唯一可能的解决方案,还是有办法用局部原子解决这个问题?
我相信如果你使用第二种形式的试剂视图,它应该不会自动触发:
(defn page []
(let [data (get-data)]
(fn []
[:div @data])))
如果视图函数 returns 函数,则该函数成为 React 组件的 render
函数。否则视图函数本身变成 render
.
我想创建一个试剂组件,其内容已被 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)))
一个 "global" 原子将起作用,因为它不会在每次重新渲染时重新创建:
(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
是唯一可能的解决方案,还是有办法用局部原子解决这个问题?
我相信如果你使用第二种形式的试剂视图,它应该不会自动触发:
(defn page []
(let [data (get-data)]
(fn []
[:div @data])))
如果视图函数 returns 函数,则该函数成为 React 组件的 render
函数。否则视图函数本身变成 render
.