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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʹÓÃReact + Redux + React-router¹¹½¨¿ÉÀ©Õ¹µÄǰ¶ËÓ¦ÓÃ
 
À´Ô´£ºsegmentfault ·¢²¼ÓÚ 2016-11-23
  2225  次浏览      27
 

ÏÖÔÚÊÇǰ¶Ë¿ª·¢×îºÃµÄʱ´ú£¬ÓÐÌ«¶àºÜºÃµÄ¿ò¼ÜºÍ¹¤¾ß°ïÄã¸üºÃµÄʵÏÖ¸´ÔÓÐèÇó;ͬʱÓÖÊÇ×îÀ§ÄѵÄʱ´ú£¬ÒòΪÐèÒªÕÆÎÕÌ«¶àµÄ¿ò¼ÜºÍ¹¤¾ß¡£ÈçºÎÀûÓúø÷ÖÖ¿ò¼ÜÀ´Ìá¸ßǰ¶Ë¿ª·¢ÖÊÁ¿ÊÇ´ó¼Ò¶¼ÔÚ̽Ë÷µÄÎÊÌâ¡£±¾Îľͽ«½éÉÜÈçºÎʹÓà React ¼°ÆäÏà¹Ø¼¼Êõ£¬À´½øÐÐʵ¼Êǰ¶ËÏîÄ¿µÄ¿ª·¢¡£ÒòΪÖ÷Òª½éÉÜÈçºÎ½«¼¼ÊõÓÃÓÚʵ¼ù£¬ËùÒÔÏ£Íû¶ÁÕßÒѾ­¶ÔÏà¹Ø¸ÅÄîÒѾ­ÓÐÒ»¶¨µÄÁ˽⡣

±¾ÎÄ×î³õÀ´Ô´ÓÚ±ÊÕßÔÚ StuQ µÄÒ»´ÎͬÃû¿Î³ÌÖ±²¥£¬ÏÖÔÚ¼ÓÒÔÕûÀí³ÉÎÄ£¬Ï£ÍûÄܶԸü¶àµÄÈËÓÐËùÆô·¢¡£ÎªÁ˹̻¯ÕâÖÖʵ¼ù·½Ê½£¬µ±Ê±»¹¿ª·¢ÁËÒ»¸öÃûΪ Rekit µÄ¹¤¾ß£¬ÓÃÓÚÈ·±£ÏîÄ¿Äܹ»Ê¼ÖÕ×ñÑ­ÕâÖÖʵ¼ù·½Ê½¡£ÏÖÔÚ¹¤¾ßÒ²»ñµÃ½øÒ»²½ÍêÉÆ£¬´ó¼ÒÒ²¿ÉÒÔ½áºÏ Rekit À´Àí½âÎÄÖÐÌáµ½µÄʵ¼ù·½°¸¡£

ÆäʵÎÞÂÛʹÓÃʲôÑùµÄ¼¼Êõ£¬Ò»¸öÀíÏëÖÐµÄ Web ÏîÄ¿´ó¸Å¶¼ÐèÒª¿¼ÂÇÒÔϼ¸¸ö·½Ã棺

Ò×ÓÚ¿ª·¢£ºÔÚ¹¦ÄÜ¿ª·¢Ê±£¬ÎÞÐè¹Ø×¢¸´Ôӵļ¼Êõ¼Ü¹¹£¬Äܹ»Ö±¹ÛµÄд¹¦ÄÜÏà¹ØµÄ´úÂë¡£

Ò×ÓÚÀ©Õ¹£ºÔö¼Óй¦ÄÜʱ£¬ÎÞÐè¶ÔÒÑÓмܹ¹½øÐе÷Õû£¬Ð¹¦ÄܺÍÒÑÓй¦ÄܾßÓкܺõĸôÀëÐÔ£¬²¢ÄܺܺõÄÏνӡ£Ð¹¦ÄܵÄÔö¼Ó²¢²»»á´øÀ´ÏÔÖøµÄÐÔÄÜÎÊÌâ¡£

Ò×ÓÚά»¤£º´úÂëÖ±¹ÛÒ×¶ÁÒ×Àí½â¡£¼´Ê¹ÊÇмÓÈëµÄ¿ª·¢³ÉÔ±£¬Ò²Äܹ»ºÜ¿ìµÄÀí½â¼¼Êõ¼Ü¹¹ºÍ´úÂëÂß¼­¡£

Ò×ÓÚ²âÊÔ£º´úÂëµ¥ÔªÐԺã¬Äܹ»¾¡Á¿Ê¹Óô¿º¯Êý¡£ÎÞÐè»òºÜÉÙÐèÒª mock ¼´¿ÉÍê³Éµ¥Ôª²âÊÔ¡£

Ò×ÓÚ¹¹½¨£º´úÂëºÍ¾²Ì¬×ÊÔ´½á¹¹·ûºÏÖ÷Á÷ģʽ£¬Äܹ»Ê¹Óñê×¼µÄ¹¹½¨¹¤¾ß½øÐй¹½¨¡£ÎÞÐè×Ô¼ºÊµÏÖ¸´ÔӵĹ¹½¨Âß¼­¡£

