ͨ¹ýǰÁ½ÆªÎÄÕµĽéÉÜ£¬ÏàÐÅ´ó¼Ò¶ÔJSXºÍ×é¼þÒѾÓÐÁËÒ»¶¨µÄÁ˽⡣JSXÕâÖÖ»ìºÏʹÓÃJavaScriptºÍXMLµÄÓïÑÔµÚÒ»ÑÛ¿´ÉÏÈ¥ºÜ¡°³ó¡±£¬Ò²ºÜÉñÆæ£¬µ«ÊÇÆäÓï·¨ºÍ±³ºóµÄÂ߼ȴ¼«Æä¼òµ¥¡£ÏàÐŶÁÍê±¾ÎÄÄã¾Í¿ÉÒÔ¶ÔJSXºÍ×é¼þÓÐÒ»¸öÈ«ÃæµÄÁ˽⣬²¢Äܹ»ÓÃJSXÀ´Ö±¹ÛµÄ¹¹ÔìÓû§½çÃæ¡£
ʲôÊÇJSX
ReactµÄºËÐÄ»úÖÆÖ®Ò»¾ÍÊÇÐéÄâDOM£º¿ÉÒÔÔÚÄÚ´æÖд´½¨µÄÐéÄâDOMÔªËØ¡£ReactÀûÓÃÐéÄâDOMÀ´¼õÉÙ¶Ôʵ¼ÊDOMµÄ²Ù×÷´Ó¶øÌáÉýÐÔÄÜ¡£ÀàËÆÓÚÕæÊµµÄÔÉúDOM£¬ÐéÄâDOMÒ²¿ÉÒÔͨ¹ýJavaScriptÀ´´´½¨£¬ÀýÈ磺
var child1 = React.createElement('li', null, 'First Text Content'); var child2 = React.createElement('li', null, 'Second Text Content'); var root = React.createElement('ul', { className: 'my-list' }, child1, child2); |
ʹÓÃÕâÑùµÄ»úÖÆ£¬ÎÒÃÇÍêÈ«¿ÉÒÔÓÃJavaScript¹¹½¨ÍêÕûµÄ½çÃæDOMÊ÷£¬ÕýÈçÎÒÃÇ¿ÉÒÔÓÃJavaScript´´½¨ÕæÊµDOM¡£µ«ÕâÑùµÄ´úÂë¿É¶ÁÐÔ²¢²»ºÃ£¬ÓÚÊÇReact·¢Ã÷ÁËJSX£¬ÀûÓÃÎÒÃÇÊìϤµÄHTMLÓï·¨À´´´½¨ÐéÄâDOM£º
var root =( <ul className="my-list"> <li>First Text Content</li> <li>Second Text Content</li> </ul> ); |
ÕâÁ½¶Î´úÂëÊÇÍêÈ«µÈ¼ÛµÄ£¬ºóÕß½«XMLÓï·¨Ö±½Ó¼ÓÈëµ½JavaScript´úÂëÖУ¬ÈÃÄãÄܹ»¸ßЧµÄͨ¹ý´úÂë¶ø²»ÊÇÄ£°åÀ´¶¨Òå½çÃæ¡£Ö®ºóJSXͨ¹ý·ÒëÆ÷ת»»µ½´¿JavaScriptÔÙÓÉä¯ÀÀÆ÷Ö´ÐС£ÔÚʵ¼Ê¿ª·¢ÖУ¬JSXÔÚ²úÆ·´ò°ü½×¶Î¶¼ÒѾ±àÒë³É´¿JavaScript£¬JSXµÄÓï·¨²»»á´øÀ´ÈκÎÐÔÄÜÓ°Ïì¡£ÁíÍ⣬ÓÉÓÚJSXÖ»ÊÇÒ»ÖÖÓï·¨£¬Òò´ËJavaScriptµÄ¹Ø¼ü×Öclass,
forµÈÒ²²»ÄܳöÏÖÔÚXMLÖУ¬¶øÒªÈçÀý×ÓÖÐËùʾ£¬Ê¹ÓÃclassName, htmlFor´úÌæ£¬ÕâºÍÔÉúDOMÔÚJavaScriptÖеĴ´½¨Ò²ÊÇÒ»Öµġ£
Òò´Ë£¬JSX±¾Éí²¢²»ÊÇʲô¸ßÉîµÄ¼¼Êõ£¬¿ÉÒÔ˵ֻÊÇÒ»¸ö±È½Ï¸ß¼¶µ«ºÜÖ±¹ÛµÄÓï·¨ÌÇ¡£Ëü·Ç³£ÓÐÓã¬È´²»ÊÇÒ»¸ö±ØÐèÆ·£¬Ã»ÓÐJSXµÄReactÒ²¿ÉÒÔÕý³£¹¤×÷£ºÖ»ÒªÄãÀÖÒâÓÃJavaScript´úÂëÈ¥´´½¨ÕâЩÐéÄâDOMÔªËØ¡£
ΪʲôʹÓÃJSX
ǰ¶Ë½çÃæµÄ×î»ù±¾¹¦ÄÜÔÚÓÚÕ¹ÏÖÊý¾Ý£¬Îª´Ë´ó¶àÊý¿ò¼Ü¶¼Ê¹ÓÃÁËÄ£°åÒýÇæ£¬ÀýÈçÔÚAngularJSÖУº
<div ng-if="person != null"> Welcome back, <b>{{person.firstName}} {{person.lastName}}</b>! </div> <div ng-if="person == null"> Please log in. </div> |
ÔÚEmberJSÖУº
{{#if person}} Welcome back, <b>{{person.firstName}} {{person.lastName}}</b>! {{else}} Please log in. {{/if}} |
ÔÚKnockoutjsÖУº
<div data-bind="if: person != null"> Welcome back, <b>{{person.firstName}} {{person.lastName}}</b>! </div> <div data-bind="if: person == null"> Please log in. </div> |
Ä£°å¿ÉÒÔÖ±¹ÛµÄ¶¨ÒåUIÀ´Õ¹ÏÖModelÖеÄÊý¾Ý£¬Äã²»±ØÊÖ¶¯µÄȥƴ³öÒ»¸öºÜ³¤µÄHTML×Ö·û´®£¬¼¸ºõÿÖÖ¿ò¼Ü¶¼ÓÐ×Ô¼ºµÄÄ£°åÒýÇæ¡£´«Í³MVC¿ò¼ÜÇ¿µ÷½çÃæÕ¹Ê¾Âß¼ºÍÒµÎñÂß¼µÄ·ÖÀ룬Òò´ËΪÁËÓ¦¶Ô¸´ÔÓµÄչʾÂß¼ÐèÇó£¬ÕâЩģ°åÒýÇæ¼¸ºõ¶¼²»¿É±ÜÃâµÄÐèÒª·¢Õ¹³ÉÒ»ÃŶÀÁ¢µÄÓïÑÔ£¬ÈçÉÏÃæ´úÂëËùʾ£¬Ã¿¸ö¿ò¼Ü¶¼ÓÐ×Ô¼ºµÄÄ£°åÓïÑÔÓï·¨¡£¶øÕâÎÞÒÉÔö¼ÓÁË¿ò¼ÜµÄÃż÷ºÍ¸´ÔÓ¶È¡£
Èç¹ûËµÕÆÎÕÒ»ÖÖÄ£°åÓïÑÔ²¢²»ÊǺܴóµÄÎÊÌ⣬ÄÇôÆäʵÓÉÄ£°å´øÀ´µÄ¼Ü¹¹¸´ÔÓÐÔÔòÊÇÈÿò¼ÜÒ²±äµÃ¸´ÔÓµÄÖØÒªÔÒòÖ®Ò»£¬ÀýÈ磺
Ä£°åÐèÒª¶ÔÓ¦Êý¾ÝÄ£ÐÍ£¬¼´ÉÏÏÂÎÄ£¬ÈçºÎÈ¥°ó¶¨ºÍʵÏÖ£¿
Ä£°å¿ÉÒÔǶÌ×£¬²»Í¬²¿·Ö½çÃæ¿ÉÄÜÀ´×Ô²»Í¬Êý¾ÝÄ£ÐÍ£¬ÈçºÎ´¦Àí£¿
Ä£°åÓïÑÔÖÕ¾¿ÊÇÒ»¸öÇáÁ¿¼¶ÓïÑÔ£¬ÎªÁËÂú×ãÏîÄ¿ÐèÇó£¬ÄãºÜ¿ÉÄÜÐèÒªÀ©Õ¹Ä£°åÒýÇæµÄ¹¦ÄÜ¡£
ΪÁ˽â¾öÕâЩ¸´ÔÓ¶È£¬¿ò¼Ü±¾ÉíÐèÒª¾«ÐĵÄÉè¼Æ£¬ÒÔ¼°´´ÔìеĸÅÄÀýÈçAngularµÄDirective£©¡£ÕâЩ¶¼»áÈÿò¼Ü±äµÃ¸´ÔÓºÍÄÑÒÔÕÆÎÕ£¬²»½öÔö¼ÓÁË¿ª·¢³É±¾£¬¸÷ÖÖÄÑÒÔµ÷ÊÔµÄBug»¹»á½µµÍ¿ª·¢ÖÊÁ¿¡£
ÕýÒòΪÈç´Ë£¬ReactÖ±½Ó·ÅÆúÁËÄ£°å¶ø·¢Ã÷ÁËJSX¡£¿´ÉÏÈ¥ºÜÏñÄ£°åÓïÑÔ£¬µ«Æä±¾ÖÊÊÇͨ¹ý´úÂëÀ´¹¹½¨½çÃæ£¬ÕâʹµÃÎÒÃDz»ÔÙÐèÒªÕÆÎÕÒ»ÃÅеÄÓïÑԾͿÉÒÔÖ±¹ÛµÄÈ¥¶¨ÒåÓû§½çÃæ£ºÕÆÎÕÁËJavaScript¾ÍÒÑ¾ÕÆÎÕÁËJSX¡£ÕâÀï²»·ÁÔÙÒýÓÃ֮ǰÎÄÕ¾ٹýµÄÀý×Ó£¬ÔÚչʾһ¸öÁбíʱ£¬Ä£°åÓïÑÔͨ³£ÌṩÃûΪRepeatµÄÓï·¨£¬ÀýÈçÔÚAngularÖУº
<ul class="unstyled"> <li ng-repeat="todo in todoList.todos"> <input type="checkbox" ng-model="todo.done"> <span class="done-{{todo.done}}">{{todo.text}}</span> </li> </ul> |
¶øÊ¹ÓÃJSX£¬Ôò´úÂëÈçÏ£º
var lis = this.todoList.todos.map(function (todo) { return ( <li> <input type="checkbox" checked={todo.done}> <span className={'done-' + todo.done}>{todo.text}</span> </li> ); });
var ul = (
<ul class="unstyled">
{lis}
</ul>
); |
¿ÉÒÔ¿´µ½£¬JSXÍêÃÀÀûÓÃÁËJavaScript×Ô´øµÄÓï·¨ºÍÌØÐÔ£¬ÎÒÃÇÖ»Òª¼ÇסHTMLÖ»ÊÇ´úÂë´´½¨DOMµÄÒ»ÖÖÓï·¨ÐÎʽ£¬¾ÍºÜÈÝÒ×Àí½âJSX¡£¶øÕâÖÖʹÓôúÂë¹¹½¨½çÃæµÄ·½Ê½£¬ÍêÈ«Ïû³ýÁËÒµÎñÂß¼ºÍ½çÃæÔªËØÖ®¼äµÄ¸ôºÒ£¬ÈôúÂë¸ü¼ÓÖ±¹ÛºÍÒ×ÓÚά»¤¡£
JSXµÄÓï·¨
JSX±¾Éí¾ÍºÍXMLÓï·¨ÀàËÆ£¬¿ÉÒÔ¶¨ÒåÊôÐÔÒÔ¼°×ÓÔªËØ¡£Î¨Ò»ÌØÊâµÄÊÇ¿ÉÒÔÓôóÀ¨ºÅÀ´¼ÓÈëJavaScript±í´ïʽ£¬ÀýÈ磺
var person = <Person name={window.isLoggedIn ? window.name : ''} />; |
Ò»°ãÿ¸ö×é¼þ¶¼¶¨ÒåÁËÒ»×éÊôÐÔ£¨props£¬propertiesµÄ¼òд£©½ÓÊÕÊäÈë²ÎÊý£¬ÕâЩÊôÐÔͨ¹ýXML±ê¼ÇµÄÊôÐÔÀ´Ö¸¶¨¡£´óÀ¨ºÅÖеÄÓï·¨¾ÍÊÇ´¿JavaScript±í´ïʽ£¬·µ»ØÖµ»á¸³Óè×é¼þµÄ¶ÔÓ¦ÊôÐÔ£¬Òò´Ë¿ÉÒÔʹÓÃÈκÎJavaScript±äÁ¿»òÕߺ¯Êýµ÷Óá£ÉÏÊö´úÂë¾¹ýJSX±àÒëºó»áµÃµ½£º
var person = React.createElement( Person, {name: window.isLoggedIn ? window.name : ''} ); |
¶ÔÓÚ×ÓÔªËØÒ²ÊÇÀàËÆ£¬´óÀ¨ºÅÖÐʹÓÃJavaScript±í´ïʽÀ´·µ»ØÐèÒªÕ¹ÏÖµÄÔªËØ£¬ÀýÈçÎÄÕ¿ªÍ·Ìáµ½µÄÀý×ÓʹÓÃJSX¿ÉÒÔд³É£º
var node = ( <div className="container"> { person ? <span>Welcome back, <b>{person.firstName} {person.lastName}</b>!</span> : <span>Please log in</span> } </div> ); |
¼ÈÈ»´óÀ¨ºÅÖÐÊÇJavaScript£¬¶øJSXÓÖÔÊÐíÔÚJavaScriptÖÐʹÓÃXML£¬Òò´ËÔÚ´óÀ¨ºÅÖÐÈÔÈ»¿ÉÒÔʹÓÃXMLÀ´ÉùÃ÷×é¼þ£¬²»¶ÏµÝ¹éʹÓá£
Èç¹ûÐèÒªÕ¹ÏÖÒ»×é×ӽڵ㣬ֻÐè±í´ïʽ·µ»ØÒ»¸öJavaScriptÊý×飬Êý×éµÄÿ¸öÔªËØ¶¼ÊÇÒ»¸öReact×é¼þ£¬ÀýÈçÉÏÒ»½ÚµÄÀý×Ó£¬ÆäÖÐlis¾ÍÊÇÓжà¸ö¡°li¡±ÔªËصÄÊý×é¡££º
var ul = ( <ul class="unstyled"> {lis} </ul> ); |
ÔÚJSXÖÐʹÓÃʼþ
Èç¹ûÄãÔÚ90Äê´úд¹ýHTML£¬ÄÇôҲÐí»áÓе㻳ÄîÄÇʱµÄʼþ°ó¶¨ÊǶàôµÄÖ±¹ÛºÍ¼òµ¥£º
<button onclick="checkAndSubmit(this.form)">Submit</button> |
ÄÇʱµÄJavaScriptÓ¦Ó÷¶Î§·Ç³£ÓÐÏÞ£¬×îÓÐÓõÄÒ²Ðí¾ÍÊÇ×ö±íµ¥ÓÐЧÐÔÑéÖ¤¡£ÒòΪÂß¼¶¼ºÜ¼òµ¥£¬Ö±½Óдµ½HTMLÖв¢Ã»ÓÐÎÊÌ⣬¶øÇÒÕâÖÖ·½Ê½·Ç³£Ö±¹ÛÒ×¶Á¡£µ«ÊÇÏÖÔÚÒòΪWeb³ÌÐò±äµÄÔ½À´Ô½¸´ÔÓ£¬ÎÒÃǾÍÐèҪʹÓÃJavaScriptÀ´°ó¶¨Ê¼þ£¬ÀýÈçÔÚjQueryÖУº
$('#my-button').on('click', this.checkAndSubmit.bind(this)); |
ÔÚ¿´µ½Õâ¶Îʼþ°ó¶¨ºÍÑéÖ¤Â߼֮ǰ£¬ÄãÎÞ·¨Ö±¹ÛµÄ¿´µ½ÓÐʼþ°ó¶¨ÔÚij¸öÔªËØÉÏ£¬ÕâÖÖÒþ²ØµÄ½çÃæÔªËØºÍÒµÎñÂß¼µÄñîºÏÊǺܶàBugºÍÄÚ´æÐ¹Â¶²úÉúµÄ¸ùÔ´¡£ÐÒÔ˵ÄÊÇ£¬ÏÖÔÚJSX¿ÉÒÔÈÃʼþ°ó¶¨·µè±¹éÕæ£º
<button onClick={this.checkAndSubmit.bind(this)}>Submit</button> |
ºÍÔÉúHTML¶¨ÒåʼþµÄÎ¨Ò»Çø±ð¾ÍÊÇJSX²ÉÓÃÍÕ·åд·¨À´ÃèÊöʼþÃû³Æ£¬´óÀ¨ºÅÖÐÈÔÈ»ÊDZê×¼µÄJavaScript±í´ïʽ£¬·µ»ØÒ»¸öʼþ´¦Àíº¯Êý¡£ÔÚJSXÖÐÄã²»ÐèÒª¹ØÐÄʲôʱ»úÈ¥ÒÆ³ýʼþ°ó¶¨£¬ÒòΪReact»áÔÚ¶ÔÓ¦µÄÕæÊµDOM½ÚµãÒÆ³ýʱ¾Í×Ô¶¯½â³ýÁËʼþ°ó¶¨¡£
React²¢²»»áÕæÕýµÄ°ó¶¨Ê¼þµ½Ã¿Ò»¸ö¾ßÌåµÄÔªËØÉÏ£¬¶øÊDzÉÓÃʼþ´úÀíµÄģʽ£ºÔÚ¸ù½ÚµãdocumentÉÏΪÿÖÖʼþÌí¼ÓΨһµÄListener£¬È»ºóͨ¹ýʼþµÄtargetÕÒµ½ÕæÊµµÄ´¥·¢ÔªËØ¡£ÕâÑù´Ó´¥·¢ÔªËص½¶¥²ã½ÚµãÖ®¼äµÄËùÓнڵãÈç¹ûÓаó¶¨Õâ¸öʼþ£¬React¶¼»á´¥·¢¶ÔÓ¦µÄʼþ´¦Àíº¯Êý¡£Õâ¾ÍÊÇËùνµÄReactÄ£Äâʼþϵͳ¡£
¾¡¹ÜÕû¸öʼþϵͳÓÉReact¹ÜÀí£¬µ«ÊÇÆäAPIºÍʹÓ÷½·¨ÓëÔÉúʼþÒ»Ö¡£ÕâÖÖ»úÖÆÈ·±£ÁË¿çä¯ÀÀÆ÷µÄÒ»ÖÂÐÔ£ºÔÚËùÓÐä¯ÀÀÆ÷£¨IE8¼°ÒÔÉÏ£©¶¼¿ÉÒÔʹÓ÷ûºÏW3C±ê×¼µÄAPI£¬°üÀ¨stopPropagation()£¬preventDefault()µÈµÈ¡£¶ÔÓÚʼþµÄðÅÝ£¨bubble£©ºÍ²¶»ñ£¨capture£©Ä£Ê½Ò²¶¼Íêȫ֧³Ö¡£
ÔÚJSXÖÐʹÓÃÑùʽ
¾¡¹ÜÔڴ󲿷ֳ¡¾°ÏÂÎÒÃÇÓ¦¸Ã½«ÑùʽдÔÚ¶ÀÁ¢µÄCSSÎļþÖУ¬µ«ÊÇÓÐʱ¶ÔÓÚij¸öÌØ¶¨×é¼þ¶øÑÔ£¬ÆäÑùʽÏ൱¼òµ¥¶øÇÒ¶ÀÁ¢£¬ÄÇôҲ¿ÉÒÔ½«ÆäÖ±½Ó¶¨ÒåÔÚJSXÖС£ÔÚJSXÖÐʹÓÃÑùʽºÍÕæÊµµÄÑùʽҲºÜÀàËÆ£¬Í¨¹ýstyleÊôÐÔÀ´¶¨Ò壬µ«ºÍÕæÊµDOM²»Í¬µÄÊÇ£¬ÊôÐÔÖµ²»ÄÜÊÇ×Ö·û´®¶ø±ØÐëΪ¶ÔÏó£¬ÀýÈ磺
<div style={{color: '#ff0000', fontSize: '14px'}}>Hello World.</div> |
Õ§Ò»¿´£¬Õâ¶ÎJSXÖеĴóÀ¨ºÅÊÇË«µÄ£¬ÓÐµãÆæ¹Ö£¬µ«Êµ¼ÊÉÏÀïÃæµÄ´óÀ¨ºÅÖ»ÊDZê×¼µÄJavaScript¶ÔÏó±í´ïʽ£¬ÍâÃæµÄ´óÀ¨ºÅÊÇJSXµÄÓï·¨¡£ËùÒÔ£¬ÑùʽÄãÒ²¿ÉÒÔÏȸ³Öµ¸øÒ»¸ö±äÁ¿£¬È»ºó´«½øÈ¥£¬´úÂë»á¸üÒ×¶Á£º
var style = { color: '#ff0000', fontSize: '14px' };var node = <div style={style}>HelloWorld.</div>;
|
ÔÚJSXÖпÉÒÔʹÓÃËùÓеĵÄÑùʽ£¬»ù±¾ÉÏÊôÐÔÃûµÄת»»¹æ·¶¾ÍÊǽ«Æäд³ÉÍÕ·åд·¨£¬ÀýÈç¡°background-color¡±±äΪ¡°backgroundColor¡±,
¡°font-size¡±±äΪ¡°fontSize¡±£¬ÕâºÍ±ê×¼µÄJavaScript²Ù×÷DOMÑùʽµÄAPIÊÇÒ»Öµġ£
ʹÓÃ×Ô¶¨Òå×é¼þ
ÔÚJSXÖУ¬ÎÒÃDz»½ö¿ÉÒÔʹÓÃReact×Ô´ødiv, input...ÕâЩÐéÄâDOMÔªËØ£¬»¹¿ÉÒÔ×Ô¶¨Òå×é¼þ¡£×é¼þ¶¨ÒåÖ®ºó£¬Ò²¶¼¿ÉÒÔÀûÓÃXMLÓ﷨ȥÉùÃ÷£¬¶øÄܹ»Ê¹ÓõÄXML
Tag¾ÍÊÇÔÚµ±Ç°JavaScriptÉÏÏÂÎĵıäÁ¿Ãû£¬ÕâÒ»µã·Ç³£ºÃÓã¬Äã²»±ØÔÙÈ¥¿¼ÂÇij¸öTagÊÇÈçºÎ¶ÔÓ¦µ½ÏàÓ¦µÄ×é¼þʵÏÖ¡£ÀýÈçReact¹Ù·½½Ì³ÌÖеÄÀý×Ó£º
class HelloWorld extends React.Component{ render() { return ( <p> Hello, <input type="text" placeholder="Your name here" />! It is {this.props.date.toTimeString()} </p> ); } };
setInterval(function() {
React.render(
<HelloWorld date={new Date()} />,
document.getElementById('example')
);
}, 500); |
ÆäÖÐÉùÃ÷ÁËÒ»¸öÃûΪHelloWorldµÄ×é¼þ£¬ÄÇô¾Í¿ÉÒÔÔÚXMLÖÐʹÓÃ<HellWorld />£¬Õâ¸öTag¾ÍÊÇJavaScript±äÁ¿Ãû£¬ÎÒÃÇ¿ÉÒÔÓÃÈÎÒâ±äÁ¿Ãû£º
var MyHelloWorld = HelloWorld; React.render(<MyHelloWorld />, ¡); |
ÉõÖÁ£¬ÎÒÃÇ»¹¿ÉÒÔÒýÈëÃüÃû¿Õ¼ä£º
var sampleNameSpace = { MyHelloWorld: HelloWorld }; React.render(<sampleNameSpace.MyHelloWorld />, ¡); |
ÕâЩÓï·¨¿´ÉÏÈ¥Óеã¹Ö£¬µ«ÊÇÈç¹ûÎÒÃǼÇסJSXÓï·¨Ö»ÊÇJavaScriptÓï·¨µÄÒ»¸öÓï·¨Ó³É䣬ÄÇôÕâЩ¾Í·Ç³£ÈÝÒ×Àí½âÁË¡£
×é¼þµÄ¸ÅÄîºÍÉúÃüÖÜÆÚ
ReactʹÓÃ×é¼þÀ´·â×°½çÃæÄ£¿é£¬Õû¸ö½çÃæ¾ÍÊÇÒ»¸ö´ó×é¼þ£¬¿ª·¢¹ý³Ì¾ÍÊDz»¶ÏÓÅ»¯ºÍ²ð·Ö½çÃæ×é¼þ¡¢¹¹ÔìÕû¸ö×é¼þÊ÷µÄ¹ý³Ì¡£¿ÉÒÔÈÏΪ×é¼þÀàËÆÓÚÆäËû¿ò¼ÜÖÐWidget£¨»òControl£©µÄ¸ÅÄµ«ÓÖÓÐËù²»Í¬¡£ReactÖеĽçÃæÒ»ÇнÔΪ×é¼þ£¬¶øWidgetÒ»°ãÖ»ÊÇǶÈëµ½½çÃæÖÐΪÍê³Éij¸ö¹¦ÄܵĶÀÁ¢Ä£¿é¡£
ÈçÏÂͼ£¬Õû¸öÒ³ÃæÊÇÒ»¸ö´óµÄ×é¼þ£¬È»ºóÔÙ½«Æä²ð·Ö³ÉºÜ¶àСµÄ×é¼þ¡£×é¼þ»úÖÆ¼ÓÉÏJSXµÄÓï·¨£¬ÈÃÄãÔÚ¹¹Ôì½çÃæÊ±¾ÍÏñÓÐÒ»Ì×·ûºÏÏîÄ¿ÐèÇóµÄHTML±ê¼Ç£¬½çÃæ¶¨Òå±äµÃ·Ç³£Ö±¹Û¡£

×é¼þ×ÔÉí¶¨ÒåÁËÒ»×éprops×÷Ϊ¶ÔÍâ½Ó¿Ú£¬Õ¹Ê¾Ò»¸ö×é¼þʱֻÐèÒªÖ¸¶¨props×÷ΪXML½ÚµãµÄÊôÐÔ¡£×é¼þºÜÉÙÐèÒª¶ÔÍ⹫¿ª·½·¨£¬Î¨Ò»µÄ½»»¥Í¾¾¶¾ÍÊÇprops¡£ÕâʹµÃʹÓÃ×é¼þ¾ÍÏñʹÓú¯ÊýÒ»Ñù¼òµ¥£¬¸ø¶¨Ò»¸öÊäÈ룬×é¼þ¸ø¶¨Ò»¸ö½çÃæÊä³ö¡£µ±¸øÓèµÄ²ÎÊýÒ»¶¨Ê±£¬ÄÇôÊä³öÒ²ÊÇÒ»¶¨µÄ¡£¶ø´«Í³¿Ø¼þͨ³£ÌṩºÜ¶à·½·¨ÈÃÄãÔÚÍⲿ¸Ä±ä¿Ø¼þµÄ״̬ºÍÐÐΪ£¬µ±¿Ø¼þµÄ״̬ÔÚ²»Í¬³¡¾°²»Í¬Âß¼ÖпÉÒÔ±»ËæÒâ¿ØÖÆÊ±£¬¿ª·¢ºÍµ÷ÊÔÒ²»á±äµÃ¸´ÔÓ¡£
¶øReact×é¼þͨ¹ýΨһµÄprops½Ó¿Ú±ÜÃâÁËÂß¼¸´ÔÓÐÔ£¬Èÿª·¢²âÊÔ¶¼¸ü¼ÓÈÝÒס£ÕâÖÖÌØÐÔÍêÈ«µÃÒæÓÚÐéÄâDOM»úÖÆ£¬ÈÃÄã¿ÉÒÔÿ´Îprops¸Ä±ä¶¼ÄÜÒÔÕûÌåË¢ÐÂÒ³ÃæµÄ˼·ȥ¿¼ÂǽçÃæÕ¹ÏÖÂß¼¡£
Èç¹ûÕû¸öÏîÄ¿ÍêÈ«²ÉÓÃReact£¬ÄÇô½çÃæÉϾÍÖ»ÓÐÒ»¸ö×é¼þ¸ù½Úµã£»Èç¹û¾Ö²¿Ê¹ÓÃReact£¬ÄÇôÿ¸ö¾Ö²¿Ê¹ÓõIJ¿·Ö¶¼ÓÐÒ»¸ö¸ù½Úµã¡£ÔÚRenderʱ£¬¸ù½ÚµãÓÉReact.renderº¯ÊýÈ¥´¥·¢£º
React.render( <App />, document.getElementById('react-root') ); |
¶øËùÓеÄ×Ó½ÚµãÔò¶¼ÊÇͨ¹ý¸¸½ÚµãµÄrender·½·¨È¥¹¹ÔìµÄ¡£Ã¿¸ö×é¼þ¶¼»áÓÐÒ»¸örender·½·¨£¬Õâ¸ö·½·¨·µ»Ø×é¼þµÄʵÀý£¬×îÖÕÕû¸ö½çÃæµÃµ½Ò»¸öÐéÄâDOMÊ÷£¬ÔÙÓÉReactÒÔ×î¸ßЧµÄ·½Ê½Õ¹ÏÖÔÚ½çÃæÉÏ¡£
³ýÁËpropsÖ®Í⣬×é¼þ»¹ÓÐÒ»¸öºÜÖØÒªµÄ¸ÅÄstate¡£×é¼þ¹æ·¶Öж¨ÒåÁËsetState·½·¨£¬Ã¿´Îµ÷ÓÃʱ¶¼»á¸üÐÂ×é¼þµÄ״̬£¬´¥·¢render·½·¨¡£ÐèҪעÒ⣬render·½·¨ÊDZ»Òì²½µ÷Óõģ¬Õâ¿ÉÒÔ±£Ö¤Í¬²½µÄ¶à¸ösetState·½·¨Ö»»á´¥·¢Ò»´Îrender£¬ÓÐÀûÓÚÌá¸ßÐÔÄÜ¡£ºÍprops²»Í¬£¬stateÊÇ×é¼þµÄÄÚ²¿×´Ì¬£¬³ýÁ˳õʼ»¯Ê±¿ÉÄÜÓÉpropsÀ´¾ö¶¨£¬Ö®ºó¾ÍÍêÈ«ÓÉ×é¼þ×ÔÉíȥά»¤¡£ÔÚ×é¼þµÄÕû¸öÉúÃüÖÜÆÚÖУ¬ReactÇ¿ÁÒ²»ÍƼöÈ¥ÐÞ¸Ä×ÔÉíµÄprops£¬ÒòΪÕâ»áÆÆ»µUIºÍModelµÄÒ»ÖÂÐÔ£¬propsÖ»Äܹ»ÓÉʹÓÃÕßÀ´¾ö¶¨¡£
¶ÔÓÚ×Ô¶¨Òå×é¼þ£¬Î¨Ò»±ØÐëʵÏֵķ½·¨¾ÍÊÇrender()£¬³ý´ËÖ®Í⣬»¹ÓÐһЩ·½·¨»áÔÚ×é¼þÉúÃüÖÜÆÚÖб»µ÷Óã¬ÈçÏÂͼËùʾ£º

ͼÖеķ½·¨¼¸ºõÒѾ°üÀ¨ÁËReactµÄËùÓÐAPI£¬×Ô¶¨Òå×é¼þʱ¸ù¾ÝÐèÒªÔÚ×é¼þÉúÃüÖÜÆÚµÄ²»Í¬½×¶ÎʵÏÖ²»Í¬µÄÂß¼¡£³ýÁ˱ØÐëµÄrender·½·¨Ö®Í⣬ÆäËü³£Óõķ½·¨°üÀ¨£º
componentDidMount: ÔÚ×é¼þµÚÒ»´ÎrenderÖ®ºóµ÷Óã¬Õâʱ×é¼þ¶ÔÓ¦µÄDOM½ÚµãÒѱ»¼ÓÈëµ½ä¯ÀÀÆ÷¡£ÔÚÕâ¸ö·½·¨Àï¿ÉÒÔȥʵÏÖһЩ³õʼ»¯Âß¼¡£
componentWillUnmount: ÔÚDOM½ÚµãÒÆ³ýÖ®ºó±»µ÷Óã¬ÕâÀï¿ÉÒÔ×öһЩÏà¹ØµÄÇåÀí¹¤×÷¡£
shouldComponentUpdate: ÕâÊÇÒ»¸öºÍÐÔÄܷdz£Ïà¹ØµÄ·½·¨£¬ÔÚÿһ´Îrender·½·¨Ö®Ç°±»µ÷Óá£ËüÌṩÁËÒ»¸ö»ú»áÈÃÄã¾ö¶¨ÊÇ·ñÒª¶Ô×é¼þ½øÐÐʵ¼ÊµÄrender¡£ÀýÈ磺
shouldComponentUpdate(nextProps, nextState) { return nextProps.id !== this.props.id; } |
µ±´Ëº¯Êý·µ»Øfalseʱ£¬×é¼þ¾Í²»»áµ÷ÓÃrender·½·¨´Ó¶ø±ÜÃâÁËÐéÄâDOMµÄ´´½¨ºÍÄÚ´æÖеÄDiff±È½Ï£¬´Ó¶øÓÐÖúÓÚÌá¸ßÐÔÄÜ¡£µ±·µ»Øtrueʱ£¬Ôò»á½øÐÐÕý³£µÄrenderµÄÂß¼¡£
×é¼þÊÇReactµÄºËÐÄ£¬ËäÈ»¹¦ÄܺÜÇ¿´ó£¬µ«ÊÇÆäAPIºÍ¸ÅÄîÈ´Ê®·Ö¼òµ¥£¬ÒÔÖÁÓÚÄãֻҪʵÏÖÒ»¸örender·½·¨¾Í¿ÉÒÔ´´½¨Ò»¸ö×é¼þ¡£Õâ´ó´ó½µµÍÁËReactѧϰÃż÷¡£
ʹÓÃBabel½øÐÐJSX±àÒë
¾ÍÔÚ±¾ÎÄ׫д¹ý³ÌÖУ¬React¹Ù·½²©¿Í·¢²¼ÁËһƪÎÄÕ£¬ÉùÃ÷Æä×ÔÉíÓÃÓÚJSXÓï·¨½âÎöµÄ±àÒëÆ÷JSTransformÒѾ¹ýÆÚ£¬²»ÔÙά»¤£¬React
JSºÍReact NativeÒѾȫ²¿²ÉÓõÚÈý·½BabelµÄJSX±àÒëÆ÷ʵÏÖ¡£ÔÒòÊÇÁ½ÕßÔÚ¹¦ÄÜÉÏÒѾÍêÈ«ÖØ¸´£¬¶øBabel×÷ΪרÃŵÄJavaScriptÓï·¨±àÒ빤¾ß£¬ÌṩÁ˸üΪǿ´óµÄ¹¦ÄÜ¡£ÔÚÕâÀï±ÊÕßÒ²²»µÃ²»¸Ð̾FacebookµÄÐØ»³£¬ÒԷdz£¿ª·ÅµÄ̬¶ÈÈ¥Óµ±§¿ªÔ´ÉçÇø£¬´Ó¶ø´ïµ½¹²Ó®µÄÄ¿µÄ¡£
JSXÊÇÒ»ÖÖеÄÓï·¨£¬ä¯ÀÀÆ÷²¢²»ÄÜÖ±½ÓÔËÐУ¬Òò´ËÐèÒªÕâÖÖ·ÒëÆ÷¡£ÔÚÉÏһƪÎÄÕÂÖÐÎÒÃÇÍÆ¼öʹÓÃWebpack½øÐÐReactµÄ¿ª·¢£¬Òª½«JSXµÄ±àÒëÆ÷´ÓJSTransformÇл»µ½Babel·Ç³£¼òµ¥£¬Ê×ÏÈͨ¹ýnpm°²×°Babel£º
npm install ¡ªsave-dev babel-loader |
Ö»ÐèÉÔ΢¸Ä±äÒ»ÏÂwebpack.config.jsµÄÅäÖ㬽«ÔÀ´µÄjsx-loader±äΪbabel-loader£º
module: { loaders: [ { test: /\.jsx?$/, loaders: ['babel-loader']} ] } |
С½á
±¾ÎÄÖ÷Òª½éÉÜÁËReactÖÐ×îÖØÒªµÄ×é¼þ»úÖÆ£¬ÒÔ¼°ÉùÃ÷×é¼þµÄÓï·¨JSX¡£¿´ËÆÓеãÉñÃØµÄJSX±³ºóµÄÔÀí·Ç³£¼òµ¥£ºÖ»ÊÇÒ»ÖÖÓÃÓÚ´´½¨×é¼þµÄXMLÓï·¨¡£ÈôúÂëÖ±¹ÛÒ×¶®ÊÇÈí¼þÏîÄ¿ÖÊÁ¿µÄÖØÒª±£Ö¤Ö®Ò»£¬ÕâÒâζ×Å´úÂë¸ü¼ÓÈÝÒ×Àí½âºÍά»¤£¬³öÏÖBugʱ¸üÈÝÒ×µ÷ÊÔºÍÐÞ¸´¡£Òò´ËReactÕâÖÖ²ÉÓÃJSXÓï·¨£¬ÒÔÉùÃ÷ʽµÄ·½·¨À´Ö±¹ÛµÄ¶¨ÒåÓû§½çÃæµÄ·½Ê½£¬ÕýÊÇÆä×î´óµÄ¼ÛÖµ¡£
Õû¸ö×é¼þ»úÖÆÔËÐеĻù´¡ÊÇÐéÄâDOM£¬ÕýÒòΪReactÄܹ»ÒÔ¼«¸ßµÄÐÔÄÜÈ¥±È½ÏÁ½¸öÐéÄâDOMÊ÷µÄDiff£¬²ÅʵÏÖÁËÿ´Î¾Ö²¿¸üж¼Í¨¹ýË¢ÐÂÕû¸öÒ³ÃæÕâÖÖ˼¿¼Ä£Ê½£¬½µµÍÁË¿ª·¢¸´ÔÓ¶È¡£ÔÚÏÂһƪÎÄÕÂÖоͽ«»áºÍ´ó¼ÒÒ»ÆðÑо¿ÐéÄâDOMµÄDiffËã·¨£¬Á˽âÆä±³ºóµÄÔËÐÐÔÀí¡£
|