×î½üÒ»¸ö¼¾¶È£¬ÎÒÃǶ¼ÔÚΪÊÖQ¼ÒУȺ×öÖØ¹¹ÓÅ»¯£¬½«ÔÓÐÄÇÌ×ÎÊÌâ²»¶ÏµÄ¿ò¼Ü»»µô¡£¾¹ýһЩÕå×㬾ö¶¨Ê¹ÓÃreact
½øÐÐÖØ¹¹¡£Ñ¡Ôñreact£¬ÆäʵҲÖ÷ÒªÊÇÒòΪËü¾ßÓÐÏÂÃæµÄÈý´óÌØÐÔ¡£
ReactµÄÌØÐÔ
1.Learn once, write anywhere
ѧϰReactµÄºÃ´¦¾ÍÊÇ£¬Ñ§ÁËÒ»±éÖ®ºó£¬Äܹ»Ð´web, nodeÖ±³ö£¬ÒÔ¼°native£¬Äܹ»ÊÊÓ¦¸÷ÖÖ·×·±¸´ÔÓµÄÒµÎñ¡£ÐèÒªÇáÁ¿¿ì½ÝµÄ£¬Ö±½Ó¿ÉÒÔÓÃReactjs£»ÐèÒªÌáÉýÊׯÁʱ¼äµÄ£¬¿ÉÒÔ½áºÏReact
Server Render£»ÐèÒª¸üºÃµÄÐÔÄܵģ¬¿ÉÒÔÉÏReact Native¡£
µ«ÊÇ£¬ÕâÆäʵ°µÊ¾Ñ§Ï°µÄÇúÏ߷dz£¶¸ÇÍ¡£µ¥µ¥ÊÇWebpack+ React + Redux¾ÍÒѹ»Ò»¸öÈëÃÅÕß¹»Çº£¬¸üºÎ¿ö»¹Òª¼æ¹ËÖ±³öºÍÊÖ»ú¿Í»§¶Ë¡£²»ÊÇÒ»°ãÈËÄÜholdסËùÓжˡ£
2.Virtual Dom
Virtual Dom£¨Ï³Ævd£©ËãÊÇReactµÄÒ»¸öÖØ´óµÄÌØÉ«£¬ÒòΪFacebookÐû³ÆÓÉÓÚvdµÄ°ïÖú£¬ReactÄܹ»´ïµ½ºÜºÃµÄÐÔÄÜ¡£Êǵģ¬Facebook˵µÄû´í£¬µ«Ö»ËµÁËÒ»°ë£¬Ëü˵©µÄÒ»°ëÊÇ£º¡°³ý·ÇÄãÄÜÕýÈ·µÄ²ÉÓÃһϵÁÐÓÅ»¯ÊֶΡ±¡£
3.×é¼þ»¯
ÁíÒ»¸ö±»´ó¼ÒËùÍÆ³çµÄReactÓÅÊÆÔÚÓÚ£¬ËüÄÜÁîµ½ÄãµÄ´úÂë×éÖ¯¸üÇåÎú£¬Î¬»¤ÆðÀ´¸üÈÝÒס£ÎÒÃÇÔÚдµÄʱºòÒ²ÓÐͬ¸Ð£¬µ«ÄÇÊÇÖ±µ½ÎÒÃDzÈÁËһЩ¿Ó£¬²¢ÇÒ½¥½¥ÊìϤReact+
ReduxËùÍÆ³çµÄÄÇÌ×´úÂë×éÖ¯¹æ·¶Ö®ºó¡£
ÄÇô£¿
ÉÏÃæµÄÃèÊö²»ÃâÓÐЩÏÈÑïºóÒֵĸоõ£¬ÄÇÊÇÒòΪÍùÍù×÷ΪReactµÄ¸ÕÈëÃÅÕߣ¬¶¼»áÏñÎÒÃdzõÈëµÄʱºòÒ»Ñù£¬¶ÔReactÂú»³Ï£Íû£¬Ö¸ÒâËü°ïÎÒÃÇ×öºÃÒ»ÇУ¬µ«Ëæ×ÅÁ˽âµÄÉîÈ룬·¢ÏÖÐèÒª×öһЩ¶îÍâµÄÊÂÇéÀ´´ïµ½ÎÒÃÇµÄÆÚ´ý¡£
¶ÔReactµÄÆÚ´ý
³õѧÕß¶ÔReact¿ÉÄÜÂú»³ÆÚ´ý£¬¾õµÃReact¿ÉÄÜÍ걬ÆäËüÒ»Çпò¼Ü£¬ÉõÖÁ²»ÇÐʵ¼ÊµØÈÏΪReact¿ÉÄÜÁ¬ÔÉúµÄäÖȾ¶¼ÄÜÍ걬¡ª¡ª¶Ô¿ò¼ÜµÄ¿ñÈÈȷʵ»á³öÏÖÕâÑùµÄ²»ÇÐʵ¼ÊµÄÆÚ´ý¡£ÈÃÎÒÃÇÀ´¿´¿´ReactµÄ¹Ù·½ÊÇÔõô˵µÄ¡£React¹Ù·½ÎĵµÔÚAdvanced
PerformanecÕâÒ»½Ú£¬ÕâÑùдµÀ£º
One
of the first questions people ask when considering
React for a project is whether their application
will be as fast and responsive as an equivalent
non-React version |
ÏÔÈ»React×Ô¼ºÒ²ÆäʵֻÊÇÏ뾡Á¿´ïµ½¸ú·ÇReact°æ±¾ÏàÈôµÄÐÔÄÜ¡£ReactÔÚ¼õÉÙÖØ¸´äÖȾ·½ÃæÈ·ÊµÊÇÓÐÒ»Ì×¶ÀÌØµÄ´¦Àí°ì·¨£¬ÄǾÍÊÇvd£¬µ«ÏÔʾÔÚÊ×´ÎäÖȾµÄʱºòReact¾øÎÞ¿ÉÄܳ¬Ô½ÔÉúµÄËÙ¶È£¬»òÕßÒ»¶¨Äܽ«ÆäËüµÄ¿ò¼Ü±ÈÏÂÈ¥¡£Òò´Ë£¬ÎÒÃÇÔÚ×öÓÅ»¯µÄʱºò£¬¿ÉµÄÆÚ´ýµÄ¶«Î÷ÓУº
1.ÊׯÁʱ¼ä¿ÉÄÜ»á±È½ÏÔÉúµÄÂýһЩ£¬µ«¿ÉÒÔ³¢ÊÔÓÃReact Server
Render (ÓÖ³ÆIsomorphic)È¥Ìá¸ßЧÂÊ
2.Óû§½øÐн»»¥µÄʱºò£¬ÓпÉÄÜ»á±ÈÔÉúµÄÏìÓ¦¿ìһЩ£¬Ç°ÌáÊÇÄã×öÁËһЩÓÅ»¯±ÜÃâÁËÀË·ÑÐÔÄܵÄÖØ¸´äÖȾ¡£
ÒÔÊÖQ¼ÒУȺ¹¦ÄÜÒ³ReactÖØ¹¹ÓÅ»¯ÎªÀý
ÊÖQ¼ÒУȺ¹¦ÄÜÒ³Ö÷ÒªÓÉÈý¸öÒ³Ãæ¹¹³É£¬·Ö±ðÊÇÁбíÒ³¡¢²¼ÖÃÒ³ºÍÏêÇéÒ³¡£ÁбíÒ³ÒÑ¾ÖØ¹¹Íê³É²¢ÒÑ·¢²¼£¬²¼ÖÃÒ³ÒÑÖØ¹¹Íê±Ï×¼±¸Ìá²â£¬ÏêÇéÒ³ÕýÔÚÖØ¹¹¡£Óë´ËͬʱÎÒÃÇÒÑÍê³É¶ÔÁбíÒ³µÄͬ¹¹Ö±³öÓÅ»¯£¬²¢ÒÑÕýÔÚ×öReact
NativeÓÅ»¯µÄÆÌµæ¡£
ÕâÈý¸öÒ³ÃæµÄÖØ¹¹Æäʵ¸²¸ÇÁ˲»ÉÙÒ³ÃæµÄ°¸Àý£¬ËùÒÔ»¹ÊÇÂùÓдú±íÐԵģ¬ÎÒÃÇ»á½«ÖØ¹¹Ö®ÖÐÓöµ½µÄһЩ¾Ñé´©²åÔÚÎÄÕÂÀïÂÛÊö¡£
ÔÚÊÖQ¼ÒÐ£ÈºÖØ¹¹Ö®Ç°£¬ÆäʵÎÒÃÇÒѾ×öÁËÒ»°æPC¼ÒУȺ¡£µ±Ê±½«nativeµÄÒ³ÃæÈ«²¿web»¯£¬Ö±½Ó¾Í²ÉÓÃÁËReact±È½Ï³£ÓõÄÈ«¼ÒͰÌ××°£º
1.¹¹½¨¹¤¾ß => gulp + webpack
2.¿ª·¢Ð§ÂÊÌáÉý => redux-dev-tools +
hot-reload
3.ͳһÊý¾Ý¹ÜÀí=> redux
4.ÐÔÄÜÌáÉý => immutable + purerender
5.·ÓÉ¿ØÖÆÆ÷ => react-router(ÊÖQÔÝʱû²ÉÓÃ)
ΪʲôÎÒÃÇÔÚÓÅ»¯µÄʱºòÖ÷Òª½²ÊÖQÄØ£¿±Ï¾¹PCµÄÐÔÄÜÔڴ󲿷ÝÇé¿öÏÂÒѾºÜºÃ£¬ÔÚPCÉÏһЩ´æÔÚµÄÎÊÌâ¶¼±»PCÁ¼ºÃµÄÐÔÄÜÑÚ¸ÇÏÂÈ¥¡£ÊÖ»úµÄÐÔÄܲ»ÈçPC£¬Òò´ËÓиü¶àÓмÛÖµµÄ¶«Î÷ÉîÍÚ¡£¿ª·¢µÄʱºòÎҾ͸úͬÊ¿ªÍæÐ¦Ëµ£º¡°Ã»×ö¹ýÊÖ»úwebÓÅ»¯µÄ¶¼Õæ²»ºÃÒâ˼˵×Ô¼º×ö¹ýÐÔÄÜÓÅ»¯°¡¡°¡£
¹¹½¨Õë¶ÔReact×öµÄÓÅ»¯
ÎÒÔÚ¡¶ÐÔÄÜÓÅ»¯Èý²¿ÇúÖ®Ò»¡ª¡ª¹¹½¨Æª¡·Ìá³ö£¬¡°Í¨¹ý¹¹½¨£¬ÎÒÃÇ¿ÉÒÔ´ï³É¿ª·¢Ð§ÂʵÄÌáÉý£¬ÒÔ¼°¶ÔÏîÄ¿×î»ù±¾µÄÓÅ»¯¡±¡£ÔÚ½øÐÐReactÖØ¹¹ÓÅ»¯µÄ¹ý³ÌÖУ¬¹¹½¨¶ÔÏîÄ¿µÄÓÅ»¯×÷Óñز»¿ÉÉÙ¡£ÔÚ±¾ÎÄÔÝʱ²»×¸Êö£¬ÎÒÁíÍ⿪±ÙÁËһƪ¡¶webpackʹÓÃÓÅ»¯£¨reactƪ£©¡·½øÐоßÌåÂÛÊö¡£
¿ª·¢Ð§ÂÊÌáÉý¹¤¾ß