ÕâЩ·½Ãæ²¢²»ÊÇ»¥Ïà¶ÀÁ¢£¬¶øÊÇ»¥ÏàÒÀÀµ»¥ÏàÖÆÔ¼¡£µ±Ä³¸ö·½Ãæ×öµ½¼«Ö£¬ÆäËüµã¾Í»áÊܵ½Ó°Ïì¡£¾ÙÀýÀ´Ëµ£¬Ð´Ò»¸ö¼ÆÊýÆ÷¹¦ÄÜ£¬ÓÃjQueryÒ»¸öÒ³ÃæÄÚ¼´¿ÉÍê³É£¬µ«ÊÇÒ׿ª·¢ÁË£¬È´²»Ò×À©Õ¹¡£Òò´ËÎÒÃÇͨ³£¶¼ÐèÒª¸ù¾Ýʵ¼ÊÏîÄ¿Çé¿öÔÚÕâЩµãÖ®¼ä×öÒ»¸öȨºâ£¬´ïµ½ÊʺÏÏîÄ¿µÄ×î¼Ñ״̬¡£ÇìÐÒµÄÊÇ£¬ÏÖÔÚµÄǰ¶Ë¼¼Êõ¿ìËÙ·¢Õ¹£¬²»¶Ï³öÏÖµÄм¼Êõ°ïÖúÎÒÃÇÔÚ¸÷¸ö·½Ãæ¶¼»ñµÃºÜ´óÌáÉý¡£

±¾ÎĽ«Òª½éÉܵľÍÊÇÈçºÎÀûÓà React + Redux + React-router À´¹¹½¨¿ÉÀ©Õ¹µÄǰ¶ËÓ¦Óá£ÕâÀïÇ¿µ÷¿ÉÀ©Õ¹£¬ÒòΪ´«Í³Ç°¶ËʵÏÖ·½°¸Í¨³£ÔÚÃæ¶Ô¸´ÔÓÓ¦ÓÃʱ³£³£Á¦²»´ÓÐÄ£¬´úÂë½á¹¹ÈÝÒ×»ìÂÒ£¬ÐÔÄÜÎÊÌâÄÑÒÔ½â¾ö¡£¶ø¿ÉÀ©Õ¹ÔòÒâζ×ÅÄܹ»´ÓÏîÄ¿µÄ³õʼ½×¶Î¾Í¾ßÓÐÁËÖ§³Ö¸´ÔÓÏîÄ¿µÄÄÜÁ¦¡£Ê×ÏÈÎÒÃÇ¿´ÏÂÉæ¼°µ½µÄÖ÷Òª¼¼Êõ¡£

React

React ÏàÐÅ´ó¼ÒÒѾ­·Ç³£ÊìϤ£¬Æä×é¼þ»¯µÄ˼ÏëºÍÐéÄâ DOM µÄʵÏÖ¶¼Êǵ߸²ÐԵıä¸ï£¬´Ó¶øÈÃǰ¶Ë¿ª·¢¿ÉÒÔÔÚеķ½ÏòÉϲ»¶ÏÌáÉý¡£ÎÞÂÛÊÇ React-hot-loader£¬Redux »¹ÊÇ React-router£¬¶¼ÕýÊÇÒòΪ³ä·ÖÀûÓÃÁË React µÄÕâÐ©ÌØÐÔ£¬²ÅÄܹ»ÌṩÈç´ËÇ¿´óµÄ¹¦ÄÜ¡£±ÊÕßÔø¾­Ð´¹ý¡¶ÉîÈëdz³öReact¡· µÄϵÁÐÎÄÕ£¬ÓÐÐèÒªµÄ»°¿ÉÒÔ½øÒ»²½ÔĶÁ¡£

Redux

Redux ÊÇ JavaScript ³ÌÐò״̬¹ÜÀí¿ò¼Ü¡£¾¡¹ÜÊÇÒ»¸öͨÓÃÐ͵Ŀò¼Ü£¬µ«ÊÇºÍ React ÔÚÒ»ÆðÄܹ»¸üºÃµÄ¹¤×÷£¬ÒòΪµ±×´Ì¬±ä»¯Ê±£¬React ¿ÉÒÔ²»ÓùØÐı仯µÄϸ½Ú£¬ÓÉÐéÄâ DOM »úÖÆÍê³ÉÓÅ»¯¹ýµÄUI¸üÐÂÂß¼­¡£

Redux Ò²±»ÈÏΪÕû¸ö React Éú̬Ȧ×îÄÑÕÆÎյļ¼ÊõÖ®Ò»¡£Æä action£¬reducer ºÍ¸÷ÖÖÖмä¼þËäÈ»½«´úÂëÂß¼­³ä·Ö¸ôÀ룬¼´³£ËµµÄ separation of concerns£¬µ«ÔÚÒ»¶¨³Ì¶ÈÉÏÒ²¸ø¿ª·¢´øÀ´Á˲»±ã¡£ÕâÒ²ÊÇÉÏÃæÌáµ½µÄ£¬ÔÚÒ×ά»¤¡¢Ò×À©Õ¹¡¢ÒײâÊÔÉϵõ½ÁËÌáÉý£¬ÄÇôÒ׿ª·¢ÔòÊܵ½ÁËÓ°Ïì¡£

React-router

¼´Ê¹¶ÔÓÚÒ»¸ö¼òµ¥µÄÓ¦Óã¬Â·Óɹ¦ÄÜÒ²ÊǼ«ÆäÖØÒªµÄ¡£ÕýÈ紫ͳ Web ³ÌÐòÓÃÒ³ÃæÀ´×éÖ¯²»Í¬µÄ¹¦ÄÜÄ£¿é£¬Óɲ»Í¬µÄ URL À´Çø·ÖºÍµ¼º½£¬µ¥Ò³Ó¦ÓÃʹÓà Router À´ÊµÏÖͬÑùµÄ¹¦ÄÜ£¬Ö»ÊÇÔÚǰ¶Ë½øÐÐäÖȾ¶ø²»ÊÇ·þÎñÆ÷¶Ë¡£React Ó¦Óõġ°±ê×¼¡±Â·ÓÉ·½°¸¾ÍÊÇʹÓà React-router¡£

