om & react.js

14
Om & React.js Kamil Toman (@katox)

Upload: kamil-toman

Post on 03-Sep-2014

1.197 views

Category:

Technology


2 download

DESCRIPTION

Introduction to Om and React.js presented at Prague Lambda Meetup. http://www.meetup.com/Lambda-Meetup-Group

TRANSCRIPT

Page 1: Om & React.js

Om & React.jsKamil Toman (@katox)

Page 2: Om & React.js

Is React.js another NiH framework?

➔ Templates are underpowered◆ Low power leads to new DSLs◆ Poor composition

➔ Models are central to UIs◆ View needs to be in sync with its model

➔ Setup bi-di binding and observe changes◆ Observable models encourage mutation◆ Mutation creates additional complexity◆ Can’t use immutable data structures

Page 3: Om & React.js
Page 4: Om & React.js

React.js key features

➔ No templates◆ Component objects

➔ No dirty checking◆ Re-render the whole app on every update◆ Diff the output not DOM

➔ No explicit DOM manipulation◆ Virtual DOM and synthetic events◆ Minimal set of changes computation◆ Batch execution of all updates

Page 5: Om & React.js

Virtual DOM

➔ In-memory data structures➔ Independent of browser’s DOM➔ No string concatenation

➔ Optimised for CPU performance➔ Optimized for memory footprint as well

Page 6: Om & React.js

Reading React JSX (1)<div>inner</div>

<div><span>a</span><span>b</span>

</div>

React.DOM.div({}, ‘inner’);

React.DOM.div({},[ React.DOM.span({},’a’), React.DOM.span({},’b’) ]);

Page 7: Om & React.js

Reading React JSX (2)<div id=”myId”>text</div>

var MyC = React.createClass({/*...*/});var tree = <MyC><span /></MyC>;

React.DOM.div({ id: “myId” },‘text’);

var MyC = React.createClass({/*...*/});var tree = MyC(null, React.DOM.span(null);

Page 8: Om & React.js

Reading Om (1)React.DOM.div(

{ id: “myId” },‘text’);

React.DOM.div({},[ React.DOM.span({},’a’), React.DOM.span({},’b’) ]);

(dom/div #js { :id “myId” } “text”)

(dom/div nil (dom/span nil “a”) (dom/span nil “b”))

Page 9: Om & React.js

Reading Om (2)var CommentBox = React.createClass({ render: function() { return React.DOM.div( {className: "cmBox"}, "I am a CommentBox"); }});

(def CommentBox (js/React.createClass #js {:render (fn [] (this-as this (js/React.DOM.div #js {:className “cmBox”} “I am a CommentBox”))))

Page 10: Om & React.js

Reading Om (3)(def CommentBox (js/React.createClass #js {:render (fn [] (this-as this (js/React.DOM.div #js {:className “cmBox”} “I am a CommentBox”))))

(defn CommentBox [app] (om/component (dom/div #js {:className “cmBox”} “I am a CommentBox”)))

Page 11: Om & React.js

Reading Om (4)(defn CommentBox [app] (om/component (dom/div #js {:className “cmBox”} “I am a CommentBox”)))

(defn CommentBox [app] (reify om/IRender (render [this] (dom/div #js {:className “cmBox”} “I am a CommentBox”)))

Page 12: Om & React.js

Into the Code - Clone Omlab!

https://github.com/katox/omlab

Page 14: Om & React.js

Thanks for your attention!