ÔÚPC¶ËʹÓÃReduxµÄʱºò£¬ÎÒÃǶ¼ºÜϲ»¶Ê¹ÓÃRedux-DevtoolsÀ´²é¿´Redux´¥·¢µÄaction£¬ÒÔ¼°¶ÔÓ¦µÄÊý¾Ý±ä»¯¡£PC¶ËʹÓõÄʱºò£¬ÎÒÃÇϰ¹ß°ÚÔÚÓұߡ£µ«Òƶ¯¶ËµÄÆÁÄ»½ÏÉÙ£¬Òò´Ë¼ÒУȺÏîĿʹÓõÄʱºò·ÅÔڵײ¿£¬¶øÇÒÓÉÓÚÐÔÄÜÎÊÌ⣬ÎÒÃÇÔÚconstantÀïÉèÒ»¸ödebug²ÎÊý£¬È»ºóÔÚchromeµ÷ÊÔʱ´ò¿ª£¬Òƶ¯¶Ë·Ç±ØÐëµÄʱºò¹Ø±Õ¡£·ñÔò£¬Ëü»áµ¼ÖÂÒÆ¶¯webµÄäÖȾ±È½ÏµÍÏ¡£
Êý¾Ý¹ÜÀí¼°ÐÔÄÜÓÅ»¯
Reduxͳһ¹ÜÀíÊý¾Ý
ÕâÒ»²¿·ÝËãÊÇÖØÍ·Ï·°É¡£React×÷ΪView²ãµÄ¿ò¼Ü£¬ÒѾͨ¹ývd°ïÖúÎÒÃǽâ¾öÖØ¸´äÖȾµÄÎÊÌâ¡£µ«vdÊÇͨ¹ý¿´Êý¾ÝµÄǰºó²îÒìÈ¥ÅжÏÊÇ·ñÒªÖØ¸´äÖȾµÄ£¬µ«React²¢Ã»ÓаïÖúÎÒÃÇÈ¥×öÕâ²ã±È½Ï¡£Òò´ËÎÒÃÇÐèҪʹÓÃÒ»ÕûÌ×Êý¾Ý¹ÜÀí¹¤¾ß¼°¶ÔÓ¦µÄÓÅ»¯·½·¨È¥´ï³É¡£ÔÚÕâ·½·¨£¬ÎÒÃÇÑ¡ÔñÁËRedux¡£
ReduxÕû¸öÊý¾ÝÁ÷´óÌå¿ÉÒÔÓÃÏÂͼÀ´ÃèÊö£º