·Óɹ¦Äܲ»½öÈÃÓû§¸üÈÝÒ×ʹÓÃ(ÀýÈçË¢ÐÂÒ³Ãæºóά³Ö UI)£¬Ò²Äܹ»ÔÚ¿ª·¢Ê±ÈÃÎÒÃÇ˼¿¼ÈçºÎ¸üºÃ×éÖ¯¹¦Äܵ¥Ôª£¬ÕâÒ²Êǹ¦Äܸ´ÔÓÖ®ºóµÄ±ØÈ»ÐèÇó¡£ËùÒÔ¼´Ê¹Ò»¿ªÊ¼µÄÐèÇóºÜ¼òµ¥£¬ÎÒÃÇÒ²Ó¦¸ÃÒýÈë React-router °ïÖúÎÒÃÇÒÔÒ³ÃæÎªµ¥Ôª½øÐй¦ÄܵÄ×éÖ¯¡£

ÆäËüÐèÒªµÄ¼¼Êõ

ÕýÈçÇ°ÃæÌáµ½µÄ£¬¿ª·¢Ç°¶ËÓ¦ÓÃÐèÒªºÜ¶àÖܱ߼¼Êõ£¬Õâ½øÒ»²½Ôö¼ÓÁËǰ¶Ë¿ª·¢µÄÃż÷£¬ÀýÈ磺

ʹÓà Babel Ö§³Ö ES2016 ºÍ JSX Óï·¨;

ʹÓà react-redux ½« Redux ºÍ React ÎÞ·ì½áºÏ;

ʹÓà Webpack ½øÐÐÏîÄ¿´ò°ü;

ʹÓà webpack-dll-plugin ÓÅ»¯´ò°üÐÔÄÜ;

ʹÓà ESLint ½øÐÐÓï·¨¼ì²é;

ʹÓà Mocha£¬Enzyme£¬Istanbul ½øÐе¥Ôª²âÊÔ;

ʹÓà Less¡¢Scss »òÆäËü½øÐÐ CSS Ô¤±àÒë¡£

ÕâЩ¹¤¾ßÌá¸ßÁËǰ¶Ë¿ª·¢µÄÄÜÁ¦ºÍЧÂÊ£¬µ«ÊÇÁ˽ⲢÅäÖÃËüÃÇÈ´²¢·ÇÒ×Ê£¬¶øÊÂʵÉÏÕâЩ¹¤¾ßºÍÐèÒª¿ª·¢µÄ¹¦Äܲ¢Ã»ÓÐÖ±½ÓµÄ¹ØÏµ¡£Ê¹Óù¤¾ßÀ´×Ô¶¯»¯ÕâЩÅäÖÃÊDZØÈ»µÄ·¢Õ¹·½Ïò£¬ÕýÈçÏÖÔÚ¿ª·¢Ò»¸ö C++ Ó¦Óã¬Visual Studio »á°ïÄãÍê³ÉËùÓеÄÅäÖò¢´î½¨ºÏÊʵÄÏîÄ¿½á¹¹£¬ÈÃÄãרעÓÚ¹¦ÄÜÂß¼­µÄ¿ª·¢¡£ÎÞÂÛÊÇ×Ô¼ºÊµÏÖ£¬»¹ÊÇÀûÓõÚÈý·½£¬ÎÒÃǶ¼Ó¦¸ÃΪ×Ô¼ºµÄÏîÄ¿´´½¨ÕâÑùµÄ¹¤¾ßÁ´¡£

¼òµ¥½éÉÜÁËÏà¹Ø¼¼Êõ£¬ÏÂÃæÎÒÃÇÀ´¿´ÈçºÎÈ¥¹¹½¨¿ÉÀ©Õ¹µÄ Web ÏîÄ¿¡£

°´¹¦ÄÜ(feature)À´×éÖ¯Îļþ¼Ð½á¹¹

ÎÞÂÛÊÇ Flux »¹ÊÇ Redux£¬ÌṩµÄ¹Ù·½Ê¾Àý¶¼ÊÇÒÔ¼¼ÊõÂß¼­À´×éÖ¯Îļþ¼ÐµÄ£¬ÀýÈ磬ÏÂÃæÊÇ Redux µÄ Todo ʾÀýÓ¦ÓõÄÎļþ¼Ð½á¹¹£º

ËäÈ»ÕâÖÖģʽÔÚ¼¼ÊõÉϺÜÇåÎú£¬ÔÚʵ¼ÊÏîÄ¿ÖÐÈ´ÓкܴóµÄȱµã£º

ÄÑÒÔÀ©Õ¹¡£µ±Ó¦Óù¦ÄÜÔö¼Ó£¬¹æÄ£±ä´óʱ£¬Ò»¸ö components Îļþ¼ÐÏ¿ÉÄÜ»áÓм¸Ê®ÉϰٸöÎļþ£¬×é¼þ¼äµÄ¹ØÏµ¼«²»Ö±¹Û¡£

ÄÑÒÔ¿ª·¢¡£ÔÚ¿ª·¢Ä³¸ö¹¦ÄÜʱ£¬Í¨³£ÐèҪͬʱ¿ª·¢×é¼þ£¬action£¬reducer ºÍÑùʽ¡£°ÑËüÃÇ·Ö²¼ÔÚ²»Í¬Îļþ¼ÐÏÂÑÏÖØÓ°Ï쿪·¢Ð§ÂÊ¡£ÓÈÆäÊÇÏîÄ¿¸´ÔÓÖ®ºó£¬²»Í¬ÎļþµÄÇл»»áÏûºÄ´óÁ¿Ê±¼ä¡£

