Skip to content

re-frame.fresco.substrate

Use this namespace to run a Fresco app on Fresco's own substrate adapter. It provides the adapter you pass to rf/init! at boot, before anything mounts; with it, a Fresco app depends on core and Fresco alone, instead of adding a Reagent or UIx adapter just for its reactive container.

It ships in day8/re-frame2-fresco as an optional namespace: nothing else in Fresco requires it, so a build that installs Reagent or UIx instead carries none of it, and re-frame.fresco does not re-export it. It is ClojureScript only; the namespace does not exist on the JVM.

(:require [re-frame.core :as rf]
          [re-frame.fresco :as h]
          [re-frame.fresco.substrate :as substrate])
(rf/init! substrate/adapter)

(defonce app-root (h/client-root))

(h/render! app-root [h/frame-root {:id :rf/default} [app]]
           (js/document.getElementById "app"))

Fresco renders through react-dom/client and interprets its own hiccup, so it needs no renderer from an adapter. What the adapter supplies is the reactive half: the container app-db lives in, and derived values that notify when it changes.

Reagent and UIx adapters also work under a Fresco tree, because every React adapter writes the same frame context. An app that already installs one for its other views runs its Fresco views on it and needs no second adapter. Installation teaches the boot line, and Use UIx lists the other adapters and their coordinates.

Adapter spec

adapter

  • Kind: var (map)
  • Signature:
    {:kind                      :rf.adapter/fresco
     :make-state-container      …
     :read-container            …
     :replace-container!        …
     :subscribe-container       …
     :make-derived-value        …
     :render                    …
     :render-to-string          …
     :register-context-provider …
     :flush-render!             …
     :dispose-adapter!          …}
    
  • Description: The adapter map you pass to rf/init! to install Fresco's own adapter as the substrate; (:kind (rf/current-adapter)) reads :rf.adapter/fresco. Install it before the first frame exists.
    • Installation is explicit; there is no default adapter.
    • Mounting a frame-root, or making any frame, before rf/init! throws :rf.error/no-adapter-installed; after rf/destroy-adapter! it throws :rf.error/adapter-disposed until rf/init! installs an adapter again.
    • Its derived values notify watchers from the moment they are created, and recompute once per epoch however many watchers they have. The headless re-frame.substrate.plain-atom adapter's derived values take a watch too, so a Fresco view under it also re-renders, but they recompute for each observer inside every write: that adapter is built for headless tests and SSR.
    • It adds no dependency: Fresco already requires react, and the rest of the adapter is in core.
  • Example:
    (rf/init! substrate/adapter)   ;; install the substrate once, at boot
    

See also