Это решение, специфичное для перекадровки. Я бы предложил использовать app-db
для хранения состояния, handler
для изменения состояния и sub
для получения текущего значения. README от Re-frame - отличный ресурс для изучения этой установки: https://github.com/Day8/re-frame
Прямые изменения в DOM будут переопределены при повторном кадре, когда он сочтет нужным (именно поэтому ваш исходный код был возвращен к исходному определению компонента).
Настройка сабов / обработчиков
Вы можете создать handler
следующим образом:
(re-frame.core/reg-event-fx
:handlers/enable-search-results
(fn [{:keys [db]} _]
{:db (assoc db :show-search-results? true})
И sub
для получения значения:
(re-frame.core/reg-sub
:subs/show-search-results?
(fn [db]
(:show-search-results? db))
Обновить код для использования подпрограмм / обработчиков
Теперь обновите кнопку поиска, чтобы отправить handler
:
[:button
{:on-click #(re-frame.core/dispatch [:handlers/enable-search-results])}
"Click to show search results"]
И обновите свой div результатов поиска, чтобы он был видимым / скрытым на основе sub
:
(let [show-search-results? @(re-frame.core/subscribe [:subs/show-search-results?])]
[:div {:style {:display (if show-search-results? "visible" "none"}
:id "db-search-result-tables"
:class "db-search-results-table"}
[table-to-display]])
С другой стороны:
(let [show-search-results? @(re-frame.core/subscribe [:subs/show-search-results?])]
(when show-search-results?
[:div {:id "db-search-result-tables"
:class "db-search-results-table"}
[table-to-display]]))
Поскольку состояние app-db
является постоянным, именно здесь «мутации» можно безопасно контролировать.