mirror of https://github.com/status-im/reagent.git
Explain binary clock demo
This commit is contained in:
parent
b8ffbb8dd2
commit
c39378bb79
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
(defn main []
|
(defn main []
|
||||||
[:div
|
[:div
|
||||||
|
[title "Reagent news"]
|
||||||
[clock/main {:summary true}]
|
[clock/main {:summary true}]
|
||||||
[anyargs/main {:summary true}]
|
[anyargs/main {:summary true}]
|
||||||
[async/main {:summary true}]
|
[async/main {:summary true}]
|
||||||
|
|
|
@ -45,6 +45,6 @@
|
||||||
(let [{:keys [time show-100s]} @clock-state]
|
(let [{:keys [time show-100s]} @clock-state]
|
||||||
(if show-100s
|
(if show-100s
|
||||||
(r/next-tick update-time)
|
(r/next-tick update-time)
|
||||||
(js/setTimeout update-time 333))
|
(js/setTimeout update-time 1000))
|
||||||
[clock time show-100s
|
[clock time show-100s
|
||||||
#(swap! clock-state update-in [:show-100s] not)]))
|
#(swap! clock-state update-in [:show-100s] not)]))
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
(ns reagentdemo.news.clockpost
|
(ns reagentdemo.news.clockpost
|
||||||
(:require [reagent.core :as r :refer [atom]]
|
(:require [reagent.core :as r :refer [atom]]
|
||||||
[reagent.debug :refer-macros [dbg println]]
|
[reagent.debug :refer-macros [dbg]]
|
||||||
[reagentdemo.syntax :refer-macros [get-source]]
|
[reagentdemo.syntax :refer-macros [get-source]]
|
||||||
[reagentdemo.page :refer [title link page-map]]
|
[reagentdemo.page :refer [title link page-map]]
|
||||||
[reagentdemo.common :as common :refer [demo-component]]
|
[reagentdemo.common :as common :refer [demo-component]]
|
||||||
|
@ -15,7 +15,11 @@
|
||||||
:no-heading true}])
|
:no-heading true}])
|
||||||
|
|
||||||
(defn main [{:keys [summary]}]
|
(defn main [{:keys [summary]}]
|
||||||
(let [head "Binary clock"]
|
(let [head "A binary clock"
|
||||||
|
lexclock {:href "http://www.lexicallyscoped.com/2014/01/23/clojurescript-react-om-binary-clock.html"}
|
||||||
|
hopclock {:href "http://pmbauer.github.io/2014/01/27/hoplon-binary-clock/"}
|
||||||
|
om {:href "https://github.com/swannodette/om"}
|
||||||
|
hoplon {:href "http://hoplon.io"}]
|
||||||
|
|
||||||
[:div.reagent-demo
|
[:div.reagent-demo
|
||||||
[:h1 [link {:href main} head]]
|
[:h1 [link {:href main} head]]
|
||||||
|
@ -24,21 +28,26 @@
|
||||||
|
|
||||||
(when-not summary
|
(when-not summary
|
||||||
[:div
|
[:div
|
||||||
;; [demo-component {:comp binaryclock/main}]
|
[:div.clearfix
|
||||||
[binaryclock/main]
|
[binaryclock/main]]
|
||||||
[:p [:strong "Click to toggle 1/100th seconds."]]])
|
[:div [:strong "Click to toggle 1/100th seconds."]]])
|
||||||
|
|
||||||
[:h2 "A simple binary clock in Reagent"]
|
[:p "Fredrik Dyrkell wrote a very nice " [:a lexclock "binary
|
||||||
|
clock"] " using " [:a om "Om"] ". I thought I’d replicate that
|
||||||
|
using Reagent for fun (another re-write, using " [:a
|
||||||
|
hoplon "Hoplon"] ", can be seen " [:a hopclock "here"] ")."]
|
||||||
|
|
||||||
[:p "some text"]
|
[:p "So, without further ado, here is a binary clock using Reagent."]
|
||||||
|
|
||||||
(if summary
|
(if summary
|
||||||
[link {:href main
|
[link {:href main
|
||||||
:class 'news-read-more} "Read more"]
|
:class 'news-read-more} "Read more"]
|
||||||
[:div.demo-text
|
[:div.demo-text
|
||||||
|
|
||||||
|
[fn-src :nsr]
|
||||||
|
|
||||||
[:p "We start with the basics: The clock is built out of
|
[:p "We start with the basics: The clock is built out of
|
||||||
cells, that are light or dark if the bit they correspond to
|
cells, with a light colour if the bit the cell corresponds to
|
||||||
is set."]
|
is set."]
|
||||||
|
|
||||||
[fn-src :cell]
|
[fn-src :cell]
|
||||||
|
@ -68,9 +77,42 @@
|
||||||
|
|
||||||
[fn-src :clock-state :update-time]
|
[fn-src :clock-state :update-time]
|
||||||
|
|
||||||
[:p "And finally we use the clock component like this:"]
|
[:p "And finally we use the " [:code "clock"] " component.
|
||||||
|
The current time is scheduled to be updated, after a suitable
|
||||||
|
delay, every time the main component is rendered ("
|
||||||
|
[:code "reagent.core/next-tick"] " is just a front for "
|
||||||
|
[:code "requestAnimationFrame"] "):"]
|
||||||
|
|
||||||
[fn-src :main]])]]))
|
[fn-src :main]
|
||||||
|
|
||||||
|
[:h2 "How it all works"]
|
||||||
|
|
||||||
|
[:p "Reading through the source, it may look like the entire
|
||||||
|
clock component is recreated from scratch whenever the time
|
||||||
|
changes. "]
|
||||||
|
|
||||||
|
[:p "That is an illusion: Reagent and React together
|
||||||
|
makes sure that only the parts of the DOM that actually need
|
||||||
|
to change are updated. For example, the "
|
||||||
|
[:code "column-pair"] " function corresponding to hours only
|
||||||
|
runs once every hour."]
|
||||||
|
|
||||||
|
[:p "And that’s what makes Reagent and React fast. Try
|
||||||
|
clicking on the clock to toggle the display of 1/100th
|
||||||
|
seconds. Most browsers should have no trouble at all keeping
|
||||||
|
up (even if they won’t actually show every 1/100th second:
|
||||||
|
they are typically limited to roughly 60 fps)."]
|
||||||
|
|
||||||
|
[:p "But it is a very handy illusion. Almost the entire UI is
|
||||||
|
made up of pure functions, transforming immutable data into
|
||||||
|
other immutable data structures. That makes them easy to
|
||||||
|
reason about, and trivial to test. You don’t have to care
|
||||||
|
about ”model objects”, or about how to update the DOM
|
||||||
|
efficiently. "]
|
||||||
|
|
||||||
|
[:p "Just pass arguments to component functions, return a UI
|
||||||
|
description that corresponds to those arguments, and leave it
|
||||||
|
to React to actually display that UI."]])]]))
|
||||||
|
|
||||||
(swap! page-map assoc
|
(swap! page-map assoc
|
||||||
"news/binary-clock.html" main)
|
"news/binary-clock.html" main)
|
||||||
|
|
Loading…
Reference in New Issue