ÏÖÔÚÊÇǰ¶Ë¿ª·¢×îºÃµÄʱ´ú£¬ÓÐÌ«¶àºÜºÃµÄ¿ò¼ÜºÍ¹¤¾ß°ïÄã¸üºÃµÄʵÏÖ¸´ÔÓÐèÇó;ͬʱÓÖÊÇ×îÀ§ÄѵÄʱ´ú£¬ÒòΪÐèÒªÕÆÎÕÌ«¶àµÄ¿ò¼ÜºÍ¹¤¾ß¡£ÈçºÎÀûÓúø÷ÖÖ¿ò¼ÜÀ´Ìá¸ßǰ¶Ë¿ª·¢ÖÊÁ¿ÊÇ´ó¼Ò¶¼ÔÚ̽Ë÷µÄÎÊÌâ¡£±¾Îľͽ«½éÉÜÈçºÎʹÓÃ
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¡£
|