Òò´Ë£¬ÎÒÃÇʹÓ𴹦ÄÜÀ´×éÖ¯Îļþ¼ÐµÄ·½Ê½£¬¼´¹¦ÄÜÏà¹ØµÄ´úÂë·Åµ½Ò»¸öÎļþ¼Ð¡£ÀýÈ磬¶ÔÓÚÒ»¸ö¼òµ¥ÂÛ̳³ÌÐò£¬¿ÉÄܰüº¬ user£¬topic£¬comment Õâô¼¸¸öºËÐŦÄÜ¡£

ÿ¸ö¹¦ÄÜÎļþ¼Ðϰüº¬×Ô¼ºµÄÒ³Ãæ£¬×é¼þ£¬Ñùʽ£¬action ºÍ reducer¡£

ÕâÖÖÎļþ¼Ð½á¹¹ÔÚ¹¦ÄÜÉ϶ø·Ç¼¼ÊõÉ϶ԴúÂëÂß¼­½øÐÐÇø·Ö£¬Ê¹µÃÓ¦ÓþßÓиüºÃµÄÀ©Õ¹ÐÔ£¬µ±Ôö¼ÓÐµĹ¦ÄÜʱ£¬Ö»ÐèÔö¼ÓÒ»¸öеÄÎļþ¼Ð¼´¿É;ɾ³ý¹¦ÄÜʱͬÀí¡£

ʹÓÃÒ³Ãæ(Page)µÄ¸ÅÄî

Ç°ÃæÌáµ½ÁË·ÓÉÊǵ±½ñǰ¶ËÓ¦ÓõIJ»¿ÉȱÉٵIJ¿·ÖÖ®Ò»£¬ÄÇô¶ÔÓ¦µ½×é¼þ¼¶±ð£¬¾ÍÊÇÒ³Ãæ×é¼þ¡£Òò´ËÎÒÃÇÔÚ¿ª·¢µÄ¹ý³ÌÖУ¬ÐèÒªÃ÷È·¶¨ÒåÒ³ÃæµÄ¸ÅÄ

Ò»¸öÒ³ÃæÓµÓÐ×Ô¼ºµÄ URL µØÖ·¡£Ò³ÃæµÄÕ¹ÏÖºÍÒþ²ØÍêÈ«ÓÉ React-router ½øÐпØÖÆ¡£µ±´´½¨Ò»¸öÒ³ÃæÊ±£¬Í¨³£Òâζ×ÅÔÚ·ÓÉÅäÖÃÀïÔö¼ÓÒ»ÌõÐµĹæÔò¡£ÕâºÍ´«Í³ Web Ó¦Ó÷dz£ÀàËÆ¡£

Ò»¸öÒ³Ãæ¶ÔÓ¦ Redux µÄÈÝÆ÷×é¼þµÄ¸ÅÄî¡£Ò³ÃæÊ×ÏÈÊÇÒ»¸ö±ê×¼µÄ React ×é¼þ£¬Æä´ÎËüͨ¹ý react-redux ·â×°³ÉÈÝÆ÷×é¼þ´Ó¶ø¾ß±¸ºÍ Redux ½»»¥µÄÄÜÁ¦¡£

Ò³ÃæÊǵ¼º½µÄ»ù±¾Ä£¿éµ¥Ôª£¬Í¬Ê±Ò²ÊÇͬһ¹¦ÄÜÏà¹Ø UI µÄÈÝÆ÷£¬ÕâÖÖ·ûºÏ´«Í³ Web ¿ª·¢·½Ê½µÄ¸ÅÄîÓÐÖúÓÚÈÃÏîÄ¿½á¹¹¸üÈÝÒ×Àí½â¡£

ÿ¸ö action Ò»¸ö¶ÀÁ¢Îļþ

ʹÓà Redux À´¹ÜÀí״̬£¬¾ÍÐèÒª½øÐÐ action ºÍ reducer µÄ¿ª·¢¡£ÔÚ¹Ù·½Ê¾ÀýÒÔ¼°¼¸ºõËùÓеĽ̳ÌÖУ¬ËùÓÐµÄ action ¶¼·ÅÔÚÒ»¸öÎļþ£¬¶øËùÓÐµÄ reducer Ôò·ÅÔÚÁíÍâµÄÎļþ¡£ÕâÖÖ×ö·¨Ò×ÓÚÀí½âµ«ÊDz»¾ß±¸ºÜºÃµÄ¿ÉÀ©Õ¹ÐÔ£¬¶øÇÒµ±ÏîÄ¿¸´ÔÓºó£¬action ÎļþºÍ reducer Îļþ¶¼»á±äµÃºÜÈß³¤£¬²»Ò׿ª·¢ºÍά»¤¡£

Òò´ËÎÒÃÇʹÓÃÿ¸ö action Ò»¸ö¶ÀÁ¢ÎļþµÄģʽ£ºÃ¿¸ö Redux µÄ action ºÍ¶ÔÓ¦µÄ reducer ·ÅÔÚͬһ¸öÎļþ¡£Ê¹ÓÃÕâ¸ö×ö·¨µÄÁíÒ»¸öÔ­ÒòÊÇÎÒÃÇ·¢ÏÖÿ´Î´´½¨Íê action ¼¸ºõ¶¼ÐèÒªÁ¢¿Ì´´½¨ reducer ¶ÔÆä½øÐд¦Àí¡£°ÑËüÃÇ·ÅÔÚͬһ¸öÎļþÓÐÀûÓÚ¿ª·¢Ð§ÂʺÍά»¤¡£

