Я предпочитаю передавать ратом компоненту. Re-frame становится популярным https://github.com/Day8/re-frame
Передача ратома не делает вашу функцию более чистой, атом все еще может иметь побочные эффекты. Это делает ваши компоненты более гибкими и пригодными для повторного использования, поскольку они определяют свои зависимости.
Это не влияет на повторную визуализацию напрямую, ссылаетесь ли вы на глобальную базу данных или переданную в базе данных. Сигнальный граф того, когда рендерить, строится из вхождений deref внутри вектора, который не заботится о том, откуда берется ратом. Однако вы можете быть более эффективными, создавая реакции.
(defn my-component []
(let [x (reaction (:x @db)]
(fn []
[:div @x]))
Этот компонент будет перерисовываться только при изменении :x (а не при изменении чего-либо в db. Создание реакций может стать утомительным, что является одной из привлекательных сторон re-frame.
(ns whip.view.reactions
(:require [reagent.core :as reagent]
[devcards.core :refer-macros [defcard-rg deftest]])
(:require-macros [reagent.ratom :refer [reaction]]))
(def a (reagent/atom {:x 100 :y 200})) (def b (reaction (:x @a)))
(def c (reaction (+ @b 10)))
(defn view-c []
(prn "Rendering view-c") [:div
[:div @c]
[:button {:on-click (fn [e] (swap! a update :x inc))} "inc x"]
[:button {:on-click (fn [e] (swap! a update :y inc))} "inc y"]])
(defcard-rg reaction-example [view-c])
Реакции — это очень лаконичный способ выразить поток данных. Здесь вы начинаете с ratom, содержащего значения x и y. Затем вы строите реакцию b, которая наблюдает только за значением x. Затем введите еще одну реакцию c, которая наблюдает за суммой b и 10. Затем создайте компонент, который реактивно визуализирует c. Обратите внимание, что когда вы нажимаете кнопку «inc x», представление обновляется с результатом применения выражений. При нажатии кнопки «inc y» ничего не происходит. Проверьте консоль, чтобы убедиться, что сообщение «Rendering view-c» печатается только при нажатии «inc x». Это очень хорошо, потому что представление никак не зависит от y. Если бы вы разыграли a вместо c в представлении, оно было бы перерисовано, даже если y изменилось. Реагент реагирует на реакции и ратомы через requestAnimationFrame. Таким образом, изменение многих ратомов и зависимых от них реакций приводит только к одной фазе рендеринга.
person
Timothy Pratley
schedule
11.07.2016