アプリ全体の状態を持つこと
ClojureScriptをちょこちょこ使っています。最近はもっぱらcore.asyncとかFRPとかでアプリケーションを作っていたんですが、PastaやWebFUIでやっていた、"アプリ全体の状態を更新する関数と、状態からUIを作る手続き"という仕組みが恋しくなっています。
この仕組みを最小限で実現するために1つのマクロと1つの関数を書きました。
https://github.com/ympbyc/pasta-cljs
(def app (atom {:page 0})) (deftransition next-page [{:keys [page]}] {:page (inc page)}) (deftransition page-to [_ n] {:page n}) (watch-transition app :page (fn [{:keys [page]} _old] ;;ページきりかえを描画 )) (.on (js/jQuery js/document) "click" ".next-page-btn" #(next-page app)) (.on (js/jQuery js/document) "click" ".pager-link" #(page-to app (read-string (.getAttribute (.-target %) "data-page-num"))))
状態のマップからUIを完全に復元できるようにするのが重要。
watch-transitionの中でdomをちまちまいじるのが面倒ならappにadd-watchしてcastorocauda.core/update-domとかやっちゃうのもあり。