ÒÔ¿ª·¢Ò»¸ö¼ÆÊýÆ÷×é¼þΪÀý£º

ΪʵÏÖµã»÷¡°+¡±ºÅÔö¼Ó1µÄ¹¦ÄÜ£¬ÎÒÃÇÊ×ÏÈÐèÒª´´½¨Ò»¸öÀàÐÍΪ "COUNTER_PLUS_ONE" µÄ action £¬Ö®ºó¾ÍÁ¢¿ÌÐèÒª´´½¨¶ÔÓ¦µÄ Reducer À´¸üРstore µÄÊý¾Ý¡£¹Ù·½Ê¾ÀýµÄ×ö·¨ÊÇ·Ö±ðÔÚ actions.js ºÍ reducer.js Öзֱð¼ÓÈëÏàÓ¦µÄÂß¼­¡£¶øÊ¹ÓÃÿ¸ö action ¶ÀÁ¢ÎļþµÄ×ö·¨£¬ÔòÊÇ´´½¨Ò»¸öÃûΪ counterPlusOne.js µÄÎļþ£¬¼ÓÈëÈçÏ´úÂ룺

import { 
COUNTER_PLUS_ONE,
} from './constants';

export function counterPlusOne() {
return {
type: COUNTER_PLUS_ONE,
};
}

export function reducer(state, action) {
switch (action.type) {
case COUNTER_PLUS_ONE:
return {
...state,
count: state.count + 1,
};

default:
return state;
}
}

°´ÎÒÃǵľ­Ñ飬´ó²¿·ÖµÄ reducer ¶¼»á¶ÔÓ¦µ½ÏàÓ¦µÄ action£¬ºÜÉÙÐèÒª¿ç¹¦ÄÜÈ«¾ÖʹÓá£Òò´Ë£¬½«ËüÃÇ·ÅÈëÒ»¸öÎļþÊÇÍêÈ«ºÏÀíµÄ£¬ÓÐÖúÓÚÌá¸ß¿ª·¢Ð§ÂÊ¡£ÐèҪעÒâµÄÊÇ£¬ÕâÀﶨÒåµÄ reducer ²¢²»ÊDZê×¼µÄ Redux reducer£¬ÒòΪËüûÓгõʼ״̬(initial state)¡£Ëü½ö½öÊDZ»¹¦ÄÜÎļþ¼Ðϵĸù reducer µ÷Óá£×¢ÒâÕâ¸ö reducer ¹Ì¶¨ÃüÃûΪ "reducer"£¬´Ó¶ø·½±ãÆä±»×Ô¶¯¼ÓÔØ¡£

¶ÔÓÚÒì²½ action(ͨ³£ÊÇÔ¶³Ì API ÇëÇó)£¬ÔòÐèÒª¶Ô´íÎóÐÅÏ¢½øÐд¦Àí£¬Òò´ËÔÚÕâ¸öÎļþÖÐÓжà¸ö±ê×¼ action ´æÔÚ¡£ÀýÈçÒÔ±£´æÎÄÕÂΪÀý£¬ÔÚ saveArticle.js Õâ¸ö action ÎļþÖУ¬Í¬Ê±´æÔÚ saveArticle ºÍ dismissSaveArticleError ÕâÁ½¸ö action¡£

ÈçºÎ´¦Àí¿ç¹¦ÄÜµÄ action?

¾¡¹Ü²»ÊǺܳ£¼û£¬µ«ÊÇÓÐЩ action ÊÇ¿ÉÄܱ»¶à¸ö reducer ´¦ÀíµÄ¡£ÀýÈ磬¶ÔÓÚÕ¾ÄÚÁÄÌ칦ÄÜ£¬µ±ÊÕµ½Ò»ÌõÐÂÏûϢʱ£º

Èç¹ûÁÄÌì¿ò¿ª×Å£¬ÄÇôֱ½ÓÏÔʾÐÂÏûÏ¢¡£

·ñÔò£¬ÏÔʾһÌõ֪ͨÌáʾÓÐеÄÏûÏ¢¡£

¿É¼û£¬NEW_MESSAGE Õâ¸ö action ÀàÐÍÐèÒª±»²»Í¬µÄ reducer ´¦Àí£¬´Ó¶øÄܹ»ÔÚ²»Í¬µÄ UI ×é¼þ×ö²»Í¬µÄÕ¹ÏÖ¡£ÎªÁË´¦ÀíÕâÀà action£¬Ã¿¸ö¹¦ÄÜÎļþ¼Ð϶¼ÓÐÒ»¸ö reducer.js Îļþ£¬ÔÚÀïÃæ¿ÉÒÔ´¦Àí¿ç¹¦ÄÜµÄ action¡£

ËäÈ»²»Í¬ action µÄ reducer ·Ö²¼ÔÚ²»Í¬µÄÎļþÖУ¬µ«ËüÃǺ͹¦ÄÜÏà¹ØµÄ root reducer ¹²Í¬²Ù×÷ͬһ¸ö״̬£¬¼´Í¬Ò»¸ö store ·ÖÖ§¡£Òò´Ë feature/reducer.js ¾ßÓÐÈçϵĴúÂë½á¹¹£º

import initialState from './initialState'; 
import { reducer as counterPlusOne } from './counterPlusOne';
import { reducer as counterMinusOne } from './counterMinusOne';
import { reducer as resetCounter } from './resetCounter';

const reducers = [
counterPlusOne,
counterMinusOne,
resetCounter,
];

