ajax - 是否可以在没有无限循环的情况下创建异步重置的组件局部原子?
问题描述
我想创建一个包含由 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
是唯一可能的解决方案,还是有办法用局部原子解决这个问题?
解决方案
我相信如果你使用第二种形式的试剂视图,它应该不会自行触发:
(defn page []
(let [data (get-data)]
(fn []
[:div @data])))
如果视图函数返回一个函数,则该函数将成为render
React 组件的函数。否则视图函数本身变为render
.
推荐阅读
- python - 有没有更好的方法在 python 中编写这个代码段?
- python-3.x - 如何正确继承类方法
- package - atom包安装程序出错,显示搜索失败
- java - 字符串和枚举类型变量的复合主键
- javascript - 如何在 React 函数 Return() 中设置 if-else 语句?
- sql - 如何从 IF ELSE 存储过程中的表中选择多个列
- kubernetes - 我想用用户名和密码在 Kubernetes 中创建一个用户。我尝试使用谷歌搜索,但只能找到使用证书密钥创建用户
- javascript - Vue 在与窗口宽度相关的条件下表现得很奇怪
- azure - 使用 Azure FrontDoor 按比例平衡 2 个 API 终结点
- docker - 使用 Github Actions 将 docker 镜像从 Github 注册表部署到 Digital Ocean droplet