ReduxÕâ¸ö¿ò¼ÜµÄºÃ´¦ÔÚÓÚÄܹ»Í³Ò»ÔÚ×Ô¼º¶¨ÒåµÄreducerº¯ÊýÀïÃæÈ¥½øÐÐÊý¾Ý´¦Àí£¬ÔÚView²ãÖÐÖ»ÐèҪͨ¹ýʼþÈ¥´¦´¥·¢Ò»Ð©action¾Í¿ÉÒÔ¸Ä±äµØÓ¦µÄÊý¾Ý£¬ÕâÑùÄܹ»Ê¹Êý¾Ý´¦ÀíºÍdomäÖȾ¸üºÃµØ·ÖÀ룬¶ø±ÜÃâÊÖ¶¯µØÈ¥ÉèÖÃstate¡£
ÔÚÖØ¹¹µÄʱºò£¬ÎÒÃÇÇãÏòÓÚ½«¹¦ÄÜÀàËÆµÄÊý¾Ý¹éÀൽһÆð£¬²¢½¨Á¢¶ÔÓ¦µÄreducerÎļþ¶ÔÊý¾Ý½øÐд¦Àí¡£ÈçÏÂͼ£¬ÊÇÊÖQ¼ÒУȺ²¼ÖÃÒ³µÄÊý¾Ý½á¹¹¡£ÓÐЩ´óÐ͵ÄSPAÏîÄ¿¿ÉÄܻὫ³õʼÊý¾Ý·Ö¿ªÔÚ²»Í¬µÄreducerÎļþÀµ«ÕâÀïÎÒÃÇÇãÏòÓڹ鵽һ¸östoreÎļþ£¬ÕâÑùÄܹ»ÇåÎúµØÖªµÀÕû¸öÎļþµÄÊý¾Ý½á¹¹£¬Ò²·ûºÏReduxÏëͳһ¹ÜÀíÊý¾ÝµÄÏë·¨¡£È»ºóÊý¾ÝµÄÿ¸ö²ã¼¶ÓëreducerÎļþ¶¼ÊÇÒ»Ò»¶ÔÓ¦µÄ¹ØÏµ¡£

ÖØ¸´äÖȾµ¼Ö¿¨¶Ù
ÕâÌ×React + ReduxµÄ¶«Î÷ÔÚPC¼ÒÐ£ÈºÒ³ÃæÉÏÓõúܻ¶ÀÖ£¬ ÒÔÖÁÓÚ²»ÓÃÔõôдshouldComponentUpdate¶¼Ã»Óöµ½¹ýʲôÐÔÄÜÎÊÌâ¡£µ«·Åµ½Òƶ¯¶ËÉÏ£¬ÎÒÃÇÔÚÁбíÒ³ÖØ¹¹µÄʱºò¾ÍÂíÉÏÓöµ½¿¨¶ÙµÄÎÊÌâÁË¡£
ʲôÔÒòÄØ£¿ÊÇÖØ¸´äÖȾµ¼Öµģ¡£¡£¡£¡£¡£¡
˵ºÃµÄReact vd¿ÉÒÔ¼õÉÙÖØ¸´äÖÈ¾ÄØ£¿£¡£¡£¡
Çë±ðÍü¼ÇǰÌáÌõ¼þ£¡£¡£¡£¡
Äã¿ÉÒÔÔÚÿ¸öcomponentµÄrenderÀ·ÅÒ»¸öconsole.log(¡°xxx component¡±)¡£È»ºó´¥·¢Ò»¸öaction£¬ÔÚÓÅ»¯Ö®Ç°£¬¼¸ºõÈ«²¿µÄcomponent¶¼´ò³öÕâ¸ölog£¬±íÃ÷¶¼Öظ´äÖȾÁË¡£
¸üÕý£º¿É¼ûºóÃæyeatszhangͬѧµÄ½âÊÍ¡£
ReactÐÔÄܵľÈÐÇImmutablejs

