React
Native ÊÇ×î½ü·Ç³£»ðµÄÒ»¸ö»°Ì⣬½éÉÜÈçºÎÀûÓà React Native ½øÐпª·¢µÄÎÄÕºÍÊé¼®¶àÈçţ룬µ«ÃæÏòÈëÃÅˮƽ²¢½éÉÜËü¹¤×÷ÔÀíµÄÎÄÕÂÈ´ÁÈÁÈÎÞ¼¸¡£
±¾ÎÄ·ÖΪÁ½¸ö²¿·Ö£ºÉϰ벿·ÖÓÃͨË×µÄÓïÑÔ½âÊÍÁËÏà¹ØµÄÃû´Ê£¬Öصã½éÉÜ React Native ³öÏֵı³¾°ºÍÊÔͼ½â¾öµÄÎÊÌâ¡£ÊʺÏÐÂÊÖ¶Ô
React Native Ðγɳõ²½Á˽⡣(ÊÂʵ֤Ã÷£¬Å®Æ±ÄÜ¿´¶®Õâ¶Î£©
ϰ벿·ÖÔòͨ¹ýÔ´Â루0.27 °æ±¾£©·ÖÎö React Native µÄ¹¤×÷ÔÀí£¬ÊʺÏÉîÈëѧϰÀí½â React
Native µÄÔËÐлúÖÆ¡£×îºóÔòÊÇÎÒ¸öÈË¶Ô React Native µÄ·ÖÎöÓëǰ¾°Åжϡ£
¶¯Ì¬ÅäÖÃ
ÓÉÓÚ AppStore ÉóºËÖÜÆÚµÄÏÞÖÆ£¬ÈçºÎ¶¯Ì¬µÄ¸ü¸Ä app ³ÉΪÁËÓÀºãµÄ»°Ìâ¡£ÎÞÂÛ²ÉÓúÎÖÖ·½Ê½£¬ÎÒÃǵÄÁ÷³Ì×ÜÊÇ¿ÉÒÔ¹é½áΪÒÔÏÂÈý²¿Çú£º¡°´Ó
Server »ñÈ¡ÅäÖà --> ½âÎö --> Ö´ÐÐnative´úÂ롱¡£
ºÜ¶àʱºò£¬ÎÒÃÇ×Ô¾õ»òÕß²»×Ô¾õµÄÀûÓà JSON ÎļþʵÏÖ¶¯Ì¬ÅäÖõÄЧ¹û£¬ËüµÄºËÐÄÁ÷³ÌÊÇ£º
ͨ¹ý HTTP ÇëÇó»ñÈ¡ JSON ¸ñʽµÄÅäÖÃÎļþ¡£
ÅäÖÃÎļþÖбê¼ÇÁËÿһ¸öÔªËØµÄÊôÐÔ£¬±ÈÈçλÖã¬ÑÕÉ«£¬Í¼Æ¬ URL µÈ¡£
½âÎöÍê JSON ºó£¬ÎÒÃǵ÷Óà Objective-C µÄ´úÂ룬Íê³É UI ¿Ø¼þµÄäÖȾ¡£
ͨ¹ýÕâÖÖ·½·¨£¬ÎÒÃÇʵÏÖÁËÔÚºǫ́ÅäÖà app µÄչʾÑùʽ¡£´Ó±¾ÖÊÉÏÀ´Ëµ£¬Òƶ¯¶ËºÍ·þÎñ¶ËÔ¼¶¨ÁËÒ»Ì×ÐÒ飬µ«ÊÇÐÒéÄÚÈÝÑÏÖØÒÀÀµÓÚÓ¦ÓÃÄÚҪչʾµÄÄÚÈÝ£¬²»ÀûÓÚÍØÕ¹¡£Ò²¾ÍÊÇ˵£¬Èç¹ûÒµÎñÒªÇ󯵷±µÄÔö¼Ó»òÐÞ¸ÄÒ³Ãæ£¬ÕâÌ×ÐÒéºÜÄÑÓ¦¸¶¡£
×îÖØÒªµÄÊÇ£¬JSON Ö»ÊÇÒ»ÖÖÊý¾Ý½»»»µÄ¸ñʽ£¬Ëµ°×ÁË£¬ÎÒÃǾÍÊÇÔÚ½âÎöÎı¾Êý¾Ý¡£Õâ¾ÍÒâζ×ÅËüÖ»ÊʺÏÌṩһЩÅäÖÃÐÅÏ¢£¬¶ø²»·½±ãÌṩÂß¼ÐÅÏ¢¡£¾Ù¸öÀý×Ó£¬ÎÒÃÇ´Óºǫ́¿ÉÒÔÅäÖÃÑÕÉ«£¬Î»ÖõÈÐÅÏ¢£¬µ«Èç¹ûÏëÒª¿ØÖÆ
app ÄÚµÄÒµÎñÂß¼£¬¾Í·Ç³£¸´ÔÓÁË¡£
¼Çס£¬ÎÒÃÇÖ»ÊÇÔÚ½âÎö×Ö·û´®£¬ËüÍêÈ«²»¾ß±¸ÔËÐк͵÷ÊÔµÄÄÜÁ¦¡£
React
²»·ÁÔÝʱÅׯúÒÆ¶¯¶ËµÄ·³ÄÕ£¬À´¿´¿´Ç°¶ËµÄ¡°ÐÂÍæÒ⡱¡£
±³¾°
×÷Ϊǰ¶ËС°×£¬ÎÒÒÔǰ¶Ôǰ¶ËµÄÀí½âÊÇÕâÑùµÄ£º
Óà HTML ´´½¨ DOM£¬¹¹½¨Õû¸öÍøÒ³µÄ²¼¾Ö¡¢½á¹¹
Óà CSS ¿ØÖÆ DOM µÄÑùʽ£¬±ÈÈç×ÖÌå¡¢×ֺš¢ÑÕÉ«¡¢¾ÓÖеÈ
Óà JavaScript ½ÓÊÜÓû§Ê¼þ£¬¶¯Ì¬µÄ²Ù¿Ø DOM
ÔÚÕâÈýÕßµÄÅäºÏÏ£¬¼¸ºõËùÓÐÒ³ÃæÉϵŦÄܶ¼ÄÜʵÏÖ¡£µ«Ò²ÓбȽϲ»Ë¬µØ·½£¬±ÈÈçÎÒÏ붯̬ÐÞ¸ÄÒ»¸ö°´Å¥µÄÎÄ×Ö£¬ÎÒÐèÒªÕâÑùд£º
<button type="button" id="button" onclick="onClick()">old button</button> |
È»ºóÔÚ JavaScript ÖвÙ×÷ DOM£º
<script> function onClick() { document.getElementById('button').innerHTML='new button'; } </script> |
¿ÉÒÔ¿´µ½£¬ÔÚ HTML ºÍ JavaScript ´úÂëÖУ¬id ºÍ onclick ʼþ´¥·¢µÄº¯Êý±ØÐëÍêÈ«¶ÔÓ¦£¬·ñÔò¾ÍÎÞ·¨ÕýÈ·µÄÏìӦʼþ¡£Èç¹ûÏëÖªµÀÒ»¸ö
HTML ±êÇ©»áÈçºÎ±»ÏìÓ¦£¬ÎÒÃÇ»¹µÃÅÜÈ¥ JavaScript ´úÂëÖвéÕÒ£¬ÕâÖÖÔʼµÄÅäÖ÷½Ê½ÈÃÎÒ¾õµÃ·Ç³£²»Ë¬¡£
³õʶ React
Ëæ×Å FaceBook ÍÆ³öÁË React ¿ò¼Ü£¬Õâ¸öÎÊÌâµÃµ½ÁË´ó·ù¶È¸ÄÉÆ¡£ÎÒÃÇ¿ÉÒÔ°ÑÒ»×éÏà¹ØµÄ HTML
±êÇ©£¬Ò²¾ÍÊÇ app ÄÚµÄ UI ¿Ø¼þ£¬·â×°½øÒ»¸ö×é¼þ(Component)ÖУ¬ÎÒ´ÓÈîÒ»·åµÄ React
½Ì³ÌÖÐժ¼ÁËÒ»¶Î´úÂ룺
var MyComponent = React.createClass({ handleClick: function() { this.refs.myTextInput.focus(); }, render: function() { return ( <div> <input type="text" ref="myTextInput" /> <input type="button" value=" Focus the text input" onClick={this.handleClick} /> </div> ); } }); |
Èç¹ûÄãÏëÎÊ£º¡°ÎªÊ²Ã´ JavaScript ´úÂëÀïÃæ³öÏÖÁË HTML µÄÓï·¨¡±£¬ÄÇô¹§Ï²ÄãÒѾ³õ²½Ìå»áµ½
React µÄ°ÂÃîÁË¡£ÕâÖÖÓï·¨±»³ÆÎª JSX£¬ËüÊÇÒ»ÖÖ JavaScript Óï·¨ÍØÕ¹¡£JSX ÔÊÐíÎÒÃÇд
HTML ±êÇ©»ò React ±êÇ©£¬ËüÃÇÖÕ½«±»×ª»»³ÉÔÉúµÄ JavaScript ²¢´´½¨ DOM¡£
ÔÚ React ¿ò¼ÜÖУ¬³ýÁË¿ÉÒÔÓà JavaScript д HTML ÒÔÍ⣬ÎÒÃÇÉõÖÁ¿ÉÒÔд CSS£¬ÕâÔÚºóÃæµÄÀý×ÓÖпÉÒÔ¿´µ½¡£
Àí½â React
ǰ¶Ë½ç×ÜÊÇϲ»¶´´ÔìеĸÅÄ·Â·ðË˵µÄÃû´Ê¸ü»Þɬ£¬ËµÄˮƽ¾ÍÔ½¸ß¡£Èç¹ûÄãºÍµ±Ê±µÄÎÒÒ»Ñù£¬Ìýµ½ React
Õâ¸ö¸ÅÄîÒ»Á³ã±Ƶϰ£¬Ö»Òª¼ÇסÒÔ϶¨Òå¼´¿É£º
React ÊÇÒ»Ì׿ÉÒÔÓüò½àµÄÓï·¨¸ßЧ»æÖÆ DOM µÄ¿ò¼Ü
ÉÏÎÄÒѾ½âÊ͹ýÁ˺Îν¡°¼ò½àµÄÓï·¨¡±£¬ÒòΪÎÒÃÇ¿ÉÒÔÔÝʱ·ÅÏ HTML ºÍ CSS£¬Ö»¹ØÐÄÈçºÎÓà JavaScript
¹¹ÔìÒ³Ãæ¡£
ËùνµÄ¡°¸ßЧ¡±£¬ÊÇÒòΪ React ¶À´´ÁË Virtual DOM »úÖÆ¡£Virtual DOM ÊÇÒ»¸ö´æÔÚÓÚÄÚ´æÖеÄ
JavaScript ¶ÔÏó£¬ËüÓë DOM ÊÇÒ»Ò»¶ÔÓ¦µÄ¹ØÏµ£¬Ò²¾ÍÊÇ˵ֻҪÓÐ Virtual DOM£¬ÎÒÃǾÍÄÜäÖȾ³ö
DOM¡£
µ±½çÃæ·¢Éú±ä»¯Ê±£¬µÃÒæÓÚ¸ßЧµÄ DOM Diff Ëã·¨£¬ÎÒÃÇÄܹ»ÖªµÀ Virtual DOM µÄ±ä»¯£¬´Ó¶ø¸ßЧµÄ¸Ä¶¯
DOM£¬±ÜÃâÁËÖØÐ»æÖÆ DOM¡£
µ±È»£¬React ²¢²»ÊÇǰ¶Ë¿ª·¢µÄÈ«²¿¡£´Ó֮ǰµÄÃèÊöÒ²ÄÜ¿´³ö£¬ËüרעÓÚ UI ²¿·Ö£¬¶ÔÓ¦µ½ MVC ½á¹¹ÖоÍÊÇ
View ²ã¡£ÒªÏëʵÏÖÍêÕûµÄ MVC ¼Ü¹¹£¬»¹ÐèÒª Model ºÍ Controller µÄ½á¹¹¡£ÔÚǰ¶Ë¿ª·¢Ê±£¬ÎÒÃÇ¿ÉÒÔ²ÉÓÃ
Flux ºÍ Redux ¼Ü¹¹£¬ËüÃDz¢·Ç¿ò¼Ü(Library)£¬¶øÊÇºÍ MVC Ò»Ñù¶¼ÊÇÒ»Öּܹ¹Éè¼Æ(Architecture)¡£
Èç¹û²»´ÓÊÂǰ¶Ë¿ª·¢£¬¾Í²»ÓÃÉîÈëµÄÕÆÎÕ Flux ºÍ Redux ¼Ü¹¹£¬µ«Àí½âÕâÒ»Ì×Ìåϵ½á¹¹¶ÔÓÚºóÃæÀí½â
React Native ·Ç³£ÖØÒª¡£
React Native
·Ö±ð½éÉÜÍêÁËÒÆ¶¯¶ËºÍǰ¶ËµÄ±³¾°ÖªÊ¶ºó£¬±¾ÎĵÄÖ÷½Ç¡ª¡ªReact Native ÖÕÓÚÒªµÇ³¡ÁË¡£
ÈÚºÏ
Ç°ÃæÎÒÃǽéÉÜÁËÒÆ¶¯¶Ëͨ¹ý JSON Îļþ´«µÝÐÅÏ¢µÄ²»×ãÖ®´¦£ºÖ»ÄÜ´«µÝÅäÖÃÐÅÏ¢£¬ÎÞ·¨±í´ïÂß¼¡£´Ó±¾ÖÊÉϽ²£¬ÕâÊÇÒòΪ
JSON ±Ï¾¹Ö»ÊÇ´¿Îı¾£¬Ëüȱ·¦Ïñ±à³ÌÓïÑÔÄÇÑùµÄÔËÐÐÄÜÁ¦¡£
¶ø React ÔÚǰ¶ËÈ¡µÃÍ»ÆÆÐԳɹ¦ÒÔºó£¬JavaScript ²¼µÀÕßÃÇ¿ªÊ¼ÊÔͼһͳÈý¶Ë¡£ËûÃÇÀûÓÃÁËÒÆ¶¯Æ½Ì¨Äܹ»ÔËÐÐ
JavaScript ´úÂëµÄÄÜÁ¦£¬²¢ÇÒ·¢»ÓÁË JavaScript ²»½ö½ö¿ÉÒÔ´«µÝÅäÖÃÐÅÏ¢£¬»¹¿ÉÒÔ±í´ïÂß¼ÐÅÏ¢µÄÓŵ㡣
µ±Í´µãÓöÉÏÌØµã£¬Á½ÕßÒ»Åļ´ºÏ£¬ÓÚÊǺõ£º
Ò»¸ö»ùÓÚ JavaScript£¬¾ß±¸¶¯Ì¬ÅäÖÃÄÜÁ¦£¬ÃæÏòǰ¶Ë¿ª·¢ÕßµÄÒÆ¶¯¶Ë¿ª·¢¿ò¼Ü£¬React Native£¬µ®ÉúÁË£¡
¿´µ½ÁËô£¬ÕâÊÇÒ»¸öÃæÏòǰ¶Ë¿ª·¢ÕߵĿò¼Ü¡£ËüµÄ×ÚÖ¼ÊÇÈÃǰ¶Ë¿ª·¢ÕßÏñÓà React Ð´ÍøÒ³ÄÇÑù£¬Óà React
Native Ð´ÒÆ¶¯¶ËÓ¦Óá£Õâ¾ÍÊÇΪʲô React Native ×Գƣº
Learn once£¬Write anywhere!
¶ø·ÇºÜ¶à¿çƽ̨ÓïÑÔ£¬ÏîÄ¿Ëù˵µÄ£º
Write once, Run anywhere!
React Native Ï£Íûǰ¶Ë¿ª·¢ÕßѧϰÍê React ºó£¬Äܹ»ÓÃͬÑùµÄÓï·¨¡¢¹¤¾ßµÈ£¬·Ö±ð¿ª·¢°²×¿ºÍ
iOS ƽ̨µÄÓ¦Óò¢ÇÒ²»ÓÃÒ»ÐÐÔÉú´úÂë¡£
Èç¹ûÓÃÒ»¸ö´Ê¸ÅÀ¨ React Native£¬ÄǾÍÊÇ£ºNative °æ±¾µÄ React¡£
ÔÀí¸ÅÊö
React Native ²»ÊǺڿƼ¼£¬ÎÒÃÇдµÄ´úÂë×ÜÊÇÒÔÒ»Öַdz£ºÏÀí£¬¿ÉÒÔ½âÊ͵ķ½Ê½µÄÔËÐÐ×Å£¬Ö»ÊǾø´ó¶àÊýÈËûÓÐÀí½â¶øÒÑ¡£½ÓÏÂÀ´ÎÒÒÔ
iOS ƽ̨ΪÀý£¬¼òµ¥µÄ½âÊÍһϠReact Native µÄÔÀí¡£
Ê×ÏÈÒªÃ÷°×µÄÒ»µãÊÇ£¬¼´Ê¹Ê¹ÓÃÁË React Native£¬ÎÒÃÇÒÀÈ»ÐèÒª UIKit µÈ¿ò¼Ü£¬µ÷ÓõÄÊÇ
Objective-C ´úÂë¡£×ÜÖ®£¬JavaScript Ö»ÊǸ¨Öú£¬ËüÖ»ÊÇÌṩÁËÅäÖÃÐÅÏ¢ºÍÂß¼µÄ´¦Àí½á¹û¡£React
Native Óë Hybrid ÍêȫûÓйØÏµ£¬ËüÖ»²»¹ýÊÇÒÔ JavaScript µÄÐÎʽ¸æËß Objective-C
¸ÃÖ´ÐÐʲô´úÂë¡£
Æä´Î£¬React Native Äܹ»ÔËÐÐÆðÀ´£¬È«¿¿ Objective-C ºÍ JavaScript
µÄ½»»¥¡£¶ÔÓÚûÓнӴ¥¹ý JavaScript µÄÈËÀ´Ëµ£¬·Ç³£ÓбØÒªÀí½â JavaScript ´úÂëÈçºÎ±»Ö´ÐС£
ÎÒÃÇÖªµÀ C ϵÁеÄÓïÑÔ£¬¾¹ý±àÒ룬Á´½ÓµÈ²Ù×÷ºó£¬»áµÃµ½Ò»¸ö¶þ½øÖƸñʽµÄ¿ÉÖ´ÐÐÎÄ£¬ËùνµÄÔËÐгÌÐò£¬ÆäʵÊÇÔËÐÐÕâ¸ö¶þ½øÖƳÌÐò¡£
¶ø JavaScript ÊÇÒ»Öֽű¾ÓïÑÔ£¬Ëü²»»á¾¹ý±àÒë¡¢Á´½ÓµÈ²Ù×÷£¬¶øÊÇÔÚÔËÐÐʱ²Å¶¯Ì¬µÄ½øÐдʷ¨¡¢Óï·¨·ÖÎö£¬Éú³É³éÏóÓï·¨Ê÷(AST)ºÍ×Ö½ÚÂ룬ȻºóÓɽâÊÍÆ÷¸ºÔðÖ´ÐлòÕßʹÓÃ
JIT ½«×Ö½ÚÂëת»¯Îª»úÆ÷ÂëÔÙÖ´ÐС£Õû¸öÁ÷³ÌÓÉ JavaScript ÒýÇæ¸ºÔðÍê³É¡£
Æ»¹ûÌṩÁËÒ»¸ö½Ð×ö JavaScript Core µÄ¿ò¼Ü£¬ÕâÊÇÒ»¸ö JavaScript ÒýÇæ¡£Í¨¹ýÏÂÃæÕâ¶Î´úÂë¿ÉÒÔ¼òµ¥µÄ¸ÐÊÜÒ»ÏÂ
Objective-C ÈçºÎµ÷Óà JavaScript ´úÂ룺
JSContext *context = [[JSContext alloc] init]; JSValue *jsVal = [context evaluateScript:@"21+7"]; int iVal = [jsVal toInt32]; |
ÕâÀïµÄ JSContext Ö¸µÄÊÇ JavaScript ´úÂëµÄÔËÐл·¾³£¬Í¨¹ý evaluateScript
¼´¿ÉÖ´ÐÐ JavaScript ´úÂë²¢»ñÈ¡·µ»Ø½á¹û¡£
JavaScript ÊÇÒ»ÖÖµ¥Ï̵߳ÄÓïÑÔ£¬Ëü²»¾ß±¸×ÔÔËÐеÄÄÜÁ¦£¬Òò´Ë×ÜÊDZ»¶¯µ÷Ó᣺ܶà½éÉÜ React
Native µÄÎÄÕ¶¼»áÌáµ½ ¡°JavaScript Ï̡߳± µÄ¸ÅÄʵ¼ÊÉÏ£¬Ëü±íʾµÄÊÇ Objective-C
´´½¨ÁËÒ»¸öµ¥¶ÀµÄỊ̈߳¬Õâ¸öÏß³ÌÖ»ÓÃÓÚÖ´ÐÐ JavaScript ´úÂ룬¶øÇÒ JavaScript ´úÂëÖ»»áÔÚÕâ¸öÏß³ÌÖÐÖ´ÐС£
Objective-C Óë JavaScript ½»»¥
Ìáµ½ Objective-C Óë JavaScript µÄ½»»¥£¬²»µÃ²»ÍƼö bangÉñµÄÕâÆªÎÄÕ£ºReact
NativeͨÐÅ»úÖÆÏê½â ¡£ËäÈ»ÆäÖв»ÉÙϸ½Ú¶¼ÒѾ¹ýʱ£¬µ«ÊÇÕûÌåµÄ˼·ֵµÃѧϰ¡£
±¾½ÚÖ÷Òª·ÖÎö Objective-C Óë JavaScript ½»»¥Ê±µÄÕûÀíÂß¼ÓëÁ÷³Ì£¬ÏÂÒ»½Ú½«Í¨¹ýÔ´ÂëÀ´·ÖÎö¾ßÌåÔÀí¡£
JavaScript µ÷ÓÃ Objective-C
ÓÉÓÚ JavaScript Core ÊÇÒ»¸öÃæÏò Objective-C µÄ¿ò¼Ü£¬ÔÚ Objective-C
ÕâÒ»¶Ë£¬ÎÒÃÇ¶Ô JavaScript ÉÏÏÂÎÄÖª¸ùÖªµ×£¬¿ÉÒÔºÜÈÝÒ׵ĻñÈ¡µ½¶ÔÏ󣬷½·¨µÈ¸÷ÖÖÐÅÏ¢£¬µ±È»Ò²°üÀ¨µ÷ÓÃ
JavaScript º¯Êý¡£
ÕæÕý¸´ÔÓµÄÎÊÌâÔÚÓÚ£¬JavaScript ²»ÖªµÀ Objective-C ÓÐÄÄЩ·½·¨¿ÉÒÔµ÷Óá£
React Native ½â¾öÕâ¸öÎÊÌâµÄ·½°¸ÊÇÔÚ Objective-C ºÍ JavaScript Á½¶Ë¶¼±£´æÁËÒ»·ÝÅäÖÃ±í£¬ÀïÃæ±ê¼ÇÁËËùÓÐ
Objective-C ±©Â¶¸ø JavaScript µÄÄ£¿éºÍ·½·¨¡£ÕâÑù£¬ÎÞÂÛÊÇÄÄÒ»·½µ÷ÓÃÁíÒ»·½µÄ·½·¨£¬Êµ¼ÊÉÏ´«µÝµÄÊý¾ÝÖ»ÓÐ
ModuleId¡¢MethodId ºÍ Arguments ÕâÈý¸öÔªËØ£¬ËüÃÇ·Ö±ð±íʾÀà¡¢·½·¨ºÍ·½·¨²ÎÊý£¬µ±
Objective-C ½ÓÊÕµ½ÕâÈý¸öÖµºó£¬¾Í¿ÉÒÔͨ¹ý runtime Ψһȷ¶¨Òªµ÷ÓõÄÊÇÄĸöº¯Êý£¬È»ºóµ÷ÓÃÕâ¸öº¯Êý¡£
ÔÙ´ÎÖØÉ꣬ÉÏÊö½â¾ö·½°¸Ö»ÊÇÒ»¸ö³éÏó¸ÅÄ¿ÉÄÜÓëʵ¼ÊµÄ½â¾ö·½°¸ÓÐ΢С²îÒ죬±ÈÈçʵ¼ÊÉÏ Objective-C
ÕâÒ»¶Ë£¬²¢Ã»ÓÐÖ±½Ó±£´æÕâ¸öÄ£¿éÅäÖÃ±í¡£¾ßÌåʵÏÖ½«ÔÚÏÂÒ»½ÚÖÐËæ×ÅÔ´ÂëÒ»Æð·ÖÎö¡£
±Õ°üÓë»Øµ÷
¼ÈȻ˵µ½º¯Êý»¥µ÷£¬ÄÇô¾Í²»µÃ²»Ìáµ½»Øµ÷ÁË¡£¶ÔÓÚ Objective-C À´Ëµ£¬Ö´ÐÐÍê JavaScript
´úÂëÔÙÖ´ÐÐ Objective-C »Øµ÷ºÁÎÞÄѶȣ¬ÄѵãÒÀÈ»ÔÚÓÚ JavaScript ´úÂëµ÷Óà Objective-C
Ö®ºó£¬ÈçºÎÔÚ Objective-C µÄ´úÂëÖУ¬»Øµ÷Ö´ÐÐ JavaScript ´úÂë¡£
Ŀǰ React Native µÄ×ö·¨ÊÇ£ºÔÚ JavaScript µ÷Óà Objective-C ´úÂëʱ£¬×¢²áÒª»Øµ÷µÄ
Block£¬²¢ÇÒ°Ñ BlockId ×÷Ϊ²ÎÊý·¢Ë͸ø Objective-C£¬Objective-C ÊÕµ½²ÎÊýʱ»á´´½¨
Block£¬µ÷ÓÃÍê Objective-C º¯Êýºó¾Í»áÖ´ÐÐÕâ¸ö¸Õ¸Õ´´½¨µÄ Block¡£
Objective-C »áÏò Block Öд«Èë²ÎÊýºÍ BlockId£¬È»ºóÔÚ Block ÄÚ²¿µ÷ÓÃ
JavaScript µÄ·½·¨£¬Ëæºó JavaScript ²éÕÒµ½µ±Ê±×¢²áµÄ Block ²¢Ö´ÐС£
ͼ½â
ºÃ°É£¬Èç¹ûÄãÊÇÐÂÊÖ£¬²¢ÇÒ¼á³Ö¶Áµ½ÁËÕâÀ¹À¼ÆÒѾã±ÆÁË¡£²»Òªµ£ÐÄ£¬Óë JavaScript µÄ½»»¥È·Êµ²»ÊÇÒ»ÏÂ×ÓÄܹ»ÍêÈ«ÀíÇå³þµÄ£¬Äã¿ÉÒÔÏȲο¼Õâ¸öʾÒâͼ£º

½»»¥Á÷³Ì
×¢£º
±¾Í¼ÓÉ bang µÄÎÄÕÂÖеÄͼƬÐ޸ĶøÀ´
±¾Í¼Ö»ÊÇÒ»¸ö¼òµ¥µÄʾÒâͼ£¬²»½¨Òéµ±×öʱÐòͼʹÓã¬Çë²Î¿¼ÏÂÒ»½ÚÔ´Âë·ÖÎö¡£
Objective-C ºÍ JavaScript µÄ½»»¥×ÜÊÇÓÉǰÕß·¢Æð£¬±¾Í¼ÎªÁ˼ò»¯£¬Ê¡ÂÔÁËÕâÒ»²½Öè¡£
React Native Ô´Âë·ÖÎö
ÒªÏëÉîÈëÀí½â React Native µÄ¹¤×÷ÔÀí£¬ÓÐÁ½¸ö²¿·ÖÓбØÒªÔĶÁһϣ¬·Ö±ðÊdzõʼ»¯½×¶ÎºÍ·½·¨µ÷Óý׶Ρ£
ΪÁËÌáÁ¶³ö´úÂëµÄºËÐĺ¬Ò壬ÎÒ»áÔÚ²»¸Ä±ä´úÂëÒâͼµÄ»ù´¡É϶ÔËü×öһЩɾ¸Ä£¬ÒÔ±ãÔĶÁ¡£
дÕâÆªÎÄÕÂÊÇ£¬React Native »¹´¦ÓÚ 0.27 °æ±¾£¬ÓÉÓÚÔÚ 1.0 ֮ǰµÄ±ä¶¯·ù¶ÈÏà¶Ô½Ï´ó£¬Òò´ËÏÂÃæµÄÔ´Âë·ÖÎöºÜ¿ÉÄÜËæ×Å
React Native µÄÑÝ±ä¶ø¹ýʱ¡£µ«²»¹ÜºÎʱ£¬°ÑÏÂÃæµÄÔ´Âë¶ÁÒ»±é¶¼ÓÐÖúÓÚÄã¼ÓÉî¶Ô React Native
ÔÀíµÄÀí½â¡£
³õʼ»¯ React Native
ÿ¸öÏîÄ¿¶¼ÓÐÒ»¸öÈë¿Ú£¬È»ºó½øÐгõʼ»¯²Ù×÷£¬React Native Ò²²»ÀýÍâ¡£Ò»¸ö²»º¬ Objective-C
´úÂëµÄÏîÄ¿Áô¸øÎÒÃǵÄΨһÏßË÷¾ÍÊÇλÓÚ AppDelegate ÎļþÖеĴúÂ룺
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation moduleName:@"PropertyFinder" initialProperties:nil launchOptions:launchOptions]; |
Óû§ÄÜ¿´µ½µÄÒ»ÇÐÄÚÈݶ¼À´Ô´ÓÚÕâ¸ö RootView£¬ËùÓеijõʼ»¯¹¤×÷Ò²¶¼ÔÚÕâ¸ö·½·¨ÄÚÍê³É¡£
ÔÚÕâ¸ö·½·¨ÄÚ²¿£¬ÔÚ´´½¨ RootView ֮ǰ£¬React Native ʵ¼ÊÉÏÏÈ´´½¨ÁËÒ»¸ö Bridge
¶ÔÏó¡£ËüÊÇ Objective-C Óë JavaScript ½»»¥µÄÇÅÁº£¬ºóÐøµÄ·½·¨½»»¥ÍêÈ«ÒÀÀµÓÚËü£¬¶øÕû¸ö³õʼ»¯¹ý³ÌµÄ×îÖÕÄ¿µÄÆäʵҲ¾ÍÊÇ´´½¨Õâ¸öÇÅÁº¶ÔÏó¡£
³õʼ»¯·½·¨µÄºËÐÄÊÇ setUp ·½·¨£¬¶ø setUp ·½·¨µÄÖ÷ÒªÈÎÎñÔòÊÇ´´½¨ BatchedBridge¡£
BatchedBridge µÄ×÷ÓÃÊÇÅúÁ¿¶ÁÈ¡ JavaScript ¶Ô Objective-C µÄ·½·¨µ÷Óã¬Í¬Ê±ËüÄÚ²¿³ÖÓÐÒ»¸ö
JavaScriptExecutor£¬¹ËÃû˼Ò壬Õâ¸ö¶ÔÏóÓÃÀ´Ö´ÐÐ JavaScript ´úÂë¡£
´´½¨ BatchedBridge µÄ¹Ø¼üÊÇ start ·½·¨£¬Ëü¿ÉÒÔ·ÖΪÎå¸ö²½Ö裺
¶ÁÈ¡ JavaScript Ô´Âë
³õʼ»¯Ä£¿éÐÅÏ¢
³õʼ»¯ JavaScript ´úÂëµÄÖ´ÐÐÆ÷£¬¼´ RCTJSCExecutor ¶ÔÏó
Éú³ÉÄ£¿éÁÐ±í²¢Ð´Èë JavaScript ¶Ë
Ö´ÐÐ JavaScript Ô´Âë
ÎÒÃÇÖð¸ö·ÖÎöÿһ²½Íê³ÉµÄ²Ù×÷£º
¶ÁÈ¡ JavaScript Ô´Âë
ÕâÒ»²¿·ÖµÄ¾ßÌå´úÂëʵÏÖûÓÐÌ«´óµÄÌÖÂÛÒâÒå¡£ÎÒÃÇÖ»ÒªÃ÷°×£¬JavaScript µÄ´úÂëÊÇÔÚ Objective-C
ÌṩµÄ»·¾³ÏÂÔËÐеģ¬ËùÒÔµÚÒ»²½¾ÍÊÇ°Ñ JavaScript ¼ÓÔØ½øÄÚ´æÖУ¬¶ÔÓÚÒ»¸ö¿ÕµÄÏîÄ¿À´Ëµ£¬ËùÓеÄ
JavaScript ´úÂë´óÔ¼Õ¼Óà 1.5 Mb µÄÄÚ´æ¿Õ¼ä¡£
ÐèҪ˵Ã÷µÄÊÇ£¬ÔÚÕâÒ»²½ÖУ¬JSX ´úÂëÒѾ±»×ª»¯³ÉÔÉúµÄ JavaScript ´úÂë¡£
³õʼ»¯Ä£¿éÐÅÏ¢
ÕâÒ»²½ÔÚ·½·¨ initModulesWithDispatchGroup: ÖÐʵÏÖ£¬Ö÷ÒªÈÎÎñÊÇÕÒµ½ËùÓÐÐèÒª±©Â¶¸ø
JavaScript µÄÀࡣÿһ¸öÐèÒª±©Â¶¸ø JavaScript µÄÀà(Ò²³ÉΪ Module£¬ÒÔϲ»×÷Çø·Ö)¶¼»á±ê¼ÇÒ»¸öºê£ºRCT_EXPORT_MODULE£¬Õâ¸öºêµÄ¾ßÌåʵÏÖ²¢²»¸´ÔÓ£º
#define RCT_EXPORT_MODULE(js_name) \ RCT_EXTERN void RCTRegisterModule(Class); \ + (NSString *)moduleName { return @#js_name; } \ + (void)load { RCTRegisterModule(self); } |
ÕâÑù£¬Õâ¸öÀàÔÚ load ·½·¨Öоͻáµ÷Óà RCTRegisterModule ·½·¨×¢²á×Ô¼º£º
void RCTRegisterModule(Class moduleClass) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ RCTModuleClasses = [NSMutableArray new]; });
[RCTModuleClasses addObject:moduleClass];
} |
Òò´Ë£¬React Native ¿ÉÒÔͨ¹ý RCTModuleClasses Äõ½ËùÓб©Â¶¸ø JavaScript
µÄÀà¡£ÏÂÒ»²½²Ù×÷ÊDZéÀúÕâ¸öÊý×飬ȻºóÉú³É RCTModuleData ¶ÔÏó£º
for (Class moduleClass in RCTGetModuleClasses()) { RCTModuleData *moduleData = [[RCTModuleData alloc]initWithModuleClass:moduleClass bridge:self]; [moduleClassesByID addObject:moduleClass]; [moduleDataByID addObject:moduleData]; } |
¿ÉÒÔÏë¼û£¬RCTModuleData ¶ÔÏóÊÇÄ£¿éÅäÖñíµÄÖ÷Òª×é³É²¿·Ö¡£Èç¹û°ÑÄ£¿éÅäÖñíÏëÏó³ÉÒ»¸öÊý×飬ÄÇôÿһ¸öÔªËØ¾ÍÊÇÒ»¸ö
RCTModuleData ¶ÔÏó¡£
Õâ¸ö¶ÔÏó±£´æÁË Module µÄÃû×Ö£¬³£Á¿µÈ»ù±¾ÐÅÏ¢£¬×îÖØÒªµÄÊôÐÔÊÇÒ»¸öÊý×飬±£´æÁËËùÓÐÐèÒª±©Â¶¸ø JavaScript
µÄ·½·¨¡£
±©Â¶¸ø JavaScript µÄ·½·¨ÐèÒªÓà RCT_EXPORT_METHOD Õâ¸öºêÀ´±ê¼Ç£¬ËüµÄʵÏÖÔÀí±È½Ï¸´ÔÓ£¬ÓÐÐËȤµÄ¶ÁÕß¿ÉÒÔ×ÔÐÐÔĶÁ¡£¼òµ¥À´Ëµ£¬ËüΪº¯ÊýÃû¼ÓÉÏÁË
__rct_export__ ǰ׺£¬ÔÙͨ¹ý runtime »ñÈ¡ÀàµÄº¯ÊýÁÐ±í£¬ÕÒ³öÆäÖдøÓÐÖ¸¶¨Ç°×ºµÄ·½·¨²¢·ÅÈëÊý×éÖÐ:
- (NSArray<id<RCTBridgeMethod>> *)methods{ unsigned int methodCount; Method *methods = class_copyMethodList (object_getClass(_moduleClass), &methodCount); // »ñÈ¡·½·¨Áбí for (unsigned int i = 0; i < methodCount; i++) { RCTModuleMethod *moduleMethod = /* ´´½¨ method */ [_methods addObject:moduleMethod]; } } return _methods; } |
Òò´Ë Objective-C ¹ÜÀíÄ£¿éÅäÖñíµÄÂß¼ÊÇ£ºBridge ³ÖÓÐÒ»¸öÊý×飬Êý×éÖб£´æÁËËùÓеÄÄ£¿éµÄ
RCTModuleData ¶ÔÏó¡£Ö»Òª¸ø¶¨ ModuleId ºÍ MethodId ¾Í¿ÉÒÔΨһȷ¶¨Òªµ÷Óõķ½·¨¡£
³õʼ»¯ JavaScript ´úÂëµÄÖ´ÐÐÆ÷£¬¼´ RCTJSCExecutor ¶ÔÏó
ͨ¹ý²é¿´Ô´Âë¿ÉÒÔ¿´µ½£¬³õʼ»¯ JavaScript Ö´ÐÐÆ÷µÄʱºò£¬addSynchronousHookWithName
Õâ¸ö·½·¨±»µ÷ÓÃÁ˶à´Î£¬ËüÆäʵÏò JavaScript ÉÏÏÂÎÄÖÐÌí¼ÓÁËһЩ Block ×÷Ϊȫ¾Ö±äÁ¿£º
- (void)addSynchronousHookWithName:(NSString *)name usingBlock:(id)block { self.context.context[name] = block; } |
ÓÐЩͬѧ¶ÁÔ´Âëʱ¿ÉÄÜ»á×ß½øÒ»¸öÎóÇø£¬Èç¹ûÔÚ Block ÖдòÒ»¸ö¶Ïµã¾Í»á·¢ÏÖ£¬Block ÆäʵÊDZ»Ö´ÐÐÁË£¬µ«È´ÕÒ²»µ½ÈκÎÄܹ»Ö´ÐÐ
Block µÄ´úÂë¡£
ÕâÆäʵÊÇÒòΪÕâ¸ö Block ²¢·ÇÓÉ Objective-C Ö÷¶¯µ÷Ó㬶øÊÇÔÚµÚÎå²½Ö´ÐÐ JavaScript
´úÂëʱ£¬ÓÉ JavaScript ÔÚÉÏÏÂÎÄÖлñÈ¡µ½ Block ¶ÔÏó²¢µ÷Óã¬ÓÐÐËȤµÄ¶ÁÕß¿ÉÒÔ×ÔÐÐÌí¼Ó¶Ïµã²¢ÑéÖ¤¡£
ÕâÀïÎÒÃÇÐèÒªÖØµã×¢ÒâµÄÊÇÃûΪ nativeRequireModuleConfig µÄ Block£¬ËüÔÚ
JavaScript ×¢²áеÄÄ£¿éʱµ÷Óãº
get: () => { let module = RemoteModules[moduleName]; const json = global.nativeRequireModuleConfig(moduleName); // µ÷Óà OC µÄ Block const config = JSON.parse(json); // ½âÎö json module = BatchedBridge.processModuleConfig(config, module.moduleID); // ×¢²á config return module; }, |
Õâ¾ÍÊÇÄ£¿éÅäÖñíÄܹ»¼ÓÔØµ½ JavaScript ÖеÄÔÀí¡£
ÁíÒ»¸öÖµµÃ¹Ø×¢µÄ Block ½Ð×ö nativeFlushQueueImmediate¡£Êµ¼ÊÉÏ£¬JavaScript
³ýÁ˰ѵ÷ÓÃÐÅÏ¢·Åµ½ MessageQueue Öеȴý Objective-C À´È¡ÒÔÍ⣬Ҳ¿ÉÒÔÖ÷¶¯µ÷ÓÃ
Objective-C µÄ·½·¨£º
if (global.nativeFlushQueueImmediate && now - this._lastFlush >= MIN_TIME_BETWEEN_FLUSHES_MS) { global.nativeFlushQueueImmediate(this._queue); // µ÷Óà OC µÄ´úÂë } |
Ŀǰ£¬React Native µÄÂß¼ÊÇ£¬Èç¹ûÏûÏ¢¶ÓÁÐÖÐÓеȴý Objective-C ´¦ÀíµÄÂß¼£¬¶øÇÒ
Objective-C ³¬¹ý 5ms ¶¼Ã»ÓÐÀ´È¡×ߣ¬ÄÇô JavaScript ¾Í»áÖ÷¶¯µ÷Óà Objective-C
µÄ·½·¨£º
[self addSynchronousHookWithName: @"nativeFlushQueueImmediate" usingBlock:^ (NSArray<NSArray *> *calls){ [self->_bridge handleBuffer:calls batchEnded:NO]; }]; |
Õâ¸ö handleBuffer ·½·¨ÊÇ JavaScript µ÷Óà Objective-C ·½·¨µÄ¹Ø¼ü£¬ÔÚÏÂÒ»½Ú¡ª¡ª·½·¨µ÷ÓÃÖУ¬ÎÒ»áÏêϸ·ÖÎöËüµÄʵÏÖÔÀí¡£
Ò»°ãÇé¿öÏ£¬Objective-C »á¶¨Ê±¡¢Ö÷¶¯µÄµ÷Óà handleBuffer ·½·¨£¬ÕâÓеãÀàËÆÓÚÂÖѯ»úÖÆ£º
// ÿ¸öÒ»¶Îʱ¼ä·¢ÉúÒ»´Î£º Objective-C£ººÙ£¬JavaScript£¬ÓÐûÓÐÒªµ÷ÓÃÎҵķ½·¨Ñ½£¿ JavaScript£ºÓеģ¬Äã´Ó MessageQueue ÀïÃæÈ¡³öÀ´¡£ |
È»¶øÓÉÓÚ¿¨¶Ù»òÄ³Ð©ÌØÊâÔÒò£¬Objective-C ²¢²»ÄÜ×ÜÊDZ£Ö¤Äܹ»×¼Ê±µÄÇå¿Õ MessageQueue£¬Õâ¾ÍÊÇΪʲô
JavaScript Ò²»áÔÚÒ»¶¨Ê±¼äºóÖ÷¶¯µÄµ÷Óà Objective-C µÄ·½·¨¡£²é¿´ÉÏÃæ JavaScript
µÄ´úÂë¿ÉÒÔ·¢ÏÖ£¬Õâ¸öµÈ´ýʱ¼äÊÇ 5ms¡£
ÇëÀÎÀμÇסÕâ¸ö 5ms£¬Ëü¸æËßÎÒÃÇ JavaScript Óë Objective-C µÄ½»»¥ÊÇ´æÔÚÒ»¶¨¿ªÏúµÄ£¬²»È»¾Í²»»áµÈ´ý¶øÊÇÿ´Î¶¼Á¢¿Ì·¢ÆðÇëÇ󡣯ä´Î£¬Õâ¸öʱ¼ä¿ªÏú´óÔ¼ÊǺÁÃë¼¶µÄ£¬²»»á±È
5ms С̫¶à£¬·ñÔòµÈ´ýÕâô¾Ã¾ÍÒâÒå²»´óÁË¡£
Éú³ÉÄ£¿éÅäÖÃ±í²¢Ð´Èë JavaScript ¶Ë
¸´Ï°Ò»Ï nativeRequireModuleConfig Õâ¸ö Block£¬Ëü¿ÉÒÔ½ÓÊÜ ModuleName
²¢ÇÒÉú³ÉÏêϸµÄÄ£¿éÐÅÏ¢£¬µ«ÔÚǰÎÄÖÐÎÒÃÇûÓÐÌáµ½ JavaScript ÊÇÈçºÎÖªµÀ Objective-C
Òª±©Â¶ÄÄЩÀàµÄ(ĿǰֻÊÇ Objective-C ×Ô¼ºÖªµÀ)¡£
ÕâÒ»²½µÄ²Ù×÷¾ÍÊÇΪÁËÈà JavaScript »ñÈ¡ËùÓÐÄ£¿éµÄÃû×Ö£º
- (NSString *)moduleConfig{ NSMutableArray<NSArray *> *config = [NSMutableArray new]; for (RCTModuleData *moduleData in _moduleDataByID) { [config addObject:@[moduleData.name]]; } } |
²é¿´Ô´Âë¿ÉÒÔ·¢ÏÖ£¬Objective-C °Ñ config ×Ö·û´®ÉèÖÃ³É JavaScript µÄÒ»¸öÈ«¾Ö±äÁ¿£¬Ãû×Ö½Ð×ö£º__fbBatchedBridgeConfig¡£
Ö´ÐÐ JavaScript Ô´Âë
ÕâÒ»²½Ò²Ã»Ê²Ã´¼¼ÊõÄѶȿÉÒÔ£¬´úÂëÒѾ¼ÓÔØ½øÁËÄڴ棬¸Ã×öµÄÅäÖÃÒ²ÒѾÍê³É£¬Ö»Òª°Ñ JavaScript
´úÂëÔËÐÐÒ»±é¼´¿É¡£
ÔËÐдúÂëʱ£¬µÚÈý²½ÖÐËù˵µÄÄÇЩ Block ¾Í»á±»Ö´ÐУ¬´Ó¶øÏò JavaScript ¶ËдÈëÅäÖÃÐÅÏ¢¡£
ÖÁ´Ë£¬JavaScript ºÍ Objective-C ¶¼¾ß±¸ÁËÏò¶Ô·½½»»¥µÄÄÜÁ¦£¬×¼±¸¹¤×÷Ò²¾ÍÈ«²¿Íê³ÉÁË¡£
»ÁËÒ»¸ö¼òªµÄʱÐòͼÒÔ¹©²Î¿¼£º

³õʼ»¯¹ý³Ì
·½·¨µ÷ÓÃ
ÈçǰÎÄËùÊö£¬ÔÚ React Native ÖУ¬Objective-C ºÍ JavaScript µÄ½»»¥¶¼ÊÇͨ¹ý´«µÝ
ModuleId¡¢MethodId ºÍ Arguments ½øÐеġ£ÒÔÏÂÊÇ·ÖÇé¿öÌÖÂÛ£º
µ÷ÓÃ JavaScript ´úÂë
Ò²ÐíÄãÔÚÆäËûÎÄÕÂÖÐÔø¾¶à´ÎÌý˵ JavaScript ´úÂë×ÜÊÇÔÚÒ»¸öµ¥¶ÀµÄÏß³ÌÉÏÃæµ÷Óã¬ËüµÄʵ¼Êº¬ÒåÊÇ
Objective-C »áÔÚµ¥¶ÀµÄÏß³ÌÉÏÔËÐÐ JavaScript ´úÂ룺
- (void)executeBlockOnJavaScriptQueue:(dispatch_block_t)block { if ([NSThread currentThread] != _javaScriptThread) { [self performSelector:@selector(executeBlockOnJavaScriptQueue:) onThread:_javaScriptThread withObject:block waitUntilDone:NO]; } else { block(); } } |
µ÷Óà JavaScript ´úÂëµÄºËÐÄ´úÂëÈçÏ£º
- (void)_executeJSCall:(NSString *)method arguments:(NSArray *)arguments callback:(RCTJavaScriptCallback)onComplete{ [self executeBlockOnJavaScriptQueue:^{ // »ñÈ¡ contextJSRef¡¢methodJSRef¡¢moduleJSRef resultJSRef = JSObjectCallAsFunction(contextJSRef, (JSObjectRef)methodJSRef, (JSObjectRef)moduleJSRef, arguments.count, jsArgs, &errorJSRef); objcValue = /*resultJSRef ת»»³É Objective-C ÀàÐÍ*/ onComplete(objcValue, nil); }]; } |
ÐèҪעÒâµÄÊÇ£¬Õâ¸öº¯ÊýÃûÊÇÎÒÃÇÒªµ÷Óà JavaScript µÄÖÐתº¯ÊýÃû£¬±ÈÈç callFunctionReturnFlushedQueue¡£Ò²¾ÍÊÇ˵ËüµÄ×÷ÓÃÆäʵÊÇ´¦Àí²ÎÊý£¬¶ø·ÇÕæÕýÒªµ÷ÓõÄ
JavaScript º¯Êý¡£
Õâ¸öÖÐתº¯Êý½ÓÊÕµ½µÄ²ÎÊý°üº¬ÁË ModuleId¡¢MethodId ºÍ Arguments£¬È»ºóÓÉÖÐתº¯Êý²éÕÒ×Ô¼ºµÄÄ£¿éÅäÖÃ±í£¬ÕÒµ½ÕæÕýÒªµ÷ÓõÄ
JavaScript º¯Êý¡£
ÔÚʵ¼ÊʹÓõÄʱºò£¬ÎÒÃÇ¿ÉÒÔÕâÑù·¢Æð¶Ô JavaScript µÄµ÷Óãº
[_bridge.eventDispatcher sendAppEventWithName:@"greeted" body:@{ @"name": @"nmae"}]; |
ÕâÀïµÄ Name ºÍ Body ²ÎÊý·Ö±ð±íʾҪµ÷ÓÃµÄ JavaScript µÄº¯ÊýÃûºÍ²ÎÊý¡£
JavaScript µ÷ÓÃ Objective-C
ÔÚµ÷Óà Objective-C ´úÂëʱ£¬ÈçǰÎÄËùÊö£¬JavaScript »á½âÎö³ö·½·¨µÄ ModuleId¡¢MethodId
ºÍ Arguments ²¢·ÅÈëµ½ MessageQueue ÖУ¬µÈ´ý Objective-C Ö÷¶¯ÄÃ×ߣ¬»òÕß³¬Ê±ºóÖ÷¶¯·¢Ë͸ø
Objective-C¡£
Objective-C ¸ºÔð´¦Àíµ÷Óõķ½·¨ÊÇ handleBuffer£¬ËüµÄ²ÎÊýÊÇÒ»¸öº¬ÓÐËĸöÔªËØµÄÊý×飬ÿ¸öÔªËØÒ²¶¼ÊÇÒ»¸öÊý×飬·Ö±ð´æ·ÅÁË
ModuleId¡¢MethodId¡¢Params£¬µÚËĸöÔªËØÄ¿²âÓô¦²»´ó¡£
º¯ÊýÄÚ²¿ÔÚÿһ´Î·½µ÷ÓÃÖе÷Óà _handleRequestNumber:moduleID:methodID:params
·½·¨¡££¬Í¨¹ý²éÕÒÄ£¿éÅäÖñíÕÒ³öÒªµ÷Óõķ½·¨£¬²¢Í¨¹ý runtime ¶¯Ì¬µÄµ÷Óãº
[method invokeWithBridge:self module:moduleData.instance arguments:params]; |
ÔÚÕâ¸ö·½·¨ÖУ¬ÓÐÒ»¸öºÜ¹Ø¼üµÄ·½·¨£ºprocessMethodSignature£¬Ëü»á¸ù¾Ý JavaScript
µÄ CallbackId ´´½¨Ò»¸ö Block£¬²¢ÇÒÔÚµ÷ÓÃÍ꺯ÊýºóÖ´ÐÐÕâ¸ö Block¡£
ʵսӦÓÃ
Ë×»°Ëµ£º¡°Ë¼¶ø²»Ñ§ÔòÉñ¹÷¡±£¬ÏÂÃæ¾ÙÒ»¸öÀý×ÓÀ´ÑÝʾ Objective-C ÊÇÈçºÎÓë JavaScript
½øÐн»»¥µÄ¡£Ê×ÏÈн¨Ò»¸öÄ£¿é£º
// .h Îļþ #import <Foundation/Foundation.h> #import "RCTBridgeModule.h"
@interface Person : NSObject<RCTBridgeModule,
RCTBridgeMethod>
@end |
Person Õâ¸öÀàÊÇÒ»¸öеÄÄ£¿é£¬ËüÓÐÁ½¸ö·½·¨±©Â¶¸ø JavaScript£º
#import "Person.h" #import "RCTEventDispatcher.h" #import "RCTConvert.h"
@implementation Person
@synthesize bridge = _bridge;
RCT_EXPORT_MODULE();
RCT_EXPORT_METHOD(greet:(NSString *)name)
{
NSLog(@"Hi, %@!", name);
[_bridge.eventDispatcher sendAppEventWithName:@"greeted"
body:@{ @"name": @"nmae"}];
}
RCT_EXPORT_METHOD(greetss:(NSString *)name name2:(NSString
*)name2 callback:(RCTResponseSenderBlock)callback)
{
NSLog(@"Hi, %@! %@!!!", name, name2);
callback(@[@[@12,@23,@34]]);
}
@end |
ÔÚ JavaScript ÖУ¬¿ÉÒÔÕâÑùµ÷Óãº
Person.greet('Tadeu'); Person.greetss('Haha', 'Heihei', (events) => { for (var i = 0; i < events.length; i++) { console.log(events[i]); } }); |
ÓÐÐËȤµÄͬѧ¿ÉÒÔ¸´ÖÆÒÔÉÏ´úÂë²¢×ÔÐе÷ÊÔ¡£
React Native ÓÅȱµã·ÖÎö
¾¹ýÒ»³¤ÆªµÄÌÖÂÛ£¬Æäʵ React Native µÄÓÅȱµãÒѾ²»ÄÑ·ÖÎöÁË£¬ÕâÀï¼òµ¥×ܽáһϣº
Óŵã
¸´ÓÃÁË React µÄ˼Ï룬ÓÐÀûÓÚǰ¶Ë¿ª·¢ÕßÉæ×ãÒÆ¶¯¶Ë¡£
Äܹ»ÀûÓà JavaScript ¶¯Ì¬¸üеÄÌØÐÔ£¬¿ìËÙµü´ú¡£
Ïà±ÈÓÚÔÉúƽ̨£¬¿ª·¢Ëٶȸü¿ì£¬Ïà±ÈÓÚ Hybrid ¿ò¼Ü£¬ÐÔÄܸüºÃ¡£
ȱµã
×ö²»µ½ Write once, Run everywhere£¬Ò²¾ÍÊÇ˵¿ª·¢ÕßÒÀÈ»ÐèҪΪ iOS ºÍ Android
ƽ̨ÌṩÁ½Ìײ»Í¬µÄ´úÂ룬±ÈÈç²Î¿¼¹Ù·½Îĵµ¿ÉÒÔ·¢ÏÖ²»ÉÙ×é¼þºÍAPI¶¼Çø·ÖÁË Android ºÍ iOS °æ±¾¡£¼´Ê¹Êǹ²ÓÃ×é¼þ£¬Ò²»áÓÐÆ½Ì¨¶ÀÏíµÄº¯Êý¡£
²»ÄÜ×öµ½ÍêÈ«ÆÁ±Î iOS ¶Ë»ò Android µÄϸ½Ú£¬Ç°¶Ë¿ª·¢Õß±ØÐë¶ÔÔÉúƽ̨ÓÐËùÁ˽⡣¼ÓÖØÁËѧϰ³É±¾¡£¶ÔÓÚÒÆ¶¯¶Ë¿ª·¢ÕßÀ´Ëµ£¬ÍêÈ«²»¾ß±¸ÓÃ
React Native ¿ª·¢µÄÄÜÁ¦¡£
ÓÉÓÚ Objective-C Óë JavaScript Ö®¼äÇл»´æÔڹ̶¨µÄʱ¼ä¿ªÏú£¬ËùÒÔÐÔÄܱض¨²»¼°ÔÉú¡£±ÈÈçĿǰµÄ¹Ù·½°æ±¾ÎÞ·¨×öµ½
UItableview(ListView) µÄÊÓÍ¼ÖØÓã¬ÒòΪ»¬¶¯¹ý³ÌÖУ¬ÊÓÍ¼ÖØÓÃÐèÒªÔÚÒì²½Ïß³ÌÖÐÖ´ÐУ¬ËÙ¶ÈÌ«Âý¡£ÕâÒ²¾Íµ¼ÖÂËæ×Å
Cell ÊýÁ¿µÄÔö¼Ó£¬Õ¼ÓõÄÄÚ´æÒ²ÏßÐÔÔö¼Ó¡£
×ÛÉÏ£¬ÎÒ¶Ô React Native µÄ¶¨Î»ÊÇ£º
ÀûÓýű¾ÓïÑÔ½øÐÐÔÉúƽ̨¿ª·¢µÄÒ»´Î³É¹¦³¢ÊÔ£¬½µµÍÁËǰ¶Ë¿ª·¢ÕßÈëÃÅÒÆ¶¯¶ËµÄÃż÷£¬Ò»¶¨ÒµÎñ³¡¾°Ï¾ßÓжÀÌØµÄÓÅÊÆ£¬¼¸ºõ²»¿ÉÄÜÈ¡´úÔÉúƽ̨¿ª·¢¡£ |