2ãæåã«Reactã«ã€ããŠèããããšãèãããããç§ã¯èšãã§ããã...
ãã³ãã¬ãŒãã¯ã©ãã«ãããŸããïŒ JavaScriptã§ãã®ã¯ã¬ã€ãžãŒãªHTMLã¯äœãããŠããŸããïŒ JSXã¯å¥åŠã«èŠããŸãïŒ å¯èœæ§ãé«ãïŒ çããïŒ
ããã¯ç§ã圌ãç解ããŠããªãã£ãããã§ãã
ããããReactã¯ééããªãæ£ããæ¹æ³ã§ãã èããŠãã ããã
å€ãè¯ãMVC
察話åã¢ããªã±ãŒã·ã§ã³ã®æªã®æ ¹æºã¯ç¶æ 管çã§ãã ãåŸæ¥ã®ãã¢ãããŒãã¯ãMVCã¢ãŒããã¯ãã£ãŸãã¯ãã®ããªãšãŒã·ã§ã³ã®äžéšã§ãã
MVCã¯ãã¢ãã«ãå¯äžã®çå®ã®ãœãŒã¹ã§ãããå·å šäœãããã«äœãã§ãããšæ³å®ããŠããŸãã ãã¥ãŒã¯æŽŸçã¢ãã«ã§ãããåæããå¿ èŠããããŸãã ã¢ãã«ãå€æŽããããšããã¥ãŒãå€æŽãããŸãã
ãã®çµæããŠãŒã¶ãŒãšã®çžäºäœçšã¯ãã¢ãã«ãæŽæ°ããã³ã³ãããŒã©ãŒã«ãã£ãŠä¿®æ£ãããŸãã ãããŸã§ã®ãšããè¯ãã
ã¢ãã«ãå€æŽãããšãã«ãã¥ãŒãã¬ã³ããªã³ã°ãã
ãšãŠãã·ã³ãã«ã«èŠããŸãã æåã«ãã¢ãã«ã®ç¶æ ãDOMã«å€æããæ¹æ³ãã€ãŸããã¥ãŒã説æããå¿ èŠããããŸãã 次ã«ããŠãŒã¶ãŒãäœãããããã³ã«ãã¢ãã«ãæŽæ°ãããã¹ãŠãåã¬ã³ããªã³ã°ããŸãã ããïŒ ããã»ã©éããªãã æ®å¿µãªãããããã§ãã¹ãŠãé 調ã«é²ãã§ããããã§ã¯ãããŸããã 2ã€ã®çç±ïŒ
- å®éãDOMã«ã¯ããã¹ããã£ãŒã«ãã®å 容ãªã©ã®ç¶æ ããããŸãã DOMãå®å šã«åã¬ã³ããªã³ã°ãããšããã®ã³ã³ãã³ãã¯å€±ãããŸãã
- DOMæäœïŒããŒãã®åé€ãæ¿å ¥ãªã©ïŒã¯æ¬åœã«é ãã§ãã åžžã«ãã¹ãŠãåã¬ã³ããªã³ã°ãããšãã²ã©ãããã©ãŒãã³ã¹ã«ã€ãªãããŸãã
ã§ã¯ãã¢ãã«ãšãã¥ãŒã®åæãã©ã®ããã«ä¿ã¡ããããã®åé¡ãåé¿ããã®ã§ããããïŒ
ããŒã¿ãã€ã³ãã£ã³ã°
éå»3幎éã§ããããã®åé¡ã«å¯ŸåŠããããã«å°å ¥ãããæãäžè¬çãªãã¬ãŒã ã¯ãŒã¯æ©èœã¯ãããŒã¿ãã€ã³ãã£ã³ã°ã§ãã
ããŒã¿ãã€ã³ãã£ã³ã°ã¯ãã¢ãã«ãšãã¥ãŒã®åæãèªåçã«ç¶æããæ©èœã§ãã éåžžJavaScriptã§ã¯ããããã¯ãªããžã§ã¯ããšDOMã§ãã
ããã¯ãã¢ããªã±ãŒã·ã§ã³å ã®ããŒã¿ã®æçéã®äŸåé¢ä¿ã宣èšããæ©èœã«ãã£ãŠå®çŸãããŸãã ç¶æ ã®å€æŽã¯ã¢ããªã±ãŒã·ã§ã³å šäœã«é åžããããã¹ãŠã®äŸåé¢ä¿ã¯èªåçã«æŽæ°ãããŸãã
ããã€ãã®æåãªãã¬ãŒã ã¯ãŒã¯ã§å®éã«ã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã
ããã¯ã¢ãŠã
Knockautã¯MVVMïŒModel-View-ViewModelïŒã¢ãããŒãã®ç¥ã§ãViewããŒãã®å®è£ ãæ¯æŽããŸãã
// View (a template) <p>First name: <input data-bind="value: firstName" /></p> <p>Last name: <input data-bind="value: lastName" /></p> <h2>Hello, <span data-bind="text: fullName"> </span>!</h2>
// ViewModel (diplay data... and logic?) var ViewModel = function(first, last) { this.firstName = ko.observable(first); this.lastName = ko.observable(last); this.fullName = ko.pureComputed(function() { // Knockout tracks dependencies automatically. It knows that fullName depends on firstName and lastName, because these get called when evaluating fullName. return this.firstName() + " " + this.lastName(); }, this); };
ãããŠåºæ¥äžããã å ¥åã®ããããã®å€ãå€æŽãããšãã¹ãã³ã®å€æŽãããªã¬ãŒãããŸãã æ¥ç¶ããã³ãŒããæžããããšã¯ãããŸããã ãã£ãããïŒ
ããããã¢ãã«ãå¯äžã®çå®ã®æºã§ãããšããäºå®ã¯ã©ãã§ããïŒ ViewModelã¯ã©ãããç¶æ ãååŸããŸããïŒ åœŒå¥³ã¯ãã¢ãã«ãå€æŽãããããšãã©ã®ããã«ç¥ã£ãŠããŸããïŒ èå³æ·±ã質åã
è§åºŠ
Angularã¯ãã¢ãã«ãšãã¥ãŒã®åæãç¶æãããšãã芳ç¹ããããŒã¿ãã€ã³ãã£ã³ã°ãèšè¿°ããŸãã ããã¥ã¡ã³ãããïŒ
ããã... ...ãã¥ãŒã¯ã¢ãã«ãšçŽæ¥éä¿¡ããå¿ èŠããããŸããïŒ ãããã¯å¯æ¥ã«é¢é£ããŠããŸããïŒ
ãšã«ãããããã«ã¡ã¯äžçãèŠãŠã¿ãŸãããïŒ
// View (a template) <div ng-controller="HelloController as hello"> <label>Name:</label> <input type="text" ng-model="hello.firstName"> <input type="text" ng-model="hello.lastName"> <h1>Hello {{hello.fullName()}}!</h1> </div> // Controller angular.module('helloApp', []) .controller('HelloController', function() { var hello = this; hello.fullName = function() { return hello.firstName + hello.lastName; }; });
ãã®äŸãããã³ã³ãããŒã©ãŒã«ã¯ç¶æ ããããã¢ãã«ã®ããã«åäœããããã«èŠããŸãããViewModelã®ããã«åäœããŸããïŒ ã¢ãã«ãå¥ã®å Žæã«ãããšä»®å®ãããšãã©ã®ããã«ã³ã³ãããŒã©ãŒãšåæããŸããïŒ
é ãå°ãçããªãå§ããŸããã
ããŒã¿ãã€ã³ãã£ã³ã°ã®åé¡
ããŒã¿ãã€ã³ãã£ã³ã°ã¯ãå°ããªäŸã§ããŸãæ©èœããŸãã ãã ããã¢ããªã±ãŒã·ã§ã³ã倧ãããªããšã次ã®åé¡ãçºçããå¯èœæ§ããããŸãã
äŸåé¢ä¿ã宣èšãããšãããã«ã«ãŒãã«ã€ãªããå¯èœæ§ããããŸã
æãäžè¬çãªã¿ã¹ã¯ã¯ãç¶æ ã®å€åã«ããå¯äœçšã«å¯ŸåŠããããšã§ãã Fluxã®çŽ¹ä»ããã®ãã®å³ã¯ãäŸåé¢ä¿ã®å°çãã©ã®ããã«å¿ã³å¯ãã®ããéåžžã«æ確ã«èª¬æããŠããŸãã
ãã®å Žåã1ã€ã®ã¢ãã«ã§1ã€ã®å€æŽãçºçãããšãã©ã®ãããªå€æŽãçºçããããäºæž¬ã§ããŸããïŒ äŸåé¢ä¿ãå€æŽããããšãã«ãå®å šã«ä»»æã®é åºã§å®è¡ã§ããã³ãŒãã«ã€ããŠè©±ãããšã¯éåžžã«å°é£ã§ãã
人çºçã«åé¢ããããã¿ãŒã³ãšè¡šç€ºããžãã¯
ãã¬ãŒã³ããŒã·ã§ã³ã®åœ¹å²ã¯äœã§ããïŒ ãŠãŒã¶ãŒãžã®ããŒã¿ã®æ瀺ã ViewModelã®åœ¹å²ã¯äœã§ããïŒ ãŠãŒã¶ãŒãžã®ããŒã¿ã®æ瀺ã éãã¯äœã§ããïŒ ãªãã
æçµçã«ããã¬ãŒã³ããŒã·ã§ã³ã³ã³ããŒãã³ãã¯ãã®ããŒã¿ãæäœããå¿ èŠãªåœ¢åŒã§è¡šç€ºã§ããå¿ èŠããããŸãã ãã ãããã¹ãŠã®ãã³ãã¬ãŒãèšèªã¯æ¬è³ªçã«ç¡å¹ã«ãªã£ãŠããŸããã³ãŒããšåãè¡šçŸåãšãã¯ãŒãå®çŸããããšã¯ã§ããŸããã
ç°¡åã«èšããšã{{ïŒeach}}ãng-repeatãdatabind = "foreach"ã¯ãã¹ãŠãJavaScriptã®ãã€ãã£ãã§åçŽãªforã«ãŒãã®æªã代æ¿åã§ãã ãããŠã圌ãã¯ãã以äžé²ãããšãã§ããŸããã ãã£ã«ã¿ãŒããããããããŸããã
ããŒã¿ãã€ã³ãã£ã³ã°-ã¬ã³ããªã³ã°ã®ããã¯
ã·ã³ãã«ãã®èæ¯ã¯è°è«ãããŠããŸããã 誰ããåžžã«ãç¶æ ãå€åãããšãã«ã¢ããªã±ãŒã·ã§ã³å šäœãåã¬ã³ããªã³ã°ããããšèããŠããŸããã ãããã£ãŠãæéã®çµéãšãšãã«ç¶æ ãå€åãããšããæªã®æ ¹æºãžã®å¯ŸåŠããããããšãã§ããŸããã¢ããªã±ãŒã·ã§ã³ãç¹å®ã®ç¶æ ãè¡šããŠããããšã説æããã ãã§ãã
Facebook React Input
圌ãã¯ããããã£ãããšãå€æã Reactã¯ä»®æ³DOMãå®è£ ããŸããããã«ãããèæ¯ãåŸãããŸãã
ãããã«ããŠããä»®æ³DOMãšã¯äœã§ããïŒ
èããŠãããŠããããã§ãïŒ ç°¡åãªReactã®äŸãèŠãŠã¿ãŸãããã
var Hello = React.createClass({ render: function() { return <div>Hello {this.props.name}</div>; } }); React.render(<Hello name="World" />, document.getElementById('container'));
Reactã³ã³ããŒãã³ãã«å¿ èŠãªãã®ã¯ããã ãã§ãã ã¬ã³ããªã³ã°ã¡ãœãããå¿ èŠã§ãã é£ããã§ããïŒ
ããããŸãããã<div>ãšã¯äœã§ããïŒ ããã¯JavaScriptã§ã¯ãããŸããïŒ ééããªã圌ã
ããªãã®æ°ããå人ãjsx
å®éããã®ã³ãŒãã¯JSXã§æžãããŠããŸãã ã³ã³ããŒãã³ããå®çŸ©ããããã®æ¬åŒ§æ§æãå«ãã¹ãŒããŒjavascriptã¹ã€ãŒãã äžèšã®ã³ãŒãã¯ãJavaScriptã§ã³ã³ãã€ã«ãããšãå®éã«ã¯æ¬¡ã®ããã«ãªããŸãã
var Hello = React.createClass({displayName: "Hello", render: function() { return React.createElement("div", null, "Hello ", this.props.name); } }); React.render(React.createElement(Hello, {name: "World"}), document.getElementById('container'));
createElementåŒã³åºãã«æ°ã¥ããŸãããïŒ ãããã®ãªããžã§ã¯ãã¯ãä»®æ³DOMã®å®è£ ãæ§æããŸãã
éåžžã«ç°¡åïŒReactã¯ãŸãããããã®ãªããžã§ã¯ãã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®æ§é å šäœãã¡ã¢ãªã«åéããŸãã 次ã«ããã®æ§é ãçŸåšã®DOMããŒãã«å€æãããã©ãŠã¶ãŒDOMã«æ¿å ¥ããŸãã
ããããŸãããããããã®å¥åŠãªcreateElementé¢æ°ã䜿çšããŠHTMLãæžãæå³ã¯äœã§ããïŒ
ä»®æ³DOM-é«é
æ¢ã«èª¬æããããã«ãDOMã®å€æŽã¯ãšãŠã€ããªãè²»çšãããããããDOMã®å€æŽã¯ã§ããã ãå°ãªãããå¿ èŠããããŸãã
ãã ããReactã®ä»®æ³DOMã¯ã2ã€ã®ããªãŒãæ¯èŒãããããã®éã§äœãå€æŽãããããæ£ç¢ºã«èŠã€ããããšã«ãããéåžžã«é«éã«åŠçããŸãã ãã®ããã«ããŠãReactã¯DOMã®æŽæ°ã«å¿ èŠãªå€æŽã®æå°æ°ãèšç®ã§ããŸãã
å®éã«ã¯ãReactã¯2ã€ã®DOMããªãŒãæ¯èŒããå®è¡ããå¿ èŠãããæäœã®æå°ã»ãããèšç®ã§ããŸãã ããã¯2ã€ã®ããšãæå³ããŸãã
- ããã¹ããå«ãããã¹ããã£ãŒã«ããã¬ã³ããªã³ã°ãããå ŽåãReactã¯ã³ã³ãã³ãããããšæ³å®ããããã«è§ŠããŸããã ãã以äžã®è²¡ç£ã®æ倱ã¯ãããŸããã
- ä»®æ³DOMã®æ¯èŒã¯ãŸã£ããé«äŸ¡ã§ã¯ãªãããã奜ããªããã«æ¯èŒã§ããŸãã diffãå®éã«DOMãå€æŽããæºåãã§ããããæå°éã®æäœã§ãããè¡ããŸãã é ãã¬ã€ã¢ãŠãã¯ãããããŸããã
ç¶æ ãå€æŽãããšãã«ã¢ããªã±ãŒã·ã§ã³å šäœãåã¬ã³ããªã³ã°ããããšã«é¢ãã2ã€ã®åé¡ãèŠããŠããŸããïŒ
éããŸããã
DOMã®React Mapitç¶æ
ä»®æ³DOMã®ã¬ã³ããªã³ã°ãšæ¯èŒã¯ãReactã®å¯äžã®éæ³ã®éšåã§ãã ãã®åªããããã©ãŒãã³ã¹ã«ãããããã·ã³ãã«ãªã¢ãŒããã¯ãã£ãå®çŸã§ããŸãã ã©ã®ãããç°¡åã§ããïŒ
Reactã³ã³ããŒãã³ãã¯ã¹ãçé¢æ°ã§ãã ãã€ã§ãUIã説æããŸãã ãµãŒããŒã§ã¬ã³ããªã³ã°ãããã¢ããªã±ãŒã·ã§ã³ã®ããã«ã
Pete Huntã ReactïŒãã¹ããã©ã¯ãã£ã¹ã®åè
ããããReactã³ã³ããŒãã³ããæ¬åœã«ããã¹ãããšã§ãã DOMã®ã¢ããªã±ãŒã·ã§ã³ã®çŸåšã®ç¶æ ã衚瀺ããŸãã ã«ãŒããé¢æ°ãã¹ã³ãŒããæ§æãæ¬æ Œçãªãã³ãã¬ãŒãèšèªãªã©ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãèšè¿°ããJavaScriptã®ãã¹ãŠã®æ©èœãåããŠããŸãã
var CommentList = React.createClass({ render: function() { var commentNodes = this.props.data.map(function (comment) { return ( <Comment author={comment.author}> {comment.text} </Comment> ); }); return ( <div className="commentList"> {commentNodes} </div> ); } }); var CommentBox = React.createClass({ render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.props.data} /> </div> ); } }); React.render( <CommentBox data={data} />, document.getElementById('content') );
ä»ããReactã䜿ãå§ããŸãããã
äžèŠãReactã¯å°ãè€éã«èŠãããããããŸããã éåžžã«å€§ããªãã©ãã€ã ãæäŸããŸãããåžžã«äŸ¿å©ã§ã¯ãããŸããã ãã ãã䜿çšãéå§ãããšãå©ç¹ãæããã«ãªããŸãã
Reactã®ããã¥ã¡ã³ãã¯åªããŠããŸãã ããªãã¯ãããè©ŠããŠããã¥ãŒããªã¢ã«ã«åŸãã¹ãã§ãã Reactã«ãã£ã³ã¹ãäžããã°ããã£ãšãã£ãšReactã奜ãã«ãªãã§ãããã
è¯ãã³ãŒãã£ã³ã°ã
å ã®èšäºïŒ å¿é ãæ¢ããŠReactãæããæ¹æ³
æçš¿è ã®ã«ãã«ã ã»ãããªã²ã¹