(ÍøÍ¼£¬ÒýÓõÄÎÄÕÂÌ«¶àÒÔÖÂÓÚ²»ÖªµÀÄÄÆª²ÅÊdzö´¦)
ÉÏͼÊÇReactµÄÉúÃüÖÜÆÚ£¬»¹Ã»ÊìϤµÄͬѧ¿ÉÒÔÈ¥ÊìϤһÏ¡£ÒòΪÆäÖеÄshouldComponentUpdateÊÇÓÅ»¯µÄ¹Ø¼ü¡£ReactµÄÖØ¸´äÖȾÓÅ»¯µÄºËÐÄÆäʵ¾ÍÊÇÔÚshouldComponentUpdateÀïÃæ×öÊý¾Ý±È½Ï¡£ÔÚÓÅ»¯Ö®Ç°£¬shouldComponentUpdateÊÇĬÈÏ·µ»ØtrueµÄ£¬Õâµ¼ÖÂÈκÎʱºò´¥·¢ÈκεÄÊý¾Ý±ä»¯¶¼»áʹcomponentÖØÐÂäÖȾ¡£Õâ±ØÈ»»áµ¼ÖÂ×ÊÔ´µÄÀ˷ѺÍÐÔÄܵĵÍÏ¡ª¡ªÄã¿ÉÄÜ»á¸Ð¾õ±È½ÏÔÉúµÄÏìÓ¦¸üÂý¡£
ÕâʱÄ㿪ʼ»³ÒÉÕâÊÀ½ç¡ª¡ªÊDz»ÊÇFacebookÔÚÆÎÒ¡£
µ±Ê±Óöµ½Õâ¸öÎÊÌâÎҵĿªÊ¼·ÔÄÎĵµ£¬Ò²ÊÇÔÚFacebookµÄAdvanced PerformanceÒ»½ÚÖÐÕÒµ½´ð°¸£ºImmutablejs¡£Õâ¸ö¿ò¼ÜÒѱ»´µÁËÓÐÒ»Äê¶àÁ˰ɣ¬´µÕâЩ¿ò¼ÜµÄÈËÀí½âËüµÄÔÀí£¬µ«²»Ò»¶¨Êµ¼ù¹ý¡ª¡ªÒòΪ×÷ΪһÏßÒÆ¶¯¶Ë¿ª·¢Õߣ¬´ò¿ªËüµÄgithubÖ÷Ò³¿´distÎļþ£¬50kb£¬ÎÒ¾ÍÒѾ´òÍËÌùÄÁË¡£Ö»ÊÇÓöµ½ÁËÐÔÄÜÎÊÌ⣬ÎÒÃDzÅÔÙÈÏÕæµØÈ¥Á˽âÒ»±é¡£
ImmutableÕâ¸öµÄÒâ˼¾ÍÊDz»¿É±ä£¬Immutablejs¾ÍÊÇÒ»¸öÉú³ÉÊý¾Ý²»¿É±äµÄ¿ò¼Ü¡£Ò»¿ªÊ¼Äã²¢²»Àí½â²»¿É±äÓÐʲôÓá£×ʼµÄʱºòImmutableÕâÖÖÊý¾Ý½á¹¹ÊÇΪÁ˽â¾öÊý¾ÝËøµÄÎÊÌ⣬¶ø¶ÔÓÚjs£¬¾Í¿ÉÒÔ½èÓÃÀ´½â¾öǰºóÊý¾Ý±È½ÏµÄÎÊÌ⡪¡ªÒòΪͬʱImmutablejs»¹ÌṩÁ˺ܺõÄÊý¾Ý±È½Ï·½·¨¡ª¡ªImmutable.is()¡£Ð¡½áһϾÍÊÇ£º
1.Immutablejs±¾Éí¾ÍÄÜÉú³É²»¿É±äÊý¾Ý£¬ÕâÑù¾Í²»ÐèÒª¿ª·¢Õß×Ô¼ºÈ¥×öÊý¾ÝÉ±´£¬¿ÉÒÔÖ±½ÓÄÃprevProps/prevStateºÍnextProps/nextStateÀ´±È½Ï¡£
2.Immutable±¾Éí»¹ÌṩÁËÊý¾ÝµÄ±È½Ï·½·¨£¬ÕâÑù¿ª·¢ÕßÒ²²»ÓÃ×Ô¼ºÈ¥Ð´Êý¾ÝÉî±È½ÏµÄ·½·¨¡£
˵µ½ÕâÀÒÑÍòʾ㱸ÁË¡£ÄǶ«·çÄØ£¿ÎÒÃÇ»¹Ç·µÄ¶«·ç¾ÍÊÇÓ¦¸ÃÔÚÄÄÀïдÕâ¸ö±È½Ï¡£´ð°¸¾ÍÊÇshouldComponentUpdate¡£Õâ¸öÉúÃüÖÜÆÚ»á´«ÈënextPropsºÍnextState£¬¿ÉÒÔ¸úcomponentµ±Ç°µÄpropsºÍstateÖ±½Ó±È½Ï¡£Õâ¸ö¾Í¿ÉÒԲο¼pure-renderµÄ×ö·¨£¬È¥ÖØÐ´shouldComponentUpdate£¬ÔÚÀïÃæÐ´Êý¾Ý±È½ÏµÄÂß¼¡£
ÆäÖÐһλͬÊÂpolarjiangÀûÓÃImmutablejsµÄis·½·¨£¬²Î¿¼pure-render-decoratorдÁËÒ»¸öimmutable-pure-render-decorator¡£
ÄǾßÌåÔõôʹÓÃimmutable + pure-renderÄØ£¿
¶ÔÓÚimmutable£¬ÎÒÃÇÐèÒª¸ÄдһÏÂreducer functionsÀïÃæµÄ´¦ÀíÂß¼£¬Ò»ÂÉ»»³ÉImmutableµÄapi¡£
ÖÁÓÚpure-render£¬ÈôÊÇes5д·¨£¬¿ÉÒÔÓÃʹmixin£»ÈôÊÇes6/es7д·¨£¬ÐèҪʹÓÃdecorator£¬ÔÚjsµÄbabel
loaderÀïÃæ£¬ÐÂÔöplugins: [¡®transform-decorators-legacy¡¯]¡£Æäes6µÄд·¨ÊÇ£º
[@pureRender](/user/name/pureRender)
export default class List extends Component
{ ... } |
Immutablejs´øÀ´µÄһЩÎÊÌâ
²»ÖØÐÂäÖȾ
Äã¿ÉÄÜ»áÏëµ½ImmutableÄܼõÉÙÎÞνµÄÖØÐÂäÖȾ£¬µ«¿ÉÄÜûÏë¹ý»áµ¼ÖÂÒ³Ãæ²»ÄÜÕýÈ·µØÖØÐÂäÖȾ¡£Ä¿Ç°ÁбíÒ³ÔÚÀÏʦ½øÈëµÄʱºòÊÇÓÐ2¸ötabµÄ£¬tabµÄÇл»»áÈÃÁбíÒ²Çл»¡£Ä¿Ç°ÊÖQµÄÁбíҳѧϰPCµÄÁбíÒ³£¬Á½¸öÁÐ±í¹²ÓÃÒ»Ì×dom½á¹¹£¨ÒòΪ³ýÁË×÷Òµ²¼ÖÃÕßÃû×ÖÖ®Í⣬Á½¸öÁбíһģһÑù£©¡£ÉÏÁËImmutablejsÖ®ºó£¬µ±ÅöÇÉ¡°ÎÒ·¢²¼µÄ¡°ÁбíºÍ¡±È«²¿¡°ÁÐ±í¿ªÍ·µÄ¼¸¸ö×÷Òµ¶¼ÊÇͬһ¸öÈ˲¼ÖõÄʱºò£¬ÁбíÇл»¾Í²»ÖØÐÂäÖȾÁË¡£
ÒýÈëimmutableºÍpureRenderºó£¬renderÀïµÄJSX×¢ÒâÒ»¶¨²»ÒªÓÐͬÑùµÄkey£¨ÈçÁ½¸öÁÐ±í£¬ÓÐÖØ¸´µÄÊý¾Ý£¬´ËʱÒÔÊý¾ÝidÀ´×÷Ϊkey¾Í²»Ì«ºÏÊÊ£¬Ó¦¸ÃÒªÓÃÊý¾Ýid
+ ÁбíÀàÐÍ×÷Ϊkey£©£¬»áÔì³É²»äÖȾÐÂÊý¾ÝÇé¿ö¡£ÁбíҳĿǰµÄ´¦Àí°ì·¨Êǽ«keyÖµ»»³Éid + listType¡£

