This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2023-12-26
Channels
- # announcements (4)
- # babashka (5)
- # beginners (11)
- # clj-kondo (4)
- # clojure-bay-area (1)
- # clojure-dev (8)
- # clojure-europe (4)
- # clojure-norway (10)
- # conjure (2)
- # datomic (12)
- # emacs (3)
- # hyperfiddle (5)
- # jobs-discuss (26)
- # lsp (55)
- # observability (3)
- # overtone (1)
- # portal (5)
- # practicalli (1)
- # sql (11)
- # xtdb (8)
God jul og greier! Nå skal jeg gjøre en @leif.eric.fredheim:
(defn hiccup->dom [old h]
(if (= old h)
old
(if (string? h)
(.createTextNode js/document h)
(let [t (first h)
v (rest h)
old-v (rest old)
e (.createElement js/document (name t))
children (map (fn [x old-x-idx]
(let [h (hiccup->dom (get old-v old-x-idx) x)]
(if-let [child (:e (meta h))]
child
h))) v (range (count v)))]
(doseq [c children]
(.appendChild e c))
(with-meta h {:e e})))))
(def old-hickup (atom nil))
(defn render [root hiccup]
(let [new-hickup (hiccup->dom @old-hickup hiccup)]
(.replaceChildren root (:e (meta new-hickup)))
(reset! old-hickup new-hickup)))
Dette er “maten” i mitt cljs-react thingy. Det håndterer ennå ikke et map som andre parameter i hiccup’en, men det ser ut som om det ikke rerendrer så altfor mye.
Det er veldig skummelt å legge ut noe slikt, fordi det er sånn kode som jeg synes er litt vanskelig å skrive.Litt veldig irr at man ikke kan ha meta på en string i clj(s), fordi hele tilnærmingen min baserer seg på å legge den genererte domnoden som meta på hickup’en.
Videre er tanken at en “komponent” i denne greia her er bare en memoized funksjon.
Jeg håper virkelig at dette er for naivt på en eller annen måte. Det er jo for kjipt hvis man kan implementere react i under 100 linjer (det er jo noe funksjonalitet som gjennstår) cljs.
Jeg tror hovedproblemet med denne tilnærmingen er at du alltid må rerendre fra toppen ned til noden som endrer seg. Jeg tok et tilsvarende utgangspunkt, men inkluderer ikke barna i lilhetssjekken, og har logikk for å hoppe over barna som er like, flytte noder som har flytta seg osv. Selv med en del sånne optimaliseringer kom mitt første forsøk nokså dårlig ut i en benchmark. Skal se litt mer på det ved anledning.