【问题标题】:clojurescript/reagent for function doesn't workclojurescript/reagent for function 不起作用
【发布时间】:2016-06-02 12:25:07
【问题描述】:

我最近为我的 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 函数不起作用,或者说试剂不是那样起作用的?有人有建议吗?

我很不擅长这个。

【问题讨论】:

    标签: clojure clojurescript reagent re-frame


    【解决方案1】:

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

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

    【讨论】:

    • 成功了!我明白了,所以渲染有副作用!非常感谢!
    【解决方案2】:

    另一个选项可能是强制 for 返回的lazyseq:

     (doall (for [i (range 2)]....  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多