gpt4 book ai didi

ClojureScript。发生重新渲染时重置试剂中的原子

转载 作者:行者123 更新时间:2023-12-04 10:49:52 24 4
gpt4 key购买 nike

我正在为测验显示一组问题,并且我正在为每个问题分配一个数字,以便在浏览器中显示它们时对其进行编号:

(defn questions-list
[]
(let [counter (atom 0)]
(fn []
(into [:section]
(for [question @(re-frame/subscribe [:questions])]
[display-question (assoc question :counter (swap! counter inc))])))))

问题在于,当有人在浏览器中编辑问题时(调用调度并更新“app-db”映射),组件会重新渲染,但原子“计数器”在逻辑上从最后一个数字开始,而不是从零开始.所以我需要重置原子,但我不知道在哪里。我尝试在匿名函数中使用 let ,但没有用。

最佳答案

在这种情况下,我只是完全删除状态。我还没有测试过这段代码,但你的想法在这里势在必行。您尝试做的功能版本类似于:
贫穷但无国籍:

(let [numbers (range 0 (count questions))
indexed (map #(assoc (nth questions %) :index %) questions)]
[:section
(for [question indexed]
[display-question question])])

但这很丑陋,而且 nth 效率低下。所以让我们尝试一个更好的。结果证明 map 可以采用多个集合作为参数。
(let [numbers (range 0 (count questions))
indexed (map (fn [idx question] (assoc question :index idx)) questions)]
[:section
(for [question indexed]
[display-question question])])

但更好的是,事实证明有一个内置函数正是为此。我实际上会写什么:
[:section
(doall
(map-indexed
(fn [idx question]
[display-question (assoc question :index idx)])
questions))]

注意:这些代码实际上都没有运行过,所以你可能需要在它工作之前稍微调整一下。我建议在 ClojureDocs 中查找所有函数以确保您了解他们的工作。

关于ClojureScript。发生重新渲染时重置试剂中的原子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59537884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com