Slide 1

Slide 1 text

React.js͕
 ͳͥૉ੖Β͍͠ͷ͔ Yuichiro MASUI Toreta, Inc CTO

Slide 2

Slide 2 text

DOMૢ࡞͸ͳͥ೉͍͠ͷ͔
foo
͜ͷλά͸ݟ͑ͯΔʁ ௥Ճ Ͳ͜Ͱॲཧ͢Δ͔
 ෼͔Βͳ͍
foo
͍ͭͲ͜Ͱॻ͖׵͑Δͷ͔
 ෼͔Βͳ͍

Slide 3

Slide 3 text

DOMૢ࡞͸ͳͥ೉͍͠ͷ͔
foo
͜ͷλά͸ݟ͑ͯΔʁ ௥Ճ Ͳ͜Ͱॲཧ͢Δ͔
 ෼͔Βͳ͍
foo
͍ͭͲ͜Ͱॻ͖׵͑Δͷ͔
 ෼͔Βͳ͍ DOM͸Ͳ͔͜ΒͰ΋มߋՄೳ DOM͕ঢ়ଶΛ͍࣋ͬͯΔ DOMͱίʔυ͕཭Ε͗͢

Slide 4

Slide 4 text

΋ͬͱ؆୯ʹ΍Ζ͏ DOMΛॻ͖׵͑ͳ͍ͰৗʹHTMLશମΛੜ੒ EventListenerΛ΍ΊͯonXxxϓϩύςΟΛ࢖͏ HTMLͱJavascriptΛҰͭʹ·ͱΊΔ

Slide 5

Slide 5 text

ΫϥΠΞϯτϩδοΫ αʔόαΠυੜ੒ ϒϥ΢β ϩδοΫ (ίϯτϩʔϥ) ϦΫΤετ αʔό ΫϥΠΞϯτ HTMLੜ੒෦ (render) HTMLੜ੒෦ (ςϯϓϨʔτ) ը໘Λදࣔ͢ΔͨΊͷঢ়ଶ (setState) ը໘Λදࣔ͢ΔͨΊͷঢ়ଶ (ςϯϓϨʔτม਺)

Slide 6

Slide 6 text

ΫϥΠΞϯτϩδοΫ ϒϥ΢β αʔό ΫϥΠΞϯτ Πϕϯτ (onSubmit) React.js αʔόϩδοΫ HTMLੜ੒෦ (render) ը໘Λදࣔ͢ΔͨΊͷঢ়ଶ (setState)

Slide 7

Slide 7 text

Example: Todo list http://codepen.io/masuidrive

Slide 8

Slide 8 text

P.1 - ഑ྻͷΞΠςϜΛදࣔ

Slide 9

Slide 9 text

/** @jsx React.DOM */ App = React.createClass({ getInitialState: function() { return { items: [ { text: "Foo" }, { text: "Bar" }, { text: "Buzz" } ] }; }, render: function() { return
{this.state.items.map(function(item) { return
{item.text}
; })}
; } }); React.render(, document.body); P.1 - ഑ྻͷΞΠςϜΛදࣔ

Slide 10

Slide 10 text

P.2 - ΞΠςϜΛ௥Ճ

Slide 11

Slide 11 text

/** @jsx React.DOM */ App = React.createClass({ getInitialState: function() { return { newText: "", items: [ { text: "Foo" }, { text: "Bar" }, { text: "Buzz" } ] }; }, addItem: function(event) { event.preventDefault(); this.setState({ items: [{text : this.state.newText}].concat(this.state.items), newText: "" }) }, updateNewText: function(event) { this.setState({ newText : event.target.value }); }, render: function() { return
௥Ճ ɹ
{this.state.items.map(function(item) { return
{item.text}
; })}
; } }); React.render(, document.body); P.2 - ΞΠςϜΛ௥Ճ

Slide 12

Slide 12 text

addItem: function(event) { event.preventDefault(); this.setState({ items: [{text : this.state.newText}].concat(this.state.items), newText: "" }) }, updateNewText: function(event) { this.setState({ newText : event.target.value }); }, render: function() { return
௥Ճ ɹ
{this.state.items.map(function(item) { ← 1จࣈೖྗͷͨͼʹݺ͹ΕΔ P.2 - ΞΠςϜΛ௥Ճ

Slide 13

Slide 13 text

P.3 - ݅਺දࣔ ݅਺ →

Slide 14

Slide 14 text

P.3 - ݅਺දࣔ /** @jsx React.DOM */ App = React.createClass({ getInitialState: function() { return { newText: "", items: [ { text: "Foo" }, { text: "Bar" }, { text: "Buzz" } ] }; }, addItem: function() { event.preventDefault(); this.setState({ items: [{text : this.state.newText}].concat(this.state.items), newText: "" }) }, updateNewText: function(ev) { this.setState({ newText : ev.target.value }); }, render: function() { return
௥Ճ
{this.state.items.length}݅
{this.state.items.map(function(item) { return
{item.text}
; })}
; } }); React.render(, document.body);

Slide 15

Slide 15 text

P.3 - ݅਺දࣔ }); }, render: function() { return
௥Ճ
{this.state.items.length}݅
{this.state.items.map(function(item) { return
{item.text}
; })}
; } }); React.render(, document.body);

