Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
React Native ´ÓÈëÃŵ½Ô­Àí
 
À´Ô´£º¼òÊé ·¢²¼ÓÚ£º 2017-3-21
  1898  次浏览      27
 

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 µÄ¶¨Î»ÊÇ£º

ÀûÓýű¾ÓïÑÔ½øÐÐÔ­Éúƽ̨¿ª·¢µÄÒ»´Î³É¹¦³¢ÊÔ£¬½µµÍÁËǰ¶Ë¿ª·¢ÕßÈëÃÅÒÆ¶¯¶ËµÄÃż÷£¬Ò»¶¨ÒµÎñ³¡¾°Ï¾ßÓжÀÌØµÄÓÅÊÆ£¬¼¸ºõ²»¿ÉÄÜÈ¡´úÔ­Éúƽ̨¿ª·¢¡£

   
1898 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