ÊýÔÂǰ£¬Facebook ¶ÔÍâÐû²¼ÁËÕýÔÚ¿ª·¢µÄ React Native
¿ò¼Ü£¬Õâ¸ö¿ò¼ÜÔÊÐíÄãʹÓà JavaScript ¿ª·¢ÔÉúµÄ iOS Ó¦Ó᪡ª¾ÍÔÚ½ñÌ죬Beta °æµÄ²Ö¿âÊͳöÁË£¡
»ùÓÚ PhoneGap ʹÓà JavaScript ºÍ HTML5 ¿ª·¢ iOS Ó¦ÓÃÒѾÓкü¸ÄêÁË£¬ÄÇ
React Native ÓÐʲôţµÄ£¿
React Native ÕæµÄºÜÅ££¬Èôó¼ÒÐË·ÜÒì³£µÄÖ÷ÒªÔÒòÓÐÁ½µã£º
1.¿ÉÒÔ»ùÓÚ React NativeʹÓà JavaScript ±àдӦÓÃÂß¼£¬UI Ôò¿ÉÒÔ±£³ÖÈ«ÊÇÔÉúµÄ¡£ÕâÑùµÄ»°¾ÍûÓбØÒª¾Í
HTML5 µÄ UI ×ö³ö³£¼ûµÄÍ×У»
2.React ÒýÈëÁËÒ»ÖÖÓëÖÚ²»Í¬µÄ¡¢ÂÔÏÔ¼¤½øµ«¾ß±¸¸ß¿ÉÓÃÐԵķ½°¸À´¹¹½¨Óû§½çÃæ¡£³¤»°¶Ì˵£¬Ó¦ÓÃµÄ UI
¼òµ¥Í¨¹ýÒ»¸ö»ùÓÚÓ¦ÓÃĿǰ״̬µÄº¯ÊýÀ´±í´ï¡£
React Native µÄ¹Ø¼ü¾ÍÊÇ£¬ÒÔ°Ñ React ±à³ÌģʽµÄÄÜÁ¦´øµ½Òƶ¯¿ª·¢À´×÷ΪÖ÷ҪĿ±ê¡£ËüµÄÄ¿±ê²»ÊÇ¿çÆ½Ì¨Ò»´Î±àдµ½´¦Ö´ÐУ¬¶øÊÇÒ»´Îѧϰ¿çƽ̨¿ª·¢¡£Õâ¸öÊÇÒ»¸ö·Ç³£´óµÄÇø±ð¡£ÕâÆª½Ì³ÌÖ»½éÉÜ
iOS ƽ̨£¬²»¹ýÄãÒ»µ©ÕÆÎÕÁËÏà¹ØµÄ¸ÅÄ¾Í¿ÉÒÔÓ¦Óõ½ Android ƽ̨£¬¿ìËÙ¹¹½¨ Android
Ó¦Óá£
Èç¹û֮ǰֻÓùý Objective-C »òÕß Swift дӦÓõϰ£¬ÄãºÜ¿ÉÄܲ»»á¶ÔʹÓà JavaScript
À´±àдӦÓõÄÔ¸¾°¸Ðµ½ÐË·Ü¡£¾¡¹ÜÈç´Ë£¬×÷Ϊһ¸ö Swift ¿ª·¢ÕßÀ´Ëµ£¬ÉÏÃæÌáµ½µÄµÚ¶þµãÓ¦¸Ã¿ÉÒÔ¼¤ÆðÄãµÄÐËȤ£¡
Äãͨ¹ý Swift£¬ºÁÎÞÒÉÎÊѧϰµ½ÁËеĸü¶àÓÐЧµÄ±àÂë·½·¨ºÍ¼¼ÇÉ£¬¹ÄÀø×ª»»ºÍ²»±äÐÔ¡£È»¶ø£¬¹¹½¨ UI
µÄ·½Ê½»¹ÊǺÍʹÓà Objective-C µÄ·½Ê½Ò»Ö¡£ÈÔÈ»ÒÔ UIKit Ϊ»ù´¡£¬¶À¶Ïרºá¡£
ͨ¹ýÏñ virtual DOM ºÍ reconciliation ÕâЩÓÐȤµÄ¸ÅÄReact ½«º¯Êýʽ±à³ÌÖ±½Ó´øµ½ÁË
UI ²ã¡£
ÕâÆª½Ì³Ì½«´ø×ÅÄãһ·¹¹½¨Ò»¸ö UK ·¿²úËÑË÷Ó¦Óãº