export default function reducer(state = initialState, action) {
let newState;
switch (action.type) {
// Put global reducers here
default:
newState = state;
break;
}
return reducers.reduce((s, r) => r(s, action), newState);
}

Ëü¸ºÔðÒýÈ벻ͬ action µÄ reducer£¬µ±ÓÐ action ¹ýÀ´Ê±£¬±éÀúËùÓÐµÄ reducer ²¢½áºÏÐèÒªµÄÈ«¾Ö reducer À´ÊµÏÖ¶Ô store µÄ¸üС£ËùÓй¦ÄÜÏà¹ØµÄ root reducer ×îÖÕ±»×éºÏµ½È«¾ÖµÄ Redux root reducer ´Ó¶ø±£Ö¤È«¾ÖÖ»ÓÐÒ»¸ö store µÄ´æÔÚ¡£

ÐèҪעÒâµÄÊÇ£¬Ã¿µ±´´½¨Ò»¸öÐ嵀 action ʱ£¬¶¼ÐèÒªÔÚÕâ¸öÎļþÖÐ×¢²á¡£ÒòΪÆäģʽ·Ç³£¹Ì¶¨£¬ÎÒÃÇÍêÈ«¿ÉÒÔʹÓù¤¾ßÀ´×Ô¶¯×¢²áÏàÓ¦µÄ´úÂë¡£Rekit ¿ÉÒÔ°ïÖú×öµ½ÕâÒ»µã£ºµ±´´½¨ action ʱ£¬Ëü»á×Ô¶¯ÔÚ reducer.js ÖмÓÈëÏàÓ¦µÄ´úÂ룬¼È¼õÉÙÁ˹¤×÷Á¿£¬ÓÖ¿ÉÒÔ±ÜÃâ³ö´í¡£

ʹÓõ¥Îļþ action µÄºÃ´¦

ʹÓÃÕâÖÖ·½Ê½£¬¿ÉÒÔ´øÀ´ºÜ¶àºÃ´¦£¬±ÈÈ磺

Ò×ÓÚ¿ª·¢£ºµ±´´½¨ action ʱ£¬ÎÞÐèÔÚ¶à¸öÎļþÖÐÌø×ª;

Ò×ÓÚά»¤£ºÒòΪÿ¸ö action ÔÚµ¥¶ÀµÄÎļþ£¬Òò´Ëÿ¸öÎļþ¶¼ºÜ¶ÌС£¬Í¨¹ýÎļþÃû¾Í¿ÉÒÔ¶¨Î»µ½ÏàÓ¦µÄ¹¦ÄÜÂß¼­;

Ò×ÓÚ²âÊÔ£ºÃ¿¸ö action ¶¼¿ÉÒÔʹÓÃÒ»¸ö¶ÀÁ¢µÄ²âÊÔÎļþ½øÐи²¸Ç£¬²âÊÔÎļþÖÐÒ²ÊÇͬʱ°üº¬¶Ô action ºÍ reducer µÄ²âÊÔ;

Ò×ÓÚ¹¤¾ß»¯£ºÒòΪʹÓà Redux µÄÓ¦ÓþßÓнÏΪ¸´Ôӵļ¼Êõ½á¹¹£¬ÎÒÃÇ¿ÉÒÔʹÓù¤¾ßÀ´×Ô¶¯»¯Ò»Ð©Âß¼­¡£ÏÖÔÚÎÒÃÇÎÞÐè½øÐÐÓï·¨·ÖÎö¾Í¿ÉÒÔ×Ô¶¯Éú³É´úÂë¡£

Ò×ÓÚ¾²Ì¬·ÖÎö£ºÈ«¾ÖµÄ action ºÍ reducer ͨ³£Òâζ×ÅÄ£¿é¼äµÄÒÀÀµ¡£ÕâʱÎÒÃÇÖ»Òª·ÖÎö¹¦ÄÜÎļþ¼ÐÏ嵀 reducer.js£¬¼´¿ÉÒÔÕÒµ½ËùÓÐÕâЩÒÀÀµ¡£

React-router µÄ¹æÔò¶¨Òå

ͨ³£À´Ëµ£¬ÎÒÃÇ»áͨ¹ýÒ»¸öÅäÖÃÎļþ¶¨ÒåËùÓеÄ·ÓɹæÔò¡£Í¬ÑùµÄ£¬ÕâÖÖ·½Ê½²»¾ßÓÐÀ©Õ¹ÐÔ£¬µ±ÏîÄ¿±ä¸´ÔÓÖ®ºó£¬¹æÔò¶¨Òå±í»á±äµÃÈß³¤¶ø¸´ÔÓ¡£¼ÈÈ»ÎÒÃÇÒѾ­ÒÔ¹¦ÄÜΪµ¥Î»½øÐÐÎļþ¼ÐµÄ×éÖ¯£¬ÎÒÃÇͬÑù¿ÉÒ԰ѹ¦ÄÜÏà¹ØµÄ·ÓɹæÔòÒ²·Åµ½¶ÔÓ¦Îļþ¼ÐÏ¡£Òò´Ë£¬ÎÒÃÇ¿ÉÒÔÀûÓà React-router µÄ JavaScript API ½øÐзÓɹæÔòµÄ¶¨Ò壬¶ø²»ÊÇÓó£¼ûµÄ JSX Óï·¨¡£

ÀýÈ磬¶ÔÓÚÒ»¸ö¼òµ¥ÂÛ̳³ÌÐò£¬Ö÷Ì⹦ÄܶÔÓ¦µÄ·Óɶ¨Òå¾Í·ÅÔÚ features/topic/route.js ÖУ¬ÄÚÈÝÈçÏ£º

