4

我最近为我的 clojurescript 项目使用了试剂和重新框架,但我遇到了一个问题:所以我有 html 自定义标签

<question id="1"></question>
<question id="2"></question>

我想使用 cljs 将它们交换到我的试剂生成的 html 中

(defn mypanel []
 [:p "Hi!"])

(let [q (.getElementsByTagName js/document "question")]
  (for [i (range 2)]
    ^{:keys i}
    (reagent/render [mypanel]
                  (aget (.getElementsByTagName js/document "question") i))))

但它不起作用,我尝试在不使用 for 函数的情况下对其进行测试

(reagent/render [mypanel]
     (aget (.getElementsByTagName js/document "question") 0))

它只用一个标签就可以正常工作。

而且我不知道为什么 for 功能不起作用,或者试剂不起作用?有人有建议吗?

我对此很菜鸟。

4

2 回答 2

7

for产生一个惰性序列,这意味着在需要之前不会完成任何评估序列的工作。您不能使用惰性序列来强制产生副作用,因为它们永远不会被评估(render就是这样一个地方)。要强制产生副作用,您可能应该将其替换为doseq. 在你的情况下dotimes可能会更好:

(let [q (.getElementsByTagName js/document "question")]
  (dotimes [i 2]
    ^{:keys i}
    (reagent/render [mypanel]
                  (aget (.getElementsByTagName js/document "question") i))))
于 2016-06-02T12:34:03.133 回答
0

另一种选择可能是强制 for 返回的lazyseq

 (doall (for [i (range 2)]....  
于 2020-02-11T20:22:24.820 回答