Slide 16

Slide 16 text

HTMLΛৗʹ࠶ߏங͢Δ͜ͱͰ ঢ়ଶม਺ ϩδοΫ ม਺Λߋ৽ Ϗϡʔ ม਺͔Βੜ੒

Slide 17

Slide 17 text

Ͱ΋… • HTMLશମॻ͖׵͑Δͱ஗͘ͳ͍ʁ • CSSΞχϝʔγϣϯ࢖͑ͳ͍ΑͶʁ • ࣮͸೔ຊޠೖྗͰ͖ͳ͍ΑͶ

Slide 18

Slide 18 text


 Foo
Bar
Buzz
ݱࡏͷDOM ࣮ࡍͷߋ৽ VirtualDOM BrowserDOM ৽͍͠DOM

 Foo
Bar
Buzz
One
(ͨͩͷJS Object)

 Foo
Bar
Buzz
One

Slide 19

Slide 19 text


 Foo
Bar
Buzz
ݱࡏͷDOM ࣮ࡍͷߋ৽ VirtualDOM BrowserDOM ৽͍͠DOM

 Foo
Bar
Buzz
One
(ͨͩͷJS Object)

 Foo
Bar
Buzz
One

Slide 20

Slide 20 text

΋ͬͱٕज़తʹ͸ • key • component • property • dangerouslySetInnerHTML • ৄ͘͠͸άά͍ͬͯͩ͘͞

Slide 21

Slide 21 text

͞Βʹ • ComponentͰ࠶ར༻Մೳͳ෦඼Խ • αʔόαΠυϨϯμϦϯά • ΋ͬͱେ͖ͳΞϓϦͰ͸Flux • iOS/AndroidΞϓϦ͸ReactNative

Slide 22

Slide 22 text

໰୊఺ • ίʔυΛॻ͘ਓ͕HTML΋ॻ͘ • طଘͷJS෦඼͕࢖͑ͳ͍(͜ͱ΋ͳ͍) • ಛʹTwitter Widgetͱ͔֎෦JS͸ۤख

Slide 23

Slide 23 text

Flux • ߟ͑ํͷ໊લ (MVCͱ͔ͱҰॹ) • ReactͰ͸Data͑͞มߋ͢Ε͹ը໘ʹ൓ө͞ΕΔ • Ϣʔβ͔ΒͷActionΛݩʹDispatcher͕Storeͷ มߋΛݺͼग़͢

Slide 24

Slide 24 text

Dispatcher Action Store React User action

Slide 25

Slide 25 text

Dispatcher Action Store React User action render: function() { return

todos

; }, _onSave: function(text) { if(text.trim()) { TodoActions.create(text) } } components/Header.js

Slide 26

Slide 26 text

Dispatcher Action Store React User action actions/TodoActions.js TodoActions = { create: function(text) { AppDispatcher.dispatch({ actionType: TodoConst.TODO_CREATE, text: text }); } }

Slide 27

Slide 27 text

Dispatcher Action Store React User action stores/TodoStore.js AppDispatcher.register(function(action) { switch(action.actionType) { case TodoConst.TODO_CREATE: create(action.text); TodoStore.emit(“change”); } }); function create() { var id = Math.random(); _todos[id] = { id: id complete: false text: text }; }

Slide 28

Slide 28 text

Dispatcher Action Store React User action components/TodoApp.js var TodoApp = React.createClass({ getInitialState: function() { return({ todos: TodoStore.getAll() }); }, componentDidMount: function() { TodoStore.addListener(this._onChange); }, _onChange: function() { this.setState({todos: TodoStore.getAll()}); }, render: function() { return ... } });

Slide 29

Slide 29 text

·ͱΊ • αʔόαΠυͷ༷ͳγϯϓϧͳྲྀΕͰAjaxΛ • ը໘Λॻ͖׵͑Δͱ͖͸ৗʹશ෦ॻ͖׵͑ • طଘͷJS UIϥΠϒϥϦͱಉډ͸೉͍͠