import { 
EditPage,
ListPage,
ViewPage,
} from './index';

export default {
path: '',
name: '',
childRoutes: [
{ path: '', component: ListPage, name: 'Topic List', isIndex: true },
{ path: 'topic/add', component: EditPage, name: 'New Topic' },
{ path: 'topic/:topicId', component: ViewPage },
],
};

ËùÓй¦ÄÜÏà¹ØµÄ·Óɶ¨Òå¶¼±»È«¾ÖµÄ¸ù·ÓÉÅäÖÃ×Ô¶¯¼ÓÔØ£¬Òò´Ë£¬Â·ÓɼÓÔØÆ÷¾ßÓÐÈçϵĴúÂëģʽ£º

import topicRoute from '../features/topic/route'; 
import commentRoute from '../features/comment/route';

const routes = [{
path: '/rekit-example',
component: App,
childRoutes: [
topicRoute,
commentRoute,
{ path: '*', name: 'Page not found', component: PageNotFound },
],
}];

¿É¼û£¬Õâ¸öÈ«¾Ö·ÓɼÓÔØÆ÷¸ºÔð¼ÓÔØËùÓÐ feature µÄ·ÓɹæÔò¡£ÀàËÆ root reducer£¬ÕâÀïµÄ´úÂëģʽҲÊǷdz£¹Ì¶¨µÄ£¬Òò´Ë¿ÉÒÔ½èÖú¹¤¾ßÀ´Î¬»¤Õâ¸öÎļþ¡£µ±Ê¹Óà Rekit ´´½¨Ò³ÃæÊ±£¬¾Í»á×Ô¶¯Ôڴ˼ÓÈë·ÓɹæÔò¡£

ʹÓù¤¾ß¸¨Öú¿ª·¢

ÓÉÉÏÃæµÄ½éÉÜ¿ÉÒÔ¿´µ½£¬¿ª·¢Ò»¸ö React ³ÌÐò²¢²»ÈÝÒ×£¬¼´Ê¹Ò»¸ö¼òµ¥µÄ¹¦ÄÜ£¬Ò²ÐèÒª´óÁ¿µÄËöËéµÄ£¬µ«È´·Ç³£ÖØÒªµÄ´úÂëÀ´È·±£Ò»¸öÁ¼ºÃµÄ¼Ü¹¹£¬´Ó¶øÈÃÓ¦ÓÃÒ×ÓÚÀ©Õ¹ºÍά»¤£¬ËäÈ»ÕâЩÖܱߴúÂëºÍÄãÐèÒªµÄ¹¦Äܲ¢Ã»ÓÐÖ±½Ó¹ØÏµ¡£

ÀýÈ磬¶ÔÓÚÒ»¸öÂÛ̳³ÌÐò£¬ÐèÒªÒ»¸öÁбí½çÃæÕ¹Ê¾×î½ü·¢±íµÄÖ÷Ì⣬ΪÁË×öÕâÑùÒ»¸öÒ³Ãæ£¬ÎÒÃÇͨ³£¶¼ÐèÒªÍê³ÉÒÔϲ½Ö裺

´´½¨Ò»¸öÃûΪ TopicList µÄ React ×é¼þ;

Ϊ TopicList ¶¨ÒåÒ»Ìõ·ÓɹæÔò;

´´½¨Ò»¸öÃûΪ TopicList.css µÄÑùʽÎļþ£¬²¢ÔÚºÏÊʵÄλÖÃÒýÈë;

ʹÓà react-redux ½« TopicList ×é¼þ·â×°³ÉÈÝÆ÷×é¼þ£¬´Ó¶øÊ¹Æä¿ÉÒÔʹÓà Redux store;

´´½¨4ÖÖ²»Í¬µÄ action ÀàÐÍ£ºFETCH_BEGIN, FETCH_PENDING, FETCH_SUCCESS, FETCH_FAILURE£¬Í¨³£¶¨ÒåÔÚ constants.js;

´´½¨Á½¸ö action£ºfetchTopicList ºÍ dismissFetchTopicListError;

ÔÚ action ÎļþÖÐÒýÈëÀàÐͳ£Á¿;

ÔÚ reducer Öд´½¨4¸ö swtich case À´´¦Àí²»Í¬µÄ action ÀàÐÍ;

ÔÚ reducer ÎļþÖÐÒýÈëÀàÐͳ£Á¿;

´´½¨×é¼þµÄ²âÊÔÎļþ¼°Æä´úÂë½á¹¹;

´´½¨ action µÄ²âÊÔÎļþ¼°Æä´úÂë½á¹¹;

´´½¨ reducer µÄ²âÊÔÎļþ¼°Æä´úÂë½á¹¹¡£

Ìì!ÔÚÕýʽ¿ªÊ¼Ð´ÂÛ̳Âß¼­µÄµÚÒ»ÐдúÂë֮ǰ£¬¾¹È»ÐèÒª×öÕâô¶àËöËéµÄÊÂÇé¡£µ±ÕâÑùµÄÊÂÇéÊÖ¶¯Öظ´Á˶à´ÎÖ®ºó£¬ÎÒÃǾõµÃÓ¦¸ÃÓй¤¾ßÀ´×Ô¶¯»¯ÕâÑùµÄÊÂÇ顣Ϊ´Ë´´½¨ÁË Rekit ¹¤¾ß°ü£¬¿ÉÒÔ°ïÖú×Ô¶¯Éú³ÉÕâЩÎļþ½á¹¹ºÍ´úÂë¡£²»Í¬ÓÚÆäËüµÄ´úÂëÉú³ÉÆ÷£¬Rekit »ùÓÚÒ»¸öÏà¶Ô¹Ì¶¨µÄÎļþºÍ´úÂë½á¹¹£¬Òò´Ë¿ÉÒÔ×ö¸ü¶àµÄÊÂÇ飬ÀýÈ磺