(ÁбíÒ³Á½¸öÁбíµÄÇл»)
ÕâÑùд³ýÁ˱£Ö¤ÔÚ¸¸ÔªËØÄÇÒ»²ãÖªÏþÊý¾Ý(keyÖµ£©²»Í¬ÐèÒªÖØÐÂäÖȾ֮Í⣬Ҳ±£Ö¤ÁËReactµ×²ãäÖȾ֪µÀÕâÊÇÁ½×鲻ͬµÄÊý¾Ý¡£ÔÚReactÔ´ÎļþÀïÓÐÒ»¸öReactChildReconciler.jsÖ÷ÒªÊÇдchildrenµÄäÖȾÂß¼¡£ÆäÖеÄupdateChildrenÀïÃæÓоßÌåÈçºÎ±È½Ïǰºóchildren£¬È»ºóÔÙ¾ö¶¨ÊÇ·ñÒªÖØÐÂäÖȾ¡£ÔڱȽϵÄʱºòËüµ÷ÓÃÁËshouldUpdateReactComponent·½·¨¡£ÎÒÃÇ¿´µ½ËüÓжÔkeyÖµ×ö±È½Ï¡£ÔÚÁ½¸öÁбíÖÐÓв»Í¬µÄkey£¬ÔÚÊý¾ÝÏàËÆµÄÇé¿öÏ£¬Äܱ£Ö¤Á½ÕßÇл»µÄʱºòÄÜÖØÐÂäÖȾ¡£
function
shouldUpdateReactComponent
(prevElement, nextElement)
{
var prevEmpty = prevElement === null ||
prevElement ===
false;
var nextEmpty = nextElement === null ||
nextElement ===
false;
if (prevEmpty || nextEmpty) {
return prevEmpty === nextEmpty;
}
var prevType = typeof prevElement;
var nextType = typeof nextElement;
if (prevType === 'string' || prevType ===
'number') {
return nextType === 'string' || nextType ===
'number';
} else {
return nextType === 'object' && prevElement.
type === nextElement.type && prevElement
.key === nextElement.key;
}
} |
ÉÏÎÄÒ²Ìáµ½Immutablejs±àÒëºóµÄ°üÒ²ÓÐ50kb¡£¶ÔÓÚPC¶ËÀ´Ëµ¿ÉÄÜÎÞËùν£¬ÍøËÙ×ã¹»¿ì£¬µ«¶ÔÓÚÒÆ¶¯¶ËÀ´ËµÑ¹Á¦¾Í´óÁË¡£ÓÐÈËдÁ˸öseamless-immutable£¬ËãÊǼòÒ×°æµÄImmutablejs£¬Ö»ÓÐ2kb£¬Ö»Ö§³ÖObjectºÍArray¡£
µ«ÆäʵÊý¾Ý±È½ÏÂ߼дÆðÀ´Ò²²¢²»ÄÑ£¬Òò´ËÔÙÈ¥review´úÂëµÄʱºò£¬ÎÒ¾ö¶¨³¢ÊÔ×Ô¼ºÐ´Ò»¸ö£¬Ò²ÊÇÕâ¸ö¾ö¶¨ÈÃÎÒ·¢ÏÖÁ˸ü¶àµÄ°ÂÃØ¡£
Õë¶ÔReactµÄÕâ¸öÊý¾Ý±È½ÏµÄÉî±È½ÏdeepCompare£¬ÒªµãÓÐ2¸ö£º
¾¡Á¿Ê¹´«ÈëµÄÊý¾Ý±âƽ»¯Ò»µã
±È½ÏµÄʱºò×öһЩÏÞÖÆ£¬±ÜÃâÒç³öÕ»
ÏÈÉÏÒ»ÏÂÁбíÒ³µÄ´úÂ룬ÈçÏÂͼ¡£ÕâÀﵱʱÊÇѧϰÁËPC¼ÒУȺµÄ×ö·¨£¬½«component×÷Ϊprops´«Èë¡£ÕâÀïµÄ<Scroll>·â×°µÄÊǹö¶¯¼ì²âµÄÂß¼£¬¶ø<List>ÔòÊÇÁбíÒ³µÄäÖȾ£¬<Empty>ÊÇÁбíΪ¿ÕµÄʱºòչʾµÄÄÚÈÝ£¬<Loading>ÊÇÁбíµ×²¿¼ÓÔØµÄÏÔʾºáÌõ¡£

Õë¶ÔdeepCompareµÄµÚ1¸öÒªµã£¬±âƽ»¯Êý¾Ý£¬ÎÒÃǺÜÃ÷ÏÔ¾ÍÄܶ¨Î»³öÆäÖÐÒ»¸öÎÊÌâÁË¡£ÀýÈç<Empty>£¬ÎÒÃÇ´«ÈëÁËprops.hw£¬Õâ¸öprops°üÀ¨ÁËÁ½¸öÁбíµÄÊý¾Ý¡£µ«ÕâÑùµÄ½á¹¹¾Í»áÊÇÕâÑù
props.hw
= {
listMine: [
{...}, {...}, ...
],
listAll: [
{...}, {...}, ...
],
} |
µ«Èç¹ûÎÒÃÇÌáǰÔÚ´«Èë֮ǰÅжϵ±Ç°ÔÚÄĸöÁÐ±í£¬È»ºó´«Èë¶ÔÓ¦ÁбíµÄÊýÁ¿£¬Ôò»áÏñÕâÑù£º
Á½Õß±È½ÏÆðÀ´£¬ÏÔʾÊǺóÕß¼òµ¥µÃ¶à¡£
Õë¶ÔdeepCompareµÚ2µã£¬ÏÞÖÆ±È½ÏµÄÌõ¼þ¡£Ê×ÏÈÈÃÎÒÃÇÏëµ½µÄÊDZȽϵÄÉî¶È¡£Ò»°ã¶øÑÔ£¬¶ÔÓÚObjectºÍArrayÊý¾Ý£¬ÎÒÃǶ¼ÐèÒªµÝ¹éÈ¥½øÐбȽϣ¬³öÓÚÐÔÄܵĿ¼ÂÇ£¬ÎÒÃǶ¼»áÏÞÖÆ±È½ÏµÄÉî¶È¡£
³ý´ËÖ®Í⣬ÎÒÃǻعËÒ»ÏÂÉÏÃæµÄ´úÂ룬ÎÒÃǽ«¼¸¸öReact component×÷Ϊprops´«½øÈ¥ÁË£¬Õâ»áÔÚshouldComponentUpdateÀïÃæÏÔʾ³öÀ´¡£ÕâЩcomponentµÄ½á¹¹´ó¸ÅÈçÏ£º
<table
width="60%" border="0" align="center"
cellpadding="7"
cellspacing="1" bgcolor="#CCCCCC"
class="content">
<tr >
<td height="25" bgcolor="#f5f5f5"
id="dai">
<p style="text-indent: 0em;">Hello
World
!</p></td>
</tr>
</table> |
Òò´Ë£¬Õë¶ÔcomponentµÄ±È½Ï£¬ÓÐһЩÊÇ¿ÉÒÔºöÂԵģ¬ÀýÈç$$typeof, _store, _self,
_source, _owner¡£typeÕâ¸ö±È½Ï¸´ÔÓ£¬¿ÉÒԱȽϣ¬µ«½öÏÞÓÚÎÒÃǶ¨ºÃµÄ±È½ÏÉî¶È¡£Èç¹û²»×öÕâЩºöÂÔ£¬Õâ¸öÉî±È½Ï½«»á±È½ÏÏûºÄÐÔÄÜ¡£¹ØÓÚÕâ¸ödeepCompareµÄ´úÂ룬ÎÒ·ÅÔÚÁËpure-render-deepCompare-decorator¡£
²»¹ýÆäʵ£¬½«componentµ±×÷props´«Èë¸üΪÁé»î£¬¶øÇÒÄܹ»Ôö¼Ó×é¼þµÄ¸´ÓÃÐÔ£¬µ«´ÓÉÏÃæ¿´À´£¬ÊDZȽÏÏûºÄÐÔÄܵġ£¿´Á˹ٷ½ÎĵµÖ®ºó£¬ÎÒÃdz¢ÊÔ»»ÖÖд·¨£¬Ö÷Òª¾ÍÊDzÉÓÃ<Scroll>°ü¹ü<List>µÄ×ö·¨£¬È»ºóÓÃthis.props.childrenÔÚ<Scroll>ÀïÃæäÖȾ£¬²¢½«<Empty>,
<Loading>³é³öÀ´¡£


±¾ÒÔΪReact¿ÉÄÜ»á¶ÔchildrenÕâ¸öpropsÓÐÊ²Ã´ÌØÊâ´¦Àí£¬µ«ËüÒÀÈ»Êǽ«childrenµ±×÷props£¬´«ÈëshouldComponentUpdate£¬Õâ¾ÍÆÈʹ¸¸ÔªËØ<Scroll>ҪȥÅжÏÊÇ·ñÒªÖØÐÂäÖȾ£¬½ø¶øÌøµ½×ÓÎÞËØ<List>ÔÙÈ¥ÅжÏÊÇ·ñ½øÒ»²½½øÐÐäÖȾ¡£
ÄÇ<Scroll>¾¿¾¹Òª²»ÒªÈ¥×öÕâÖØÅжÏÄØ£¿Õë¶ÔÁбíÒ³ÕâÖÖÇé¿ö£¬ÎÒÃǾõµÃ¿ÉÒÔÔÝʱ²»×ö£¬ÓÉÓÚ<Scroll>°ü¹üµÄÔªËØ²»¶à£¬<Scroll>¿ÉÒÔÏÈÖØ¸´äÖȾ£¬È»ºóÔÙ½»ÓÉ×ÓÔªËØ<List>×Ô¼ºÔÙÈ¥Åжϡ£ÕâÑùÎÒÃǶÔpure-render-deepCompare-decoratorÒª½øÐÐһЩÐ޸쬵±ÂÖµ½props.childrenÅжϵÄʱºò£¬ÎÒÃÇÒªÇó¸¸ÔªËØÖ±½ÓÖØÐÂäÖȾ£¬ÕâÑù¾ÍÄܽ»¸ø×ÓÔªËØÈ¥×öÏÂÒ»²½µÄ´¦Àí¡£
Èç¹û<Scroll>°ü¹üµÄÖ»ÓÐ<List>»¹ºÃ£¬Èç¹û»¹ÓÐÏñ<Empty>,
<Loading>ÉõÖÁÆäËü¸ü¶àµÄ×ÓÔªËØ£¬ÄÇ<Scroll>ÖØÐÂäÖȾ»á´¥·¢ÆäËü×ÓÔªËØÈ¥ÔËË㣬ÅжÏ×Ô¼ºÊÇ·ñÒª×öÖØÐÂäÖȾ£¬Õâ¾ÍÔì³ÉÁËÀË·Ñ¡£reactµÄ¹Ù·½ÂÛ̳ÉÏÒѾÓÐÈËÌá³ö£¬ReactµÄ½«¸¸×ÓÔªËØµÄÖØ¸´äÖȾµÄ¾ö²ß¶¼·ÅÔÚshouldComponentUpdate£¬¿ÉÄܵ¼ÖÂÁËñîºÏShouldcomponentupdate
And Children¡£
lodash.merge¿ÉÒÔ½â¾ö´ó²¿·Ý³¡¾°
ÓÉÓÚimmutableµÄ´óСÎÊÌâÒ»Ö±ÝÓÈÆÍ·ÉÏ£¬¾Ã¾Ã²»µÃɢȥ£¬Òò´ËÔÙÈ¥ÕÒѰÆäËüµÄ·½°¸¡£ºóÃæ¾ö¶¨³¢ÊÔÒ»ÏÂlodash.merge£¬²¢ÓÃÉÏ֮ǰ×Ô¼ºÐ´µÄpureRender¡£ÔÚäÖȾÐÔÄÜÉÏ»¹¿ÉÒÔ½ÓÊÜ£¬ÔÚ½ö±Èimmutable²îÒ»µãµã£¨ºóÃæ»áÅû¶¾ßÌåÊý¾Ý£©£¬µ«È´´øÀ´ÁË30kbµÄ¼õ°ü¡£
ÐÔÄÜÓÅ»¯Ð¡Tips
ÕâÀï¹éÄÉÁËһЩÆäËüÐÔÄÜÓÅ»¯µÄСTips
ÇëÉ÷ÓÃsetState£¬ÒòÆäÈÝÒ×µ¼ÖÂÖØÐÂäÖȾ
¼ÈÈ»½«Êý¾ÝÖ÷Òª½»¸øÁËReduxÀ´¹ÜÀí£¬ÄǾ;¡Á¿Ê¹ÓÃRedux¹ÜÀíÄãµÄÊý¾ÝºÍ״̬state£¬³ýÁËÉÙÊýÇé¿öÍ⣬±ðÍüÁËshouldComponentUpdateÒ²ÐèÒª±È½Ïstate¡£
Ç뽫·½·¨µÄbindÒ»ÂÉÖÃÓÚconstructor
ComponentµÄrenderÀï²»¶¯Ì¬bind·½·¨£¬·½·¨¶¼ÔÚconstructorÀïbindºÃ£¬Èç¹ûÒª¶¯Ì¬´«²Î£¬·½·¨¿ÉʹÓñհü·µ»ØÒ»¸ö×îÖÕ¿ÉÖ´Ðк¯Êý¡£È磺showDelBtn(item)
{ return (e) => {}; }¡£Èç¹ûÿ´Î¶¼ÔÚrenderÀïÃæµÄjsxÈ¥bindÕâ¸ö·½·¨£¬Ã¿´Î¶¼Òª°ó¶¨»áÏûºÄÐÔÄÜ¡£
ÇëÖ»´«µÝcomponentÐèÒªµÄprops
´«µÃÌ«¶à£¬»òÕß²ã´Î´«µÃÌ«É¶¼»á¼ÓÖØshouldComponentUpdateÀïÃæµÄÊý¾Ý±È½Ï¸ºµ££¬Òò´Ë£¬Ò²ÇëÉ÷ÓÃspread
attributes£¨£©¡£
Ç뾡Á¿Ê¹ÓÃconst element
Õâ¸öÓ÷¨Êǹ¤Òµ¾ÛÔÚReactÌÖÂÛ΢ÐÅȺÀï½Ì»áµÄ£¬ÎÒÃÇ¿ÉÒÔ½«²»Ôõô±ä¶¯£¬»òÕß²»ÐèÒª´«Èë״̬µÄcomponentд³Éconst
elementµÄÐÎʽ£¬ÕâÑùÄܼӿìÕâ¸öelementµÄ³õʼäÖȾËÙ¶È¡£
·ÓÉ¿ØÖÆÓë²ð°ü
µ±ÏîÄ¿±äµÃ¸ü´ó¹æÄ£Ó븴ÔÓµÄʱºò£¬ÎÒÃÇÐèÒªÉè¼Æ³ÉSPA£¬Õâʱ·ÓɹÜÀí¾Í·Ç³£ÖØÒªÁË£¬ÕâÊ¹ÌØ¶¨url²ÎÊýÄܹ»¶ÔÓ¦Ò»¸öÒ³Ãæ¡£

PC¼ÒУȺÕû¸öÉè¼ÆÊÇÒ»¸öÖÐÐ͵ÄSPA£¬µ±js bundleÌ«´óµÄʱºò£¬ÐèÒª²ð·Ö³É¼¸¸öСµÄbundle£¬½øÐÐÒì²½¼ÓÔØ¡£Õâʱ¿ÉÒÔÓõ½webpackµÄÒì²½¼ÓÔØ´ò°ü¹¦ÄÜ£¬require¡£

ÔÚÖØ¹¹ÊÖQ¼ÒУȺ²¼ÖÃÒ³µÄʱºò£¬ÎÒÃÇÓв»Éٵĸ¡²ã£¬ÁбíÓв¼ÖÃÒ³ÄÚÈÝÖ÷¸¡²ã¡¢Í¬²½µ½¶àȺ¸¡²ã¡¢¿ÆÄ¿¹ÜÀí¸¡²ãÒÔ¼°Ö¸¶¨Èº³ÉÔ±¸¡²ã¡£ÕâЩÍêÈ«¿ÉÒÔʹÓÃreact-router½øÐйÜÀí¡£µ«ÊÇÓÉÓÚµ±Ê±Ò»ÔçʹÓÃÁËImmutablejs£¬js
bundleÒѾ±È½Ï´ó£¬ÎÒÃǾͲ»´òËãʹÓÃreact-routerÁË¡£µ«ºóÃæÈÔÈ»·¢ÏÖ°ü±ÈÖØ¹¹Ç°Òª´óһЩ£¬Òò´ËΪÁ˱£Ö¤ÊׯÁʱ¼ä²»ÂýÓÚÖØ¹¹Ç°£¬ÎÒÃÇÏ£ÍûÔÚ²»ÓÃreact-routerµÄÇé¿öϽøÐзְü£¬ÆäʵҲ²¢²»ÄÑ£¬ÈçÏÂÃæ2·ùͼ£º


Ê×ÏÈÔÚÇл»¸¡²ã·½·¨ÀïÃæ£¬Ê¹ÓÃrequire.ensure£¬Ö¸¶¨Òª¼ÓÔØÄĸö°ü¡£
ÔÚsetComponent·½·¨À½«component´æÔÚstateÀïÃæ¡£
ÔÚ¸¸ÔªËصÄäÖȾ·½·¨Àµ±stateÓÐÖµµÄʱºò£¬¾Í»á×Ô¶¯äÖȾ¼ÓÔØ»ØÀ´µÄcomponent¡£
ÐÔÄÜÊý¾Ý
ÊׯÁ¿É½»»¥Ê±¼ä
ĿǰֻÓÐÁбíÒ³·¢²¼ÍâÍøÁË£¬ÎÒÃDZȽÏÁËÓÅ»¯Ç°ºóµÄÊׯÁ¿É½»»¥Ê±¼ä£¬·Ö±ðÓÐ18%ºÍ5.3%µÄÌáÉý¡£


äÖȾFPS
Android
ReactÖØ¹¹ºóµÚÒ»°æ£¬µ±Ê±»¹Ã»×öÈκεÄÓÅ»¯£¬·¢ÏÖÆ½¾ùFPSÖ»ÓÐ22£¨ËäÈ»AndroidµÄÈâÑÛ¸ÐÊܲ»³öÀ´£©£¬¶øºóÃæÊ¹ÓÃImmutable»òÕßLodash.merge¶¼·Ç³£½Ó½ü£¬ÄÜ´ïµ½42»òÒÔÉÏ¡£¶øÊÖ»úQQ¿É½ÓÊܵÄFPS×îÉÙÖµÊÇ30FPS¡£Òò´ËʹÓÃImmutableºÍLodash.mergeµÄÓÅ»¯»¹ÊÇÏ൱Ã÷ÏԵġ£
ÖØ¹¹ºóµÚÒ»°æ

Immutable

Lodash.merge

iOS
ÔÚiOSÉϵÄfps²î¾àÓÈΪÃ÷ÏÔ¡£Öع¹ºóµÚÒ»°æ£¬ÀÁË´ó¸Å5ÆÁÖ®ºó£¬ÈâÑÛ»áÓп¨¶ÙµÄ¸Ð¾õ£¬Àµ½ÁË10ÆÁÖ®ºó£¬Êý¾Ý¿ªÊ¼µôµ½ÁË20¶à30¡£¶øImmutableºÍLodash.mergeÔò´ó²¿·Ýʱ¼ä±£³ÖÔÚ50fpsÒÔÉÏ£¬ºÜ¶àʱºò»¹ÄÜ´ïµ½·Ç³£Á÷³©µÄ60fps¡£
ÖØ¹¹ºóµÚÒ»°æ

Immutable

Lodash.merge

ChromeÄ£ÄâÆ÷
ÓÃChromeÄ£ÄâÆ÷Ò²ÄÜ¿´³öһЩ¶ËÄß¡£ÔÚScripting·½Ã棬ImmutableºÍLodash.mergeµÄºÄʱÊÇ×îÉٵģ¬Ô¼700¶àms£¬¶øÖع¹ºóµÄµÚÒ»°æÔòÐèÒª1220ms¡£Lodash.mergeÔÚrenderingºÍpaintingÉÏÔòûռµ½ÓÅÊÆ£¬µ«ImmutableÔòÒª±ÈÆäËüÁ½¸öÒªÉÙ30%
- 40%¡£ÓÉÓÚ²âÊÔµÄʱºòÊÇÔÚPC¶Ë£¬PC¶ËµÄÐÔÄÜÓÖ¼«ºÃ£¬ËùÒÔ²»¹ÜÊÇÈâÑÛ£¬»¹ÊÇÊý¾Ý£¬¶ÔÓÚ²»ÊǺܸ´ÔÓµÄÐèÇó£¬×ÜÌåµÄäÖȾÐÔÄÜ¿´²»³ö·Ç³£Ã÷ÏԵIJî¾à¡£
ÖØ¹¹ºóµÚÒ»°æ

Immutable

Lodash.merge

´ÓÉÏÃæµÄÊý¾Ý¿´À´£¬ÔÚÒÆ¶¯¶ËʹÓÃImmutableºÍLodash.mergeÏà¶ÔÓÚ²»Ó㬻áÓнϴóµÄÐÔÄÜÓÅÊÆ£¬µ«ImmutableÏà¶ÔÓÚLodash.mergeÔÚÎÒÃÇÐèÇóÇé¾°ÏÂÔÝʱû¿´³öÃ÷ÏÔµÄÓÅÊÆ£¬±ÊÕß¹À¼Æ¿ÉÄÜÊÇÓÉÓÚÏîÄ¿Êý¾Ý¹æÄ£²»´ó£¬½á¹¹²»¸´ÔÓ£¬Òò´ËImmutableµÄËã·¨ÓÅÊÆ²¢Ã»Óгä·Ö·¢»Ó³öÀ´¡£
²âÊÔ×¢Ã÷
Android¶Ë²âÊÔFPSÊÇʹÓÃÁËÌÚѶ¿ª·¢µÄGTËæÉíµ÷¡£¶øiOSÔòʹÓÃÁËMacbookÀïxCode×Ô´øµÄinstrumentÖеÄanimation¹¦ÄÜ¡£ChromeÄ£ÄâÆ÷ÔòʹÓÃÁËChromeµÄtimeline¡£²âÊԵķ½Ê½ÊÇÔÈËÙ¹ö¶¯ÁÐ±í£¬À³öÊý¾Ý½øÐÐäÖȾ¡£
ReactÐÔÄÜÓÅ»¯¾ü¹æ
ÎÒÃÇÔÚ¿ª·¢µÄ¹ý³ÌÖУ¬½«ÉÏÃæËùÂÛÊöµÄÄÚÈÝ£¬×ܽá³ÉÒ»¸ö»ù±¾µÄ¾ü¹æ£¬Ãú¼ÇÓÚÐÄ£¬¾Í¿ÉÒÔ±£Ö¤ReactÓ¦ÓõÄÐÔÄܲ»ÖÁÓÚÌ«²î¡£
äÖȾÏà¹Ø
1.ÌáÉý¼¶ÏîÄ¿ÐÔÄÜ£¬ÇëʹÓÃimmutable(props¡¢state¡¢store)
2.Çëpure-render-decoratorÓëimmutablejs´îÅäʹÓÃ
3.ÇëÉ÷ÓÃsetState£¬ÒòÆäÈÝÒ×µ¼ÖÂÖØÐÂäÖȾ
4.½÷É÷½«componentµ±×÷props´«Èë
5.Ç뽫·½·¨µÄbindÒ»ÂÉÖÃÓÚconstructor
6.ÇëÖ»´«µÝcomponentÐèÒªµÄprops£¬±ÜÃâÆäËüprops±ä»¯µ¼ÖÂÖØÐÂäÖȾ-
- £¨É÷ÓÃspread attributes£©
7.ÇëÔÚÄãÏ£Íû·¢ÉúÖØÐÂäÖȾµÄdomÉÏÉèÖÿɱ»reactʶ±ðµÄͬ¼¶Î¨Ò»key£¬·ñÔòreactÔÚijЩÇé¿ö¿ÉÄܲ»»áÖØÐÂäÖȾ¡£
8.Ç뾡Á¿Ê¹ÓÃconst element
tapʼþ
¼òµ¥µÄtapʼþ£¬ÇëʹÓÃreact-tap-event-plugin ¿ª·¢»·¾³Ê±£¬×îºÃÒýÈëwebpackµÄ»·¾³±äÁ¿£¨½öÔÚ¿ª·¢»·¾³Öгõʼ»¯£©£¬ÔÚcontainerÖгõʼ»¯¡£Éú²ú»·¾³µÄʱºò£¬Ç뽫plugin¸úreact´ò°üµ½Ò»Æð£¨ÐèÒª´ò°üÔÚÒ»Æð²ÅÄÜÕý³£Ê¹Óã¬ÒòΪplugin¶ÔreactÓкöàÒÀÀµ£©£¬ÍâÁ´ÒýÈë¡£
Ŀǰ²Î¿¼ÁËÕâ¸öÏîÄ¿µÄ´ò°ü·½°¸£º
https://github.com/hartmamt/react-with-tap-events
Facebook¹Ù·½issue: https://github.com/
facebook/react/blo
b/bef45b0b1a98ea9b472ba664d955a039cf2f806
8/src/renderers/dom/client/eventPlugins/
TapEventPlugin.js
React-tap-event-plugin github:
https://github.com/zilverline/react-tap-event-plugin |
¸´ÔÓµÄtapʼþ£¬½¨ÒéʹÓÃtap component ¼ÒУȺÁбíÒ³µÄÿ¸ö×÷ÒµµÄtap½»»¥¶¼±È½Ï¸´ÔÓ£¬³öÁËÆÕͨµÄtapÖ®Í⣬»¹ÐèÒªlong
tapºÍswipe¡£Òò´ËÎÒÃÇÖ»ºÃ×Ô¼º·â×°ÁËÒ»¸ötap component
DebugÏà¹Ø
1.ÒÆ¶¯¶ËÇëÉ÷ÓÃredux-devtools£¬Ò×Ôì³É¿¨¶Ù
2.WebpackÉ÷ÓÃdevtoolsµÄinline-source-mapģʽ
ʹÓôËģʽ»áÄÚÁªÒ»´ó¶Î±ãÓÚ¶¨Î»bugµÄ×Ö·û´®£¬²é´íʱ¿ÉÒÔ¿ªÆô£¬²»ÊDzé´íʱ½¨Ò鹨±Õ£¬·ñÔò¿ª·¢Ê±¼ÓÔØµÄ°ü»á·Ç³£´ó¡£
ÆäËü
1.É÷ÓÃ̫еÄes6Óï·¨¡£ Object.assignµÈ½ÏеÄÀà¿â±ÜÃâÔÚÒÆ¶¯¶ËÉÏʹÓ㬻ᱨ´í¡£
Object.assignĿǰʹÓÃobject-assign°ü¡£»òÕßʹÓÃbabel-plugin-transform-object-assign²å¼þ¡£»áת»»³ÉÒ»¸öextendsµÄº¯Êý£º
var
_extends = ...;
_extends(a, b); |
2.×¢ÒâObject.assignÊÇdz¿½±´ Object.assignÊÇdz¿½±´£¬ÈôÊý¾Ý½á¹¹²ã´Î½ÏÉîµÄʱºò»á¿½±´Ê§°Ü£¬Ö±½Ó»Ø´«Ô±¾µÄobject
reference£¬´Ë´¦ÍƼölodash.merge¡£ |