2016-06-02 5 views
2

Im недавно с использованием реагента и Перекадрируйте для моего clojurescript проекта и у меня есть проблема: Поэтому у меня есть HTML пользовательских тегиclojurescript/реагент для функции не работает

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

И я хочу, чтобы поменять их местами в мой реагентных сгенерированный HTML, используя cljs для функции

(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)))) 

Но это не работает, я попытался проверить это, не используя для функции от

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

и он отлично работал только с одним тегом.

И я не знаю, почему функция for не работает, или реагент не работает таким образом? У кого-нибудь есть предложение?

Я очень нуб на этом.

ответ

5

for создает ленивую последовательность, что означает, что ни одна из работ по оценке последовательности не выполняется до тех пор, пока она не потребуется. Вы не можете использовать ленивые последовательности для принудительных побочных эффектов, так как они никогда не будут оценены (render - одно из таких мест). Чтобы усилить побочные эффекты, вы должны, вероятно, заменить его на doseq. И в вашем случае dotimes, вероятно, будет лучше:

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

Это сработало! я вижу, так что визуализируйте эти побочные эффекты! Большое спасибо! –

Смежные вопросы