Èç¹ûÄã֮ǰһµã JavaScript ¶¼Ã»Ð´¹ý£¬±ðµ£ÐÄ¡£ÕâÆª½Ì³Ì´ø×ÅÄã½øÐÐÒ»²½Ò»²½½øÐбàÂë¡£React
ʹÓà CSS ÊôÐÔÀ´¶¨ÒåÑùʽ£¬Ò»°ã±È½ÏÈÝÒ×¶ÁÒ²±È½ÏÈÝÒ×Àí½â¡£µ«ÊÇÈç¹ûÄãÏëÁ˽â¸ü¶àµÄ»°£¬¿ÉÒÔÈ¥¿´¿´ Mozilla
Developer Network reference£¬ºÜ²»´íµÄ¡£
ÏëҪѧϰ¸ü¶à£¬¼ÌÐøÍù϶Á£¡
×¼±¸¹¤×÷
React Native ¿ò¼ÜÍйÜÔÚ GitHub ÉÏ¡£Äã¿ÉÒÔͨ¹ýÁ½ÖÖ·½Ê½»ñÈ¡µ½Ëü£ºÊ¹Óà git ¿Ë¡²Ö¿â£¬»òÕßÏÂÔØÒ»¸ö
zip ѹËõ°üÎļþ¡£Èç¹ûÄãµÄ»úÆ÷ÉÏÒѾ°²×°ÁË React Native£¬ÔÚ×ÅÊÖ±àÂëǰ»¹ÓÐÆäËû¼¸¸öÒòËØÐèÒª¿¼ÂÇ¡£
React Native ½èÖú Node.js£¬¼´ JavaScript ÔËÐÐʱÀ´´´½¨ JavaScript
´úÂë¡£Èç¹ûÄãÒѾ°²×°ÁË Node.js£¬ÄǾͿÉÒÔÉÏÊÖÁË¡£
Ê×ÏÈ£¬Ê¹Óà Homebrew ¹ÙÍøÌṩµÄÖ¸Òý°²×° Homebrew£¬È»ºóÔÚÖÕ¶ËÖ´ÐÐÒÔÏÂÃüÁ
½ÓÏÂÀ´£¬Ê¹Óà homebrew °²×° watchman£¬Ò»¸öÀ´×ÔFacebook µÄ¹Û²ì³ÌÐò£º
ͨ¹ýÅäÖà watchman£¬React ʵÏÖÁËÔÚ´úÂë·¢Éú±ä»¯Ê±£¬Íê³ÉÏà¹ØµÄÖØ½¨µÄ¹¦ÄÜ¡£¾ÍÏñÔÚʹÓà Xcode
ʱ£¬Ã¿´Î±£´æÎļþ¶¼»á½øÐÐÒ»´Î´´½¨¡£
React Native ÓкܶàµÄÒÀÀµ£¬ÐèÒªÔÚÔËÐÐ֮ǰ°²×°ºÃ¡£ÔÚ React Native ÎļþĿ¼Ï´ò¿ªÒ»¸öÖÕ¶Ë£¬Ö´ÐÐÏÂÃæ´úÂ룺
ÕâÀïͨ¹ý Node °ü¹ÜÀíÆ÷ץȡµ½ÏîÄ¿µÄËùÓÐÒÀÀµ£»¹¦ÄÜÉÏºÍ CocoaPods »òÕß Carthage
ÀàËÆ¡£³É¹¦Ö´ÐиÃÃüÁîºó£¬Äã»á·¢ÏÖÒ»¸ö node_modules Îļþ¼Ð±»´´½¨£¬°üº¬Á˸÷ÖÖÍⲿÒÀÀµ¡£
×îºó£¬Æô¶¯¿ª·¢·þÎñÆ÷¡£ÔڸղŴò¿ªµÄÖÕ¶ËÖУ¬Ö´ÐÐÏÂÃæÃüÁ
Ö´ÐÐÉÏÃæÃüÁÄã»á¿´µ½£º