ËüÖªµÀÔÚÄÄÀïÒÔ¼°ÈçºÎ¶¨Òå·ÓɹæÔò;

ËüÖªµÀÈçºÎÉú³É action ÀàÐͳ£Á¿;

ËüÖªµÀÈçºÎ¸ù¾Ý action Ãû×ÖÀ´Éú³ÉÀàÐͳ£Á¿;

ËüÖªµÀÈçºÎ¸ù¾Ý action ÀàÐÍÀ´´´½¨ reducer;

ËüÖªµÀÈçºÎ´´½¨ÓÐÒâÒåµÄ²âÊÔ°¸Àý¡£

½èÖúÓÚ¾«ÐÄά»¤µÄ¹¤¾ß£¬ÎÒÃÇ¿ÉÒÔ²»±Ø¹Ø×¢¼¼Êõϸ½Ú£¬¶øÖ»ÐèרעÓÚ¹¦ÄÜÏà¹ØµÄ´úÂ룬Ìá¸ßÁË¿ª·¢Ð§ÂÊ¡£²»½öÈç´Ë£¬¹¤¾ßÒ²¿ÉÒÔ¼õÉÙ´íÎ󣬲¢ÔÚ´úÂë½á¹¹£¬ÃüÃû£¬ÅäÖõȷ½ÃæÎ¬³Ö¸ß¶ÈÒ»ÖÂÐÔ£¬ÈôúÂë¸ü¼ÓÈÝÒ×Àí½âºÍά»¤¡£

Rekit Õë¶Ô±¾ÎÄÌá³öµÄ React + Redux ¿ª·¢Êµ¼ùÌṩÁËÒ»Ì×¹¤¾ß¼¯£¬Æä±¾ÉíÒ²ÊÇ¿ÉÀ©Õ¹µÄ¡£ÄãÍêÈ«¿ÉÒÔ¸ù¾ÝÐèÒª¸ü¸Ä´úÂëÄ£°å£¬»òÕßÌṩ×Ô¼ºµÄ¹¤¾ß£¬Õë¶Ô×Ô¼ºµÄÏîÄ¿ÌØÐÔÌṩ±ã½ÝµÄ¹¤¾ßÀ´Ìá¸ß¿ª·¢Ð§ÂÊ¡£

С½á

±¾ÎÄÖ÷Òª½éÉÜÁËÈçºÎʹÓà React£¬Redux ÒÔ¼° React-router À´¿ª·¢¿ÉÀ©Õ¹µÄ Web Ó¦Óá£ÆäºËÐÄ˼·ÓÐÁ½¸ö£¬Ò»ÊÇÒÔ¹¦ÄÜ(feature)Ϊµ¥Î»×é¼þÎļþ¼Ð½á¹¹;¶þÊDzÉÓÃÿ¸ö action µ¥¶ÀÎļþµÄģʽ¡£ÕâÑùÄܹ»ÈôúÂë¸ü¼ÓÄ£¿é»¯£¬Ôö¼ÓºÍɾ³ý¹¦Äܶ¼²»»á¶ÔÆäËüÄ£¿é²úÉúÌ«´óÓ°Ï졣ͬʱʹÓà React-router À´°ïÖúʵÏÖÒ³ÃæµÄ¸ÅÄÈõ¥Ò³Ó¦ÓÃ(SPA)Ò²ÓµÓд«Í³ Web Ó¦ÓÃµÄ URL µ¼º½¹¦ÄÜ£¬½øÒ»²½½µµÍÁ˹¦ÄÜÄ£¿é¼äµÄñîºÏÐУ¬ÈÃÓ¦Óýṹ¸ü¼ÓÇåÎúÖ±¹Û¡£

ΪÁËÖ§³ÖÕâÑùµÄʵ¼ù£¬ÎÄÖл¹½éÉÜÁË Rekit ¹¤¾ß¼¯£¬²»½ö¿ÉÒÔ°ïÖú´´½¨ºÍÅäÖóõʼµÄÏîĿģ°å£¬¶øÇÒ»¹ÌṩÁË´óÁ¿ÊµÓõŤ¾ß°ïÖúÒÔÎÄÖÐÌáµ½µÄ·½Ê½×Ô¶¯Éú³É¼¼Êõ½á¹¹£¬Ìá¸ßÁË¿ª·¢Ð§ÂÊ¡£¸ü¶àµÄ¹¤¾ß½éÉÜ¿ÉÒÔ·ÃÎÊÆä¹ÙÍø£ºhttp://rekit.js.org¡£

 

   
2225 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕ Ïà¹ØÎĵµ Ïà¹Ø¿Î³Ì



Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Àí½âJavascript
·ÇµäÐÍajaxʵ¼ù
³¹µ×µÄAjax
javascript ʹÓÃCookies
ʹÓà jQuery ¼ò»¯ Ajax ¿ª·¢

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

ijº½¿Õ¹«Ë¾IT²¿ JavaScriptʵ¼ù
ijµçÊÓÈí¼þ HTML5ºÍJavaScript
Öк½ÐÅ JavaScript¸ß¼¶Ó¦Óÿª·¢
´óÇìÓÍÌï web½çÃæAjax¿ª·¢¼¼Êõ
ºÍÀûʱ ʹÓÃAJAX½øÐÐWEBÓ¦Óÿª·¢