ãµããŒã¿ãŒã®äž»ãªè«ç¹ã¯ãäžæ£ãªã¢ããªã±ãŒã·ã§ã³ã®åäœã¯é ãããæ£ããã¢ããªã±ãŒã·ã§ã³ã«ã¯2000ã3000ãè¶ ããèŠçŽ ãå«ããã¹ãã§ã¯ãªããšããããšã§ãã ããã«å«ãŸããŠããå Žåã¯ãäœããééã£ãŠããŸãã ããšãã°http://iantonov.me/page/angularjs-osnovyãåç §ããŠãã ããã
åŒæ°ã¯äžè¬çã«éåžžã«å ç¢ã§ããããééã£ããWebã¢ããªã±ãŒã·ã§ã³ãäœæããå¿ èŠãããç¶æ³ã¯åžžã«ååšããŸãããã®ãããªèŠä»¶ã®ããã§ãã ãã®èšäºã§ã¯ããã®ãããªåé¡ãšãã®è§£æ±ºæ¹æ³ã«ã€ããŠèª¬æããããšã«ããŸããã ç§ãã¡ã®æèŠã§ã¯ããã®èšäºã¯ããã®Webéçºè ã«ãšã£ãŠããæçšã ãšæããŸãã ãã®ãããç§ãã¡ã®ã¿ã¹ã¯ã¯ã1ã€ã®ã¹ããŒãã¯ã©ãã®äºçŽã·ã¹ãã çšã®ã«ã¬ã³ããŒãäœæããããšã§ããã ã«ã¬ã³ããŒã«ã¯7ã€ã®12æéãããã¯ã衚瀺ãããåæ¥ã¯15åééã«åå²ãããŠããŸãã ãããã¯ã«ã¯2ã10åã®DOMèŠçŽ ãå«ããããšãã§ããŸãã ãã©ãã«ã®åå ã¯ãªãããã§ããäžéã¯ã3000ã§ãã
ããŠãç§ãã¡ã¯æžãå§ããŸãïŒ
<div ng-repeat=âday in daysâ> âŠ. <div ng-repeat=âhour in day.hoursâ> <div ng-repeat=âblock in hour.blocksâ> ⊠<div ng-repeat=âblock in hour.blocksâ> ⊠<div ng-repeat=âsession in block.sessionsâ> ⊠</div> </div> </div> </div> </div>
ã§ããïŒ ãããïŒ ããããã¹ãŠã®ããŒã¿ãã€ã³ãã£ã³ã°ã«ã¯çŽ2ã3ç§ããããŸããã ãšããã§ã質åãçºçããå ŽåããããŸãã ãããã¡ã€ã©ãŒã䜿çšããŠãããå®è¡ããããšããŠããçŽæ¥çããåŸãããããã§ã¯ãããŸããããããã¡ã€ã©ãŒã§ãããŒã¿ãã€ã³ãã£ã³ã°ã·ãŒãã«æ£ç¢ºã«é¢é£ãããã®ãã«ãŒãã£ã³ã°ãªã©ãè¿œå ãããã®ãç解ããããšã¯å°é£ã§ãã
ãããã£ãŠãéåžžã«ç°¡åã«è¡ããŸããã
$timeout(function() { $scope.days = days; var now = new Date(); $timeout(function() { console.log(new Date - now); $scope.apply() }, 0); }, 100);
æåã®ã¿ã€ã ã¢ãŠãã¯ãä»ã®ãã¹ãŠã®ã¹ã¯ãªãããæ©èœããããã«å¿ èŠã§ããããã«ããã枬å®ã®ç²ŸåºŠã«éåããªãããã«ãå®éã«ã¯100ïŒmsïŒã®æ°å€ãå®éšçã«éžæãããŸãã 2çªç®ã¯å®å šã«0ãå®è¡ã§ããŸãã ãã©ãŠã¶ã¯æåã®äŒæ¯ãåãåããšããã«ãå éšãã³ãã©$ timeout-aãããã«å®è¡ããŸããããã¯ãå®éã«ã¯ããŒã¿ãã€ã³ãã£ã³ã°ãå®äºããããšãæå³ããŸãã
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®å¿çæ§ã®èŠ³ç¹ããã2ã3ç§ã¯éåžžã«å€§ããªå€ã§ãããã®åé¡ã解決ããã«ã¯ã©ãããã°ããã§ããããã
ãã¡ãããæåã®ããšã¯tech.small-improvements.com/2013/09/10/angularjs-performance-with-large-listsãšããã¡ããã AngularJSã®æé©åïŒ1200msãã35msãèªã¿çŽãããšã§ã ã ååã®èšäºã§ã¯ãçµæã¯ç¹ã«å°è±¡çã§ãã ããããçµæã¯ä»®æ³åïŒã€ãŸããå°ããªè¡šç€ºéšåã®ã¿ãã¬ã³ããªã³ã°ããããšïŒãšãã£ãã·ã¥ã«ãã£ãŠå®çŸãããŸãã ä»®æ³åã¯åªãããœãªã¥ãŒã·ã§ã³ã§ãããä»®æ³åãããã³ã³ãã³ããéåžžã«ç°¡åãªå Žåã®ã¿ã§ãã ããããªããšãããŒãžãã¹ã¯ããŒã«ãããšãã«éåžžã«äžå¿«ãªãã¬ãŒãã衚瀺ãããä»®æ³åã®å¹æå šäœãå¹³æºåãããŸãã
ä»®æ³åãšããã°ã衚圢åŒã®ããŒã¿ã衚瀺ããããã®çŽ æŽãããngGridèŠçŽ ããããäœçŸäžãã®èŠçŽ ã衚瀺ã§ããŸãïŒãã§ãã¯:)ïŒã ãã ããããã§ã®ãœãªã¥ãŒã·ã§ã³ã¯ãã¡ããä»®æ³åã§ãïŒããã§ãªããšãngGridã®ãã¹ãŠã®è¡ãåãé«ãã«ãªãã®ã§ãïŒã
ãã®ãããå€ãã®ãªãã·ã§ã³ãè©Šããçµæãæçµçã«ReactJSã«å°éããŸããã éçºè ã«ãããšãããã¯ããŒã¿ãã€ã³ãã£ã³ã°ã®ããã®æéã®ãã¬ãŒã ã¯ãŒã¯ã§ãïŒãããŠä»ãç§ã¯ãããããã§ããããšã«åæããåŸåããããŸãïŒã ããšãã°ã Vueã® Webãµã€ãã¯å¥ã®äž»åŒµãããŠããŸãããç§èªèº«ã®ãã¹ãã§ã¯Reactã®åªäœæ§ã瀺ãããŸããã
ã ããåå¿ããã
ãã®ãã¬ãŒã ã¯ãŒã¯ã«ç¹åããHabréã®èšäºã¯ãã§ã«ããªãå€ããããŸãã ãŸã第äžã«ãç§ã¯ãå§ãããŸãïŒ
çŽ æŽãããèšäºã ãã§ãªã
- http://maketea.co.uk/2014/03/05/building-robust-web-apps-with-react-part-1.html
- http://maketea.co.uk/2014/04/07/building-robust-web-apps-with-react-part-2.html
- http://maketea.co.uk/2014/05/22/building-robust-web-apps-with-react-part-3.html
- http://maketea.co.uk/2014/06/30/building-robust-web-apps-with-react-part-4.html
Habréã«ã¯ãã·ã¢èªãžã®ç¿»èš³ããããŸãã
ReactJSã®ç§å¯ã¯ãä»®æ³DOMã§åäœããããšã§ããããã«ããããã¥ãŒã®ã¬ã³ããªã³ã°ã«å¿ èŠãªã¢ã¯ã·ã§ã³ã®æ°ãæå°éã«æããããšãã§ããŸãã ãã¡ãã®çŽ æµãªèšäºã
ReactJSã§ãã¥ãŒã衚瀺ããããã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
var Hello = React.createClass({ render: function() { return React.DOM.div({}, 'Hello ' + this.props.name); } }); React.renderComponent(Hello({name: 'World'}), document.body);
ããã§ã¯ãæåã®éšåã§ã³ã³ããŒãã³ããå®çŸ©ãããReact.renderComponentïŒHelloïŒ{nameïŒ 'World'}ïŒãdocument.bodyïŒããšããè¡ã§æç»ããŸãã
React.DOM APIã¯éåžžã«äŸ¿å©ã§ãããAngualrããã³Knockoutãã³ãã¬ãŒãã®åŸãJavascriptã䜿çšããŠDOMãçæããã®ã¯å°ãå€ããå€ãã®äœæ¥ã®ããã«æããŸãã ããã解決ããããã«ãFacebookã¯ããã©ãŠã¶ãŒå JSXãã©ã³ã¹ãã©ãŒã ããæäŸããŠããŸãã
ãã©ãŠã¶ã§ã®äŒè°
<script type="text/jsx">
ãã©ã³ã¹ãã©ãŒããŒã¯ãã®ãããªã³ãŒããåããŸã
var HelloMessage = React.createClass({ render: function() { return <div>{'Hello ' + this.props.name}</div>; } });
ããã§ïŒ
var Hello = React.createClass({ render: function() { return React.DOM.div({}, 'Hello ' + this.props.name); } });
æ§æã«æ³šæããŠãã ããïŒreturn [Markup]; åŒçšç¬ŠãªãïŒReactJS.Netã®çµéšããäœåãªè§ãã£ããæ¹è¡ã¯åé¡ãããŸãããïŒã ç¹°ãè¿ãèŠçŽ ã衚瀺ããã«ã¯ãããã€ãã®é åã«å¯ŸããŠæ¬¡ã®ããã«ããå¿ èŠããããŸã
var HelloMessage = React.createClass({ render: function() { ⊠var nodes = array.map(function(element) { return <div>âŠ</div>; }); return <div>{nodes}</div>; } });
ãã ãããããã次ã®ããã«ãªããŸãã
var SubMessage = React.createClass({ render: function() { return <div>âŠ</div>; } }); var HelloMessage = React.createClass({ render: function() { ⊠var nodes = array.map(function(element) { return <SubMessage >âŠ</ SubMessage >; }); return <div>{nodes}</div>; } });
ãªãã§ïŒ çãã¯ãã³ã³ããŒãã³ãã«ã¯ç¬èªã®ç¶æ ããããšããããšã§ããããã«ã€ããŠã¯ã以äžã§èª¬æããŸãã
ã¡ãªã¿ã«ãJSXå€æã®äœæ¥ã¯ãµãŒããŒã§ãååŸã§ããŸããããã«ã¯ã httpsïŒ//github.com/facebook/react/wiki/Complementary-Tools#jsx-integrationsã®è±å¯ãªçµ±åã»ããããããŸããããã¯ReactJS.Netã§ããã
ãããŠãåæ¹åãã€ã³ãã£ã³ã°-MV- *ãã¬ãŒã ã¯ãŒã¯ã®åºç€ãšãªããã®ã¯äœã§ããïŒ å®éã http: //maketea.co.uk/2014/03/05/building-robust-web-apps-with-react-part-1.htmlã§é©åã«ææãããŠããããã«ãReactJSã¯ããã€ãã®æ段ã§ã¯ãããŸããããã®ãããªåé¡ã解決ããããã«ã ReactJSã¯ãã³ã³ããŒãã³ãã®ããããã£ãšç¶æ ãåºå¥ããŸãã ããããã£-ããã¯ãReact.renderComponentïŒHelloïŒ{[PROPERTIES}}ïŒã...ïŒãåŒã³åºããŠã³ã³ããŒãã³ãã«æž¡ããthis.propsãä»ããŠã³ã³ããŒãã³ãå ã§æ¢ã«ååŸããŠããŸãã ã»ãšãã©ã®å Žåãããããã£ã¯ãªããžã§ã¯ãã®ããªãŒã§ãããããã«ãã£ãŠããŒã¯ã¢ãããçæãããŸãã ã€ããªãã®ãŒçã«ãããããã£ã¯ããªãéçãªåäœãæ³å®ããŠããŸãã ããããã£ãæŽæ°ããããšãã«ããŒã¯ã¢ãããå€æŽããã«ã¯ãReact.renderComponentãããäžåºŠåŒã³åºãå¿ èŠããããŸãïŒãã®renderComponentã¯ãMV- *ãã¬ãŒã ã¯ãŒã¯ã®åæ§ã®æ§é ãããé«éã«åäœããããšãå€ãã§ãããå·®åã¢ã«ãŽãªãºã ã¯éåžžã«åªããŠããŸãïŒã
ç¶æ ã¯å€åããå¯èœæ§ã®ãããã®ã§ãã ç¶æ ã¯ãããã€ãã®æ¹æ³ã§æ±ºå®ãããŸãã
- getInitialState-ã³ã³ããŒãã³ãã®åæç¶æ ãå®çŸ©ããŸãïŒããããã£ã«åºã¥ããŠè¿ãããŸãïŒã
- setState-ç¶æ ãèšå®ããŸãã
setStateãåŒã³åºããããšãåŒã³åºãããã³ã³ããŒãã³ãã«å¯ŸããŠã®ã¿åæç»ãè¡ãããŸãã
å察æ¹åã«ããŒã¿ã転éããæ¹æ³ã¯ïŒ ãããè¡ãã«ã¯ãåæå€ã§ããvalueLinkãªããžã§ã¯ããšããããå€æŽããããã®ãã³ãã©ãŒãå¿ èŠã§ãã ãã®ãã³ãã©ãŒã¯ç¶æ³ã«å¿ããŠåäœããå¿ èŠããããŸãã Facebookã§ã¯ãå°éå ·ã«æ°ããå€ãçŽæ¥æžã蟌ãããšã¯ãå§ãããŸããããã®ãããæ°ããå€ãèšè¿°ããŠãããŒã¯ã¢ãããããŒã¿ã§é©åã«æŽæ°ãããããã«ããå¿ èŠããããŸãã ã€ãŸããæãå®å šãªåœ¢åŒã§ã¯ãReactJSã®åæ¹åãã€ã³ãã£ã³ã°ã®é¡äŒŒæ§ã¯æ¬¡ã®ããã«ãªããŸãã
è§ã®ã©ãã«ãã
<input ng-model=value />.
ReactJSã«ã¯æ¬¡ã®ãã®ããããŸãã
var HelloMessage = React.createClass({ getInitialState() { return { value: this.props.value }; }, render: function() { var valueLink = { value: this.state.value, requestChange: function(newValue) { this.setState({value: newValue}); }.bind() // , .bind() }; return <input value={valueLink}/>; } });
åé·ïŒ ãã¡ãã!!! ããã¯ãçç£æ§ã®5åã®å¢å ã®ä»£äŸ¡ã§ãã
ãããã£ãŠãã¿ã¹ã¯ã«æ»ããšãäœããããŸããïŒ
- äœåã®åäœãé ãAngularJSäžã®ã¢ããªã±ãŒã·ã§ã³ã
- çç£æ§ãåäžããããïŒå®éã«ã¯5åã«ãªããŸãïŒã
- æå°éã®åŽåã§ãããéæããããšèããŠããŸãã
- çæ³çã«ã¯ãã³ã³ãããŒã©ãŒãšã¢ãã«ã®äž¡æ¹ãå€æŽããã«ãã¢ããªã±ãŒã·ã§ã³ã®ãã¥ãŒéšåã®ã¿ãå€æŽãããã§ãã
ãã®ã¢ã€ãã¢ã¯http://habrahabr.ru/post/215607/ã§èª¬æãããŠããŸãã
å®éãç§ãã¡ã®ãã®ïŒ
<div ng-repeat=âday in daysâ> âŠ. </div>
ä»ã«ãªããŸãïŒ
<div calendar=âdaysâ />
ããããããã¯Reactã§ã¯ãªããAngularã§ãããcalendarã¯Daysã®å€æŽã远跡ããrenderComponentãåŒã³åºããã£ã¬ã¯ãã£ãã§ãã
è¯ããã¥ãŒã¹ã¯ãJSXã§Viewã³ãŒããæžãæããããšã¯ã»ãšãã©æ©æ¢°çãªããã»ã¹ã§ãããšããããšã§ãã Ng-classã¯className = {className}ã«å€ãããŸããããã§ãclassNameã¯èšç®ãããã¯ã©ã¹åã§ãïŒã¡ãªã¿ã«ãã¯ã©ã¹ã§ã¯ãªãclassNameã§ããããšã«æ³šæããŠãã ããããããå¿ãããšãReactãã³ã³ãœãŒã«ã§åœ¹ç«ã¡ãŸãïŒã ã¹ã¿ã€ã«ã®Ng-show = {style}ã äžèšã®Ngã¢ãã«ã éåžžã«æ©æ¢°çãªããããããèªåçã«è¡ãngReactã€ãã·ã¢ãããããããŸãã
ãã ãã ããã«èšèŒãããŠããããã« ãããã©ãŒãã³ã¹ããã€ãã¹ã«ãªãå¯èœæ§ããããŸãã åé¿ããããã«ãå®èšŒæžã¿ã®ãæåãã®æ¹æ³ã䜿çšããŸããã
èŠçŽãããšïŒ
以åã¯2ã3ç§ããã£ãŠãããã®ãã300ã500ããªç§ããããŸããã ããã«ããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãéåžžã«æ¥œãããªããŸããã æéã«ãããšãä¿®æ£ã«ã¯çŽ3æ¥ããããæåã®å®è£ ã¯çŽ15æ¥ã§ããã ãã¥ãŒã®ã¿ãå€æŽããããšãã§ããŸããããããããããããã®ã¿ã¹ã¯ã®ç¹ç°æ§ã§ãã
çµè«ãšããŠãAngularã§èšè¿°ãããã¢ããªã±ãŒã·ã§ã³ã§ã®React-injectionsã®äœ¿çšïŒèš±å¯ãåŸãŠãããåŒã³åºããŸãïŒã䜿çšãããšãçç£æ§ãçŽ5åã«é«ããããšãã§ããŸãã ãããŠæãéèŠãªããš-è¡ãããå€æŽã¯æåããã³æ©æ¢°çã§ããããããã¯ããŒã«ã«ã«é©çšãããŸãã
ç§ãã¡ã®èŠ³ç¹ããã¯ãåæ§ã®ç¶æ³ã§ãReactã¯ã¢ããªã±ãŒã·ã§ã³ã®ãé ããå Žæãé«éåããéæ³ã®æã«ãªããŸãã