$ npm start
> react-native@0.1.0 start /Users/colineberhardt/Projects/react-native
> ./packager/packager.sh
| Running packager on port 8081.
| Keep this packager running while developing on any JS
| projects. Feel free to close this tab and run your own
| packager instance if you prefer.
| https://github.com/facebook/react-native
React packager ready.
|
¾ÍÕâÑù¼òµ¥£¬×¼±¸¿ªÊ¼£¡½Å±¾ÔÚÖն˼ÌÐøÖ´ÐУ¬ÎÒÃǼÌÐø¡£
ÖÁ´Ë£¬ÎÒÍÆ¼ö³¢ÊÔÒ»¸ö React Native ʾÀýÀ´²âÊÔÅäÖÃÏî¡£ÔÚ react-native/Examples/Movies
Îļþ¼ÐÏ´ò¿ªÏîÄ¿£¬È»ºó´´½¨²¢ÇÒÔËÐÐËü£¬È·±£Äã¿ÉÒÔÕýÈ·µØ·¢²¼Õâ¸ö Movies Ó¦Óá£
×¢Ò⣺ÔÚ½øÈë±àÂ빤×÷֮ǰ£¬»¹ÓÐ×îºóÒ»¼þÊ ¡ª¡ª ÔÚÕâ¸ö½Ì³ÌÖУ¬ÄãÐèÒª±àд´óÁ¿µÄ JavaScript
´úÂ룬Xcode ²¢·ÇÊÇ×îºÃµÄ¹¤¾ß£¡ÎÒʹÓà Sublime Text£¬Ò»¸ö¼Û¸ñºÏÀíÇÒÓ¦Óù㷺µÄ±à¼Æ÷¡£²»¹ý£¬atom£¬brackets
»òÕ߯äËûÇáÁ¿µÄ±à¼Æ÷¶¼ÄÜʤÈÎÕâ·Ý¹¤×÷¡£
React Native ÄãºÃ
ÔÚ¿ªÊ¼¡°ËÑ·¿App¡±Ö®Ç°£¬ÏÈÀ´¸ö¼òµ¥µÄ Hello World App ÈÈÈÈÉí¡£ÔÚÕâÒ»½ÚÀÄ㽫»áʹÓõ½Ò»Ð©×é¼þ¡£
ÏÂÔØÆðʼÏîÄ¿£¬½âѹËõµ½react-native/ExamplesĿ¼ÖС£½âѹÍê³Éºó£¬ÔÚXcodeÖдò¿ª
PropertyFinder ÏîÄ¿£¬²»ÒªÖ±½ÓÔËÐÐÕâ¸öÏîÄ¿£¬»¹ÐèÒª¼ÓÉÏһЩJS£¡
ÔÚ±à¼Æ÷Öдò¿ª PropertyFinderApp.js£¬½«ÏÂÃæÕâÐдúÂë¼Óµ½ÎļþµÄ¿ªÍ·Î»Öãº
ÕâÐдúÂëÊÇÓÃÓÚ¿ªÆô Strict Mode£¬Strict modeµÄ´íÎó´¦Àí¿ÉÒÔÓÐËùÌá¸ß£¬JavaScriptµÄһЩÓïÑÔȱÏÝÒ²¿ÉÒÔ±ÜÃâ¡£¼ò¶øÑÔÖ®¾ÍÊÇ£¬JavaScriptÔÚÕâÖÖģʽϹ¤×÷µØ¸üºÃ£¡
×¢Ò⣺ÏëÒªÑо¿Ò»Ï Strict Mode µÄÅóÓÑ£¬ÎÒ»áÍÆ¼öÄãÔĶÁ Jon Resig µÄÎÄÕÂ:¡°ECMAScript
5 Strict Mode, JSON, and More¡±
È»ºó£¬¼ÓÉÏÕâÒ»ÐУº
var React = require('react-native'); |
Õâ¾ä´úÂëÊǽ« react-native Ä£¿é¼ÓÔØ½øÀ´£¬²¢½«Ëü¸³Öµ¸ø±äÁ¿ React µÄ¡£React Native
ʹÓÃͬ Node.js ÏàͬµÄÄ£¿é¼ÓÔØ·½Ê½£ºrequire£¬Õâ¸ö¸ÅÄî¿ÉÒÔµÈͬÓÚ Swift Öеġ°Á´½Ó¿â¡±»òÕß¡°µ¼Èë¿â¡±¡£
×¢Ò⣺ÏëÒªÁ˽â¸ü¶à¹ØÓÚ JavaScript Ä£¿éµÄ֪ʶ£¬ÎÒÍÆ¼öÔĶÁ Addy Osmani дµÄÕâÆªÎÄÕ¡£
ÔÚ require Óï¾äµÄÏÂÃæ£¬¼ÓÉÏÕâÒ»¶Î£º
var styles = React.StyleSheet.create({ text: { color: 'black', backgroundColor: 'white', fontSize: 30, margin: 80 } }); |
ÒÔÉÏ´úÂ붨ÒåÁËÒ»¶ÎÓ¦ÓÃÔÚ ¡°Hello World¡± Îı¾ÉϵÄÑùʽ¡£Èç¹ûÄãÔø½Ó´¥¹ýWeb¿ª·¢£¬ÄÇÄãºÜ¿ÉÄÜÒѾ·¢ÏÖÁË£ºReact
Native ʹÓõÄÊÇ CSS À´¶¨ÒåÓ¦ÓýçÃæµÄÑùʽ¡£
ÏÖÔÚÎÒÃÇÀ´¹Ø×¢Ó¦Óñ¾Éí°É£¡ÒÀÈ»ÊÇÔÚÏàͬµÄÎļþÏ£¬½«ÒÔÏ´úÂëÌí¼Óµ½Ñùʽ´úÂëµÄÏÂÃæ£º
class PropertyFinderApp extends React.Component { render() { return React.createElement(React.Text, {style: styles.text}, "Hello World!"); } |
Êǵ쬾ÍÊÇ JavaScript class£¡
Àà (class) ÊÇÔÚES6Öб»ÒýÈëµÄ£¬×ÝÈ»JavaScriptÒ»Ö±ÔÚ½ø²½£¬µ«Web¿ª·¢ÕßÊÜÀ§ÓÚ¼æÈÝä¯ÀÀÆ÷µÄ×´¿öÖУ¬²»ÄÜÔõôʹÓÃJSµÄÐÂÌØÐÔ¡£React
NativeÔËÐÐÔÚJavaScriptCoreÖÐÊÇ£¬Ò²¾ÍÊÇ˵£¬Äã¿ÉÒÔʹÓÃJSµÄÐÂÌØÐÔÀ²£¬ÍêÈ«²»Óõ£ÐļæÈÝʲôµÄÄØ¡£
×¢Ò⣺Èç¹ûÄãÊÇÒ»Ãû Web ¿ª·¢Õߣ¬ÎÒ°Ù·Ö°Ù¹ÄÀøÄãҪʹÓÃÏÖ´úµÄJavaScript£¬È»ºóʹÓÃÏñ Babel
ÕâÑùµÄ¹¤¾ßÉú³É¼æÈÝÐ﵀ JavaScript£¬ÓÃÓÚÖ§³Ö¼æÈÝÐÔ²»ºÃµÄÀÏä¯ÀÀÆ÷¡£
PropertyFinderApp ¼Ì³ÐÁË React.Component£¨React UIµÄ»ù´¡Ä£¿é£©¡£×é¼þ°üº¬×Ų»¿É±äµÄÊôÐÔ£¬¿É±äµÄ״̬±äÁ¿ÒÔ¼°±©Â¶¸øäÖȾÓõķ½·¨¡£Õâ»áÄã×öµÄÓ¦ÓñȽϼòµ¥£¬Ö»ÓÃÒ»¸öäÖȾ·½·¨¾Í¿ÉÒÔÀ²¡£
React Native ×é¼þ²¢²»ÊÇ UIKit À࣬ËüÃÇÖ»ÄÜ˵ÊÇÔÚijÖ̶ֳÈÉϵÈͬ¡£¿ò¼ÜÖ»Êǽ« React
×é¼þÊ÷ת»¯³ÉΪÔÉúµÄUI¡£
×îºóÒ»²½À²£¬½«ÕâÒ»ÐмÓÔÚÎļþĩβ£º
React.AppRegistry.registerComponent('PropertyFinderApp', function() { return PropertyFinderApp });
|
AppRegistry ¶¨ÒåÁËAppµÄÈë¿Ú£¬²¢ÌṩÁ˸ù×é¼þ¡£
±£´æ PropertyFinderApp.js£¬»Øµ½XcodeÖС£È·±£ PropertyFinder
¹æ»®£¨scheme£©ÒѾ¹´Ñ¡ÁË£¬²¢ÉèÖÃÁËÏàÓ¦µÄ iPhone Ä£ÄâÆ÷£¬È»ºóÉú³É²¢ÔËÐÐÄãµÄÏîÄ¿¡£¼¸ÃëÖ®ºó£¬ÄãÓ¦¸Ã¾Í¿ÉÒÔ¿´µ½
¡°Hello World¡± Ó¦ÓÃÕýÔÚÔËÐÐÁË£º

Õâ¸öJavaScriptÓ¦ÓÃÔËÐÐÔÚÄ£ÄâÆ÷ÉÏ£¬Ê¹ÓõÄÊÇÔÉúUI£¬Ã»ÓÐÈκÎÄÚǶµÄä¯ÀÀÆ÷Ŷ£¡
»¹²»ÏàÐÅÕâÊÇÕæµÄ£¿:] ÄÇ´ò¿ªÄãµÄ Xcode£¬Ñ¡Ôñ Debug\View
Debugging\Capture View Hierarchy£¬Äã¿´ native view hierarchy
Öж¼Ã»ÓÐ UIWebView£¬¾ÍÖ»ÓÐÒ»¸öÔÉúµÄview£¡:]

ÄãÒ»¶¨ºÜºÃÆæÆäÖеÄÔÀí°É£¬ÄǾÍÔÚ Xcode Öдò¿ª AppDelegate.m£¬½Ó×ÅÕÒµ½ application:didFinishLaunchingWithOptions£ºÕâ¸ö·½·¨¹¹½¨ÁË
RCTRootView ÓÃÓÚ¼ÓÔØ JavaScript Ó¦ÓÃÒÔ¼°äÖȾ×îºóµÄÊÓͼµÄ¡£
µ±Ó¦ÓÿªÊ¼ÔËÐеÄʱºò£¬RCTRootView½«»á´ÓÒÔϵÄURLÖмÓÔØÓ¦Óãº
http://localhost:8081/Examples/PropertyFinder/PropertyFinderApp.includeRequire.runModule.bundle
|
ÖØÐµ÷ÓÃÁËÄãÔÚÔËÐÐÕâ¸öAppʱ´ò¿ªµÄÖÕ¶Ë´°¿Ú£¬Ëü¿ªÆôÁËÒ»¸ö packager ºÍ server À´´¦ÀíÉÏÃæµÄÇëÇó¡£
ÔÚ Safari Öдò¿ªÄǸö URL£»Ä㽫»á¿´µ½Õâ¸ö App µÄ JavaScript ´úÂë¡£ÄãÒ²¿ÉÒÔÔÚ
React Native ¿ò¼ÜÖÐÕÒµ½ÄãµÄ ¡°Hello World¡± ´úÂë¡£
µ±ÄãµÄApp¿ªÊ¼ÔËÐÐÁËÒÔºó£¬Õâ¶Î´úÂ뽫»á±»¼ÓÔØ½øÀ´£¬È»ºó JavaScriptCore ¿ò¼Ü½«»áÖ´ÐÐËü¡£ÔÚ
Hello World µÄÀý×ÓÀËü½«»á¼ÓÔØ PropertyFinderApp ×é¼þ£¬È»ºó¹¹½¨³öÔÉúµÄ
UIKit ÊÓͼ¡£¹ØÓÚÕⲿ·ÖµÄÄÚÈÝ£¬ºóÎÄÀï»áÔÙÏêϸ½âÊ͵ġ£
ÄãºÃ JSX µÄÊÀ½ç
Ä㵱ǰµÄÓ¦ÓóÌÐò»áʹÓà React.createElement À´¹¹½¨Ó¦Óà UI ,React»á½«Æäת»»µ½ÔÉú»·¾³ÖС£ÔÚµ±Ç°Çé¿öÏ£¬ÄãµÄJavaScript´úÂëÊÇÍêÈ«¿É¶ÁµÄ,µ«Ò»¸ö¸ü¸´ÔÓµÄ
UI ÓëǶÌ×µÄÔªËØ½«Ñ¸ËÙʹ´úÂë±ä³ÉÒ»´óÛç¡£
È·±£Ó¦ÓóÌÐòÈÔÔÚÔËÐÐ,È»ºó»Øµ½ÄãµÄÎı¾±à¼Æ÷ÖУ¬±à¼ PropertyFinderApp.js ¡£ÐÞ¸Ä×é¼þ
render ·½·¨µÄ·µ»ØÓï¾äÈçÏÂ:
return <React.Text style={styles.text}>Hello World (Again)</React.Text>; |
ÕâÊÇ JSX £¬»ò JavaScript Óï·¨À©Õ¹,ËüÖ±½ÓÔÚÄãµÄ JavaScript ´úÂëÖлìºÏÁËÀàËÆ
HTML µÄÓï·¨;Èç¹ûÄãÊÇÒ»¸ö web ¿ª·¢ÈËÔ±,Ó¦¸Ã¶Ô´Ë²»Ä°Éú¡£ÔÚ±¾ÆªÎÄÕÂÖÐÄ㽫һֱʹÓà JSX ¡£
°ÑÄãµÄ¸Ä¶¯±£´æµ½ PropertyFinderApp.js ÖУ¬²¢·µ»Øµ½Ä£ÄâÆ÷¡£°´Ï Cmd + R
,Ä㽫¿´µ½ÄãµÄÓ¦ÓóÌÐòË¢ÐÂ,²¢ÏÔʾ¸üеÄÏûÏ¢ ¡°Hello World(again)¡±¡£
ÖØÐÂÔËÐÐÒ»¸ö React Native Ó¦ÓóÌÐòÏñˢРweb ä¯ÀÀÆ÷Ò»Ñù¼òµ¥!:]
ÒòΪÄã»áʹÓÃÏàͬµÄһϵÁÐ JavaScript Îļþ,Äú¿ÉÒÔÈÃÓ¦ÓóÌÐòÒ»Ö±ÔËÐÐ,Ö»ÔÚ¸ü¸ÄºÍ±£´æ PropertyFinderApp.js
ºóˢм´¿É
×¢Òâ:Èç¹ûÄã¸Ðµ½ºÃÆæ,¿ÉÒÔ¿´¿´ÄãµÄ¡°°ü¡±ÔÚä¯ÀÀÆ÷ÖУ¬JSX±»×ª»»³Éʲô¡£
Õâ¸ö ¡°Hello World¡± ÒѾ¹»´ó¼ÒÍæË£ÁË,ÊÇʱºò¹¹½¨Êµ¼ÊµÄÓ¦ÓóÌÐòÁË!
Ìí¼Óµ¼º½
ÎÒÃǵķ¿²ú²éÕÒÓ¦ÓÃʹÓñê×¼µÄջʽµ¼º½£¬»ùÓÚ UIKit µÄ navigation controller¡£ÏÖÔÚÕýÊÇÌí¼ÓµÄʱºò¡£
ÔÚ index.ios.js ÎļþÖУ¬°Ñ PropertyFinderApp ÖØÃüÃûΪHelloWorld£º
class HelloWorld extends React.Component { |
¡°Hello World¡± Õ⼸¸ö×ÖÄ㻹ÐèÒªÈÃËüÏÔʾһ»á¶ù£¬µ«Ëü²»ÔÙÊÇÓ¦Óõĸù×é¼þÁË¡£
½ÓÏÂÀ´£¬ÔÚ HelloWorld Õâ¸ö×é¼þÏÂÃæÌí¼ÓÈçÏÂÕâ¸öÀࣺ
class PropertyFinderApp extends React.Component {
render() {
return (
);
}
} |
¹¹ÔìÒ»¸ö navigation controller£¬Ó¦ÓÃÒ»¸öÑùʽ£¬²¢°Ñ³õʼ·ÓÉÉèΪ
Hello World ×é¼þ¡£ÔÚ Web ¿ª·¢ÖУ¬Â·ÓɾÍÊÇÒ»ÖÖ¶¨ÒåÓ¦Óõ¼º½µÄÒ»ÖÖ¼¼Êõ£¬¼´¶¨ÒåÒ³Ãæ¡ª¡ª»òÕß˵ÊÇ·ÓÉ¡ª¡ªÓë
URL µÄ¶ÔÓ¦¹ØÏµ¡£
ÔÚͬһ¸öÎļþÖУ¬¸üÐÂÑùʽ¶¨Ò壬°üº¬ÈçÏ container µÄÑùʽ£º
var styles = React.StyleSheet.create({ text: { color: 'black', backgroundColor: 'white', fontSize: 30, margin: 80 }, container: { flex: 1 } }); |
ÔÚËæºóµÄ½Ì³ÌÖÐ»á¸æËßÄã flex: 1 ÊÇʲôÒâ˼¡£
»Øµ½Ä£ÄâÆ÷£¬Cmd+R£¬¿´¿´Ð UI µÄÑù×Ó£º

Õâ¾ÍÊǰüº¬ÁË root view µÄ navigation controller£¬Ä¿Ç° root view
¾ÍÊÇ ¡°Hello World¡±¡£ºÜ°ô¡ª¡ªÓ¦ÓÃÒѾÓÐÁË»ù´¡µÄµ¼º½½á¹¹£¬µ½Ìí¼ÓÕæÊµ UI µÄʱºòÁË¡£
´´½¨ËÑË÷Ò³
ÔÚÏîÄ¿ÖÐÌí¼ÓÒ»¸öÐÂÎļþ£¬ÃüÃûΪ SearchPage.js£¬È»ºó½«Æä·ÅÔÚPropertyFinderApp.js
ËùÔÚĿ¼Ï¡£ÔÚÎļþÖÐÌí¼ÓÏÂÃæ´úÂ룺
'use strict'; var React = require('react-native'); var { StyleSheet, Text, TextInput, View, TouchableHighlight, ActivityIndicatorIOS, Image, Component } = React; |
Äã»á×¢Òâµ½£¬Î»ÓÚÒýÈë react-native ËùÔÚλÖõÄÇ°ÃæÓÐÒ»¸öÑϸñģʽ±êʶ£¬½ô½Ó×ŵÄÉùÃ÷Óï¾äÊÇÐÂ֪ʶ¡£
ÕâÊÇÒ»Öֽ⹹¸³Öµ£¬×¼ÐíÄã»ñÈ¡¶ÔÏóµÄ¶à¸öÊôÐÔ²¢ÇÒʹÓÃÒ»ÌõÓï¾ä½«ËüÃǸ³¸ø¶à¸ö±äÁ¿¡£½á¹ûÊÇ£¬ºóÃæµÄ´úÂëÖпÉÒÔÊ¡ÂÔµô
React ǰ׺£»±ÈÈ磬Äã¿ÉÒÔÖ±½ÓÒýÓà StyleSheet £¬¶ø²»ÔÙÐèÒª React.StyleSheet¡£½â¹¹Í¬ÑùÊÊÓÃÓÚ²Ù×÷Êý×飬¸ü¶àϸ½ÚÇë´ÁÕâÀï¡£
¼ÌÐøÔÚ SearchPage.js ÎļþÖÐÌí¼ÓÏÂÃæµÄÑùʽ£º
var styles = StyleSheet.create({ description: { marginBottom: 20, fontSize: 18, textAlign: 'center', color: '#656565' }, container: { padding: 30, marginTop: 65, alignItems: 'center' } }); |
ͬÑù£¬ÒÔÉ϶¼ÊDZê×¼µÄ CSS ÊôÐÔ¡£ºÍ Interface Builder Ïà±È£¬ÕâÑùÉèÖÃÑùʽȱÉÙÁË¿ÉÊÓ»¯£¬µ«ÊÇ±ÈÆðÔÚ
viewDidLoad() ÖÐÖð¸öÉèÖÃÊÓͼÊôÐÔµÄ×ö·¨¸üÓѺã¡
Ö»ÐèÒª°Ñ×é¼þÌí¼Óµ½ÑùʽÉùÃ÷µÄÇ°Ãæ£º
class SearchPage extends Component { render() { return ( Search for houses to buy! Search by place-name, postcode or search near your location. ); } } |
render ºÜºÃµØÕ¹Ê¾³ö JSX ÒÔ¼°Ëü±íʾµÄ½á¹¹¡£Í¨¹ýÕâ¸öÑùʽ£¬Äã¿ÉÒÔÇáÒ×µØÃè»æ³ö×é¼þ UI µÄ½á¹¹£ºÒ»¸öÈÝÆ÷£¬°üº¬Á½¸ö
text ±êÇ©¡£
×îºó£¬½«ÏÂÃæµÄ´úÂëÌí¼Óµ½Îļþĩβ£º
module.exports = SearchPage; |
Õâ¿ÉÒÔ export SearchPage À࣬·½±ãÔÚÆäËûÎļþÖÐʹÓÃËü¡£
ÏÂÒ»²½ÊǸüÐÂÓ¦ÓõÄ·ÓÉ£¬ÒÔ³õʼ»¯Â·ÓÉ¡£
´ò¿ª PropertyFinderApp.js£¬ÔÚÎļþ¶¥²¿½ô½Ó×ÅÉÏÒ»¸ö require Óï¾äµÄλÖÃÌí¼ÓÏÂÃæ´úÂ룺
var SearchPage = require('./SearchPage'); |
ÔÚ PropertyFinderApp ÀàµÄ render º¯ÊýÄÚ²¿£¬Í¨¹ý¸üРinitialRoute
À´ÒýÓÃ×îÐÂÌí¼ÓµÄÒ³Ãæ£¬ÈçÏ£º
´Ëʱ£¬Èç¹ûÄãÔ¸ÒâÔò¿ÉÒÔÒÆ³ý HelloWorld ÀàÒÔ¼°ÓëËüÏà¹ØÁªµÄÑùʽ¡£Äã²»ÔÚÐèÒªÄǶδúÂëÁË¡£
Çл»µ½Ä£ÄâÆ÷£¬°´Ï Cmd+R ²é¿´Ð嵀 UI£º

ʹÓà Flexbox ¶¨ÒåÍâ¹Û
ÏÖÔÚ£¬ÄãÒѾ¿´µ½ÁËÓûù±¾µÄ CSS ÊôÐÔÀ´¿ØÖÆÍâ¼ä¾à£¨margin£©£¬ÄÚ¼ä¾à£¨padding£©»¹ÓÐÑÕÉ«£¨color£©¡£²»¹ý£¬¿ÉÄÜÄ㻹²»Ì«Á˽âÒªÈçºÎʹÓÃÉìËõºÐ£¨flexbox£©£¬flexbox
ÊÇ×î½üмÓÈë CSS ¹æ·¶£¬ÓÃËü¾ÍÄܱܺãÀûµØ²¼¾Ö½çÃæ¡£
React Native Óà css-layout£¨ÕâÊÇÒ»¸öÓà JavaScript ʵÏÖflexbox±ê׼Ȼºó±àÒë³É
C£¨iOSƽ̨£©»òÕßJava£¨Androidƽ̨£©µÄ¿â)¡£
Facebook°ÑÕâ¸öÏîÄ¿µ¥¶À³öÀ´ÊµÔÚÌ«ÕýÈ·ÁË£¬ÕâÑù¿ÉÒÔ±àÒë³É¶àÖÖÓïÑÔ£¬´Ù½ø¸ü¶àÐÂÓ±µÄÓ¦Óõķ¢Õ¹£¬±ÈÈçflexbox
layout to SVG¡£
ÔÚÄãµÄAppÖУ¬ÈÝÆ÷£¨container£©Ä¬ÈϵØÊÇ×ÝÏò²¼¾Ö£¬Ò²¾ÍÊÇ˵ÔÚËüµÄ×ÓÔªËØ½«»áÊúÖ±µØÅÅÁУ¬ÏñÕâÑù£º
Õâ±»³ÆÎªÖ÷Öá (main axis)£¬ËüµÄ·½Ïò¿ÉÒÔÊÇÊúÖ±µÄÒ²¿ÉÒÔÊÇˮƽµÄ¡£
ÿһ¸ö×ÓÔªËØÔÚÊúÖ±·½ÏòÉϵÄλÖÃÊÇÓÉËüµÄmargin£¬heightºÍpadding¹²Í¬¾ö¶¨µÄ¡£ÈÝÆ÷µÄ alignItems
ÊôÐÔÒ²ÒªÉèÖÃ³É center£¬Õâ¸öÊôÐÔ¿ÉÒÔ¿ØÖÆ×ÓÔªËØÔÚÊ®×ÖÖáÉϵÄλÖá£ÔÚÕâÀËüʵÏÖÁ˾ÓÖÐ¶ÔÆëµÄÎı¾¡£
ºÃÀ²£¬ÏÖÔÚÎÒÃǰÑÊäÈë¿òºÍ°´Å¥¼ÓÉÏÈ¥°É¡£´ò¿ª SearchPage.js£¬½«ÏÂÃæµÄ´úÂë²åÈëµÚ¶þ¸ö Text
ÔªËØµÄºóÃæ£º
<View style={styles.flowRight}>
<TextInput
style={styles.searchInput}
placeholder='Search via name or postcode'/>
<TouchableHighlight style={styles.button}
underlayColor='#99d9f4'>
<Text style={styles.buttonText}>Go</Text>
</TouchableHighlight>
</View>
<TouchableHighlight style={styles.button}
underlayColor='#99d9f4'>
<Text style={styles.buttonText}>Location</Text>
</TouchableHighlight> |
ÏÖÔÚÄãÒѾ¼ÓÉÏÁËÁ½¸ö×î¸ßµÈ¼¶µÄÊÓͼ£¨top-level view£©£¬Ò»¸öÊÓͼ°üº¬ÁËÎı¾ÊäÈë¿òºÍÒ»¸ö°´Å¥£¬»¹ÓÐÒ»¸öÊÓͼÄÚÖ»ÓÐÒ»¸ö°´Å¥¡£ÔÚºóÎÄÖÐÄã»á¿´µ½£¬ËüÃǵÄÑùʽÊÇʲôÑùµÄ¡£
½Ó×Å£¬Ìí¼ÓÉ϶ÔÓ¦µÄÑùʽ£º
flowRight: { flexDirection: 'row', alignItems: 'center', alignSelf: 'stretch' }, buttonText: { fontSize: 18, color: 'white', alignSelf: 'center' }, button: { height: 36, flex: 1, flexDirection: 'row', backgroundColor: '#48BBEC', borderColor: '#48BBEC', borderWidth: 1, borderRadius: 8, marginBottom: 10, alignSelf: 'stretch', justifyContent: 'center' }, searchInput: { height: 36, padding: 4, marginRight: 5, flex: 4, fontSize: 18, borderWidth: 1, borderColor: '#48BBEC', borderRadius: 8, color: '#48BBEC' } |
ҪעÒâ¸ñʽÎÊÌ⣺ÿһ¸öÑùʽ¶¼ÊÇÓöººÅ·Ö¸ô¿ªµÄ£¬ËùÒÔ±ðÍüÁËÔÚcontainer Ñ¡ÔñÆ÷ºóÃæ»¹Òª¼ÓÉÏÒ»¸ö¶ººÅ¡£
ÒÔÉϵÄÑùʽ½«»áÓ¦ÓÃÔÚÄã¸Õ¸Õ¼ÓÉϵÄÊäÈë¿òºÍ°´Å¥ÉÏ¡£
ÏÖÔÚ·µ»Øµ½Ä£ÄâÆ÷£¬È»ºó°´Ï Cmd+R ˢнçÃæ£º

Îı¾ÇøÓòºÍ ¡¯Go¡¯ °´Å¥ÔÚͬһÐУ¬²»ÐèÒªÏÔʽµØ¶¨ÒåÁ½¸ö×é¼þµÄ¿í¶È£¬ÄãÖ»ÐèÒª½«ËüÃÇ·ÅÔÚͬһ¸öÈÝÆ÷ÖУ¬¼ÓÉÏ
flexDirection:'row' Ñùʽ£¬ÔÙ¶¨ÒåºÃËüÃÇµÄ flex Öµ¡£Îı¾ÇøÓòÊÇ flex:4£¬°´Å¥ÔòÊÇ
flex:1£¬Õâ˵Ã÷Á½ÕߵĿí¶È±ÈÊÇ4:1¡£
´ó¸ÅÄãÒ²·¢ÏÖÁË£¬ÄãµÄ¡°°´Å¥¡±Æäʵ²¢²»Êǰ´Å¥£¡:] ʹÓÃÁË UIKit ºó£¬°´Å¥¸üÇãÏòÓÚÊÇ¿ÉÒÔÇáÅö£¨tap£©µÄ±êÇ©£¨label£©£¬ËùÒÔ
React Native ÍŶӾö¶¨Ö±½ÓÔÚ JavaScript Öй¹½¨°´Å¥ÁË¡£ËùÒÔÄãÔÚ App ÖÐʹÓõİ´Å¥ÊÇ
TouchableHighlight£¬ÕâÊÇÒ»¸ö React Native ×é¼þ£¬µ±ÇáÅö TouchableHighlight
ʱ£¬Ëü»á±äµÃ͸Ã÷´Ó¶øÏÔʾ³ö³Äµ×µÄÑÕÉ«£¨Ò²¾ÍÊǰ´Å¥Ï²ãµÄ×é¼þÑÕÉ«£©¡£
ËÑË÷½çÃæµÄ×îºóÒ»²½¾ÍÊǼÓÉÏÒ»ÕÅͼ¡£Äã¿ÉÒÔ´ÓÕâÀïÏÂÔØÎÒÃÇÓõÄÍ¼Æ¬ËØ²Ä²¢½âѹ¡£
ÔÚXcodeÖдò¿ªImages.xcassetsÎļþ£¬µã»÷¼ÓºÅÌí¼ÓÒ»¸öеÄͼƬ¼¯¡£È»ºó½«Í¼Æ¬ËزÄÍϽøÕýÈ·µÄ¡°Çø¼ä¡±£º

ÄãÐèÒªÖØÆôÓ¦ÓòÅÄÜÈÃͼƬÉúЧ¡£
½«ÒÔÏ´úÂëÌí¼Óµ½ TouchableHighlight ×é¼þºóÃæ£¬Ëü½«ÓÃÓÚ¡°»ñȡλÖá±°´Å¥£º
<Image source={require('image!house')} style={styles.image}/> |
ÏÖÔÚÔÙÑùʽ±íµÄ×îºó¼ÓÉÏͼƬ¶ÔÓ¦µÄÑùʽ£¬±ðÍüÁ˸øÔÑùʽÖÐ×îºóÒ»¸ö¼ÓÉ϶ººÅŶ£º
image: {
width: 217,
height: 138
} |
require('image!house') Óï¾äÓÃÓÚÈ·¶¨ÔÚÄãÓ¦ÓõÄassetĿ¼ÏµÄͼƬ×ÊÔ´£¬ÔÚ
Xcode ÖУ¬Èç¹ûÄãµÄ´ò¿ªÁË Images.xcassets£¬Äã»á¿´µ½Ò»¸ö¡°·¿ÎÝ¡±µÄͼ±ê£¬ÕýÊÇÉÏÃæ´úÂëÖÐÒýÓõ½µÄ¡£
·µ»Øµ½Ä£ÄâÆ÷£¬Cmd+RË¢ÐÂUI£º

×¢Ò⣺Èç¹ûÄãÕâ»áûÓп´µ½¡°·¿ÎÝ¡±Í¼Æ¬£¬È¡¶ø´úÖ®µÄÊÇÒ»ÕÅ¡°ÕÒ²»µ½×ÊÔ´¡±µÄͼƬ£¬³¢ÊÔÖØÆôpackager£¨Ò²¾ÍÊÇÔÚÖÕ¶ËÀïÊäÈë
npm start ÃüÁ¡£
|