Я хочу создать список элементов html (включая результаты запроса), которые по умолчанию скрыты, но пользователь может переключить это состояние. Я попробовал пару различных способов ниже, как примеры игрушек, но не могу заставить их работать.Интерактивный список в реагенте
Этот код правильно создает три кнопки, которые правильно изменяют состояние exps, но которые никогда не скрывают контент.
(:require [reagent.core :as r])
(def exps (r/atom [true true true]))
(defn like-component []
[:div
(for [ [i r] (map-indexed vector ["A" "B" "C"])]
[:div
[:button {:on-click #(swap! exps update-in [i] not)}]
(when (nth @exps i)
[:pre (str i r)])])])
(r/render [like-component]
(js/document.getElementById "app"))
С другой стороны, приведенный ниже код создаст только один элемент, но он будет работать правильно.
(defn expandable-view [e bool]
(let [expanded (r/atom bool)]
(fn []
[:li
[:div.expandable
[:div.header {:on-click #(swap! expanded not)}
"Click me to expand and collapse"]
(if @expanded
[:div.body (allow-html :pre e)])]])))
(defn like-component []
[:ul
(vec
(for [ e ["A" "B" "C"]]
(expandable-view e true))) ])
(r/render [like-component]
(js/document.getElementById "app"))
Редактировать: Возможно, связанные с: https://github.com/reagent-project/reagent/wiki/Beware-Event-Handlers-Returning-False
Да, снова ланти снова! На самом деле было предупреждение об этом, напечатанном на моей консоли javascript, но я пропустил его между некоторыми уникальными ключевыми ошибками (которые также были легко исправить). Я просто завернул первый пример в 'doall', любую идею, почему второй блок, который я разместил, создает только один элемент? – wovenhead