ã¢ããªã«ã°ããŒãã«ã«é¢ä¿ãªããè€éãªæ¹æ³ã§å€åããªãäžæçãªç¶æ ã«ã¯Reactã䜿çšããŸãã ããšãã°ãäžéšã®UIèŠçŽ ã®åãæ¿ãããã©ãŒã å ¥åç¶æ ã ã°ããŒãã«ã«éèŠãªç¶æ ããŸãã¯è€éãªæ¹æ³ã§å€æŽãããç¶æ ã«ã¯Reduxã䜿çšããŸãã ããšãã°ããã£ãã·ã¥ããããŠãŒã¶ãŒãæçš¿ã®äžæžããªã©ã§ãã
Reduxç¶æ ããReactç¶æ ïŒReduxã«äœããä¿åããã®ãé¢åã«ãªãå ŽåïŒãŸãã¯ãã®éïŒä»¥åã¯ããŒã«ã«ã§ãã£ãç¶æ ã«ã¢ã¯ã»ã¹ããå¿ èŠãããã³ã³ããŒãã³ããå¢ããå ŽåïŒã«ç§»è¡ãããå ŽåããããŸãã
çµéšåã¯æ¬¡ã®ãšããã§ããåä»ã§ãªãããšã¯äœã§ãããŸãã
ãããã¯ãŒã¯ãªã¯ãšã¹ããä»ããŠãã§ãããããããŒã¿ã®å ŽåããµãŒããŒåŽã®ã¬ã³ããªã³ã°ããµããŒãããããã«åžžã«ã¹ãã¢ã䜿çšããŸãïŒãããæçµçãªç®æšã§ãããšæãããå ŽåïŒãããããªããšãæ°Žåè£çµŠãã§ããªããªããŸãã
ãããã®ç¶æ ã2ã€ä»¥äžã®ã³ã³ããã«ãã£ãŠãªãã¹ã³ãããããã«ã¯ãããã¯åºèã«ãããã¹ãã§ããïŒ
äžæçãªãã®ãšæ°žç¶çãªãã®ã®åºå¥ã«ã€ããŠã @ gaeronã«åæããŸãã ããããç§ã¯å®éã«ããã3ã€ã®ã«ããŽãªãŒã§èããŠãUIã®ç¶æ ã§ãããç§ãäžæçãªãã®ã ãšæããŸãã ããäžã€ã¯ãå®éã«ã¢ããªã±ãŒã·ã§ã³ã®æ°žç¶çãªäžæ žã§ããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã§ãã ãããããã®äžéã«ãã3çªç®ã¯ãã«ãŒãã£ã³ã°ç¶æ ã§ãã ãã«ãŒãã£ã³ã°ããšããçšèªã¯äººã«éŠŽæã¿ãããã®ã§äœ¿çšããŸããããã¹ã¯ããããWebãã¢ãã€ã«ã«ãŸãããæ¹ããããšæãã®ã§ããããããã¥ãŒéžæãç¶æ ã«æœè±¡åããŸãã
ããã¯ããŠãŒã¶ãŒã«è¡šç€ºãããå 容ã決å®ããããïŒããšãã°ãã¿ãã®ç¶æ ãšåæ§ïŒãUIã®ç¶æ ã§ãããšäž»åŒµã§ããŸãã ãããã2ã€ã®éãããããŸãã 1ã€ç®ã¯ãç¶æ ãã·ãªã¢ã«åããïŒã€ãŸããURLãšããŠïŒä»ã®äººã«éä¿¡ãããããšã§ãã ãããã£ãŠãç¹å®ã®UIç¶æ ã«çŽæ¥ããã£ãŒããªã³ã¯ãã§ããããã«ããå Žåã¯ãã«ãŒãç¶æ ã«ããå¿ èŠããããŸãã 2ã€ç®ã¯ãå€ãã®å Žåãåæã«ãŒãç¶æ ãŸãã¯ã«ãŒãã®å€æŽãã¢ããªã±ãŒã·ã§ã³ç¶æ ã®å€æŽãããªã¬ãŒããããšã§ãïŒã€ãŸãã衚瀺ããããŒã¿ãããŒãããŸãïŒã ãã¡ãããUIã®ã¢ã¯ã·ã§ã³ãåãããšãããŸãã ããããç§ãåºå¥ããã®ã¯ãã«ãŒãç¶æ ã®å€åã«é¢ãããã¢ããªã±ãŒã·ã§ã³ããžãã¯ãããã¹ãããããã«ããã¥ãŒãã¬ã³ããªã³ã°ãªãã§ã«ãŒãç¶æ ãæ£ç¢ºã«æã€ããšãã§ããïŒãããŠãã¹ãã§ããïŒãšããããšã§ãã ãŸãããã¥ãŒãšã¬ã³ããªã³ã°ãé¢äžãããå¿ èŠããªããããéšåçã«ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã«ãªããŸããIMHOã
ããã¯ãç¶æ 管çã®ããã®ReduxãšReactã®åé¡ãšã©ã®ããã«é¢é£ããŠããŸããïŒ ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã¯Reduxã®ãã¡ã€ã³ã§ãããUIã®ç¶æ ã¯Reactã®ãã¡ã€ã³ã§ãã ããããã«ãŒãã£ã³ã°ç¶æ ã¯ïŒç§ã®æèŠã§ã¯ïŒUIç¶æ ãšèŠãªãããšãã§ããŸãããReduxã«ãã£ãŠç®¡çãããå¿ èŠããããŸãïŒç§ãããæãçç±ã®è©³çŽ°ã«ã€ããŠã¯ãåã蟌ã¿ãªã³ã¯ãåç §ããŠãã ããïŒã
æ確ã«ããããã«ãåãåãããšã«ã€ããŠã®
ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã¯Reduxã®ãã¡ã€ã³ã§ãããUIã®ç¶æ ã¯Reactã®ãã¡ã€ã³ã§ãã
ç§ã¯ããã䞻匵ããªãããšã«æ³šæããŠãã ããã Reactã§ã¢ããªã®ç¶æ ãç¶æããããšãšReduxã§UIã®ç¶æ ãç¶æããããšã®äž¡æ¹ã§åé¡ãªããšæããŸãã ãã¡ã€ã³ã§åºåãã¹ãã§ã¯ãªããšæããŸãã
ç§ã®èãã§ã¯ãReduxã§ã¢ããªãäœæããå Žåã¯ãåäžã®ç¶æ ããªãŒãæ¡çšããŸãã UIã®ç¶æ ãããã«çœ®ããŸãã ãã ããé¢åã§ã€ã©ã€ã©ããå Žåã¯ãã³ã³ããŒãã³ãã«ç¶æ ãèšå®ããããšãæããªãã§ãã ããã ç§ã®ãã€ã³ãã¯ãåä»ã§ãªãéãåäžã®ç¶æ ããªãŒã䜿çšãããããç©äºãè€éã«ããã®ã§ã¯ãªãåçŽåããå Žåã«ã®ã¿ãããè¡ããšããããšã§ãã ãããå¯äžã®ã¬ã€ãã©ã€ã³ã§ãã
ãŸãã @ gaearonã®å£ã«èšèãå ¥ãã
第äºã«ãç§ã¯@gaearonã«å®å šã«åæããŸãã ç§ã¯ãŸããåäžã®ç¶æ ããªãŒã¢ãããŒããåºãä¿¡ããŠããŸãã UIã®ç¶æ ã«ã€ããŠè©±ãããšããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãšã¯ããŸãé¢ä¿ããªããããããªãïŒçŸåšéžæãããŠããã¿ããäœã§ããããªã©ïŒéåžžã«å°ããªããšãé ã«å ¥ããŠããŸããïŒ @gaearonã«ã€ããŠæ£ç¢ºã«èª¬æããŠããŸãïŒã
ããã§ãç§ã®ç«å Žãæ確ã«ããŸãããã ã«ãŒãç¶æ ãå«ããã»ãšãã©ãã¹ãŠãReduxã«ããReduxãšTypeScriptã䜿çšããTodoMVCå®è£ ã§è¡ã£ãããã«ãã«ãŒãç¶æ ã«ã€ããŠå ·äœçã«èšåããç§ãæãã®ã§åºå¥ããŸããïŒãããŠãã®TodoMVCã§èŠãããšãã§ããŸãïŒå®è£ ïŒããã¯ééããªãReduxã«å±ãïŒãããŠã¬ã³ããªã³ã°ã«ãŸã£ããæ¥ç¶ãããã¹ãã§ã¯ãããŸããïŒããããŠæã確å®ã«ãUIç¶æ ãã§ã¯ãªãããšã
Reactã³ã³ããŒãã³ãã®å Žåãç¶æ ã䜿çšããããšã¯ãã£ãã«ãããŸããã ç§ã¯ãã¬ã³ããªã³ã°ãããã®ã«é¢ããæ å ±ãååŸãããããšãã³ã³ããŒãã³ãã®å€éšã§å€æŽãããªã¬ãŒããããã«åŒã³åºãããšãã§ããã¯ããŒãžã£ãŒãååŸããããã«ãå°éå ·ã䜿çšããããšã奜ã¿ãŸãã ç掻ã楜ã«ããããã ãã«ã³ã³ããŒãã³ãã«ç¶æ ãå°å ¥ããããšã¯ãã£ãã«ãããŸããããããã¯é¿ããããšããŠããŸãã ãããç©äºãæããã«ããããšãé¡ã£ãŠããŸãã
ãã®è³ªåã¯æ¬åœã«äž»èŠ³çã§è€éã ãšæãã®ã§ãä»æ¥ã¯ããŒã ãšé£ãã決æãããŸãããæ°ã«ããªãã§ãã ããã
this.setState
ã¯äœ¿çšããªãã§ãã ããããããŠä»ãç§ãã¡ã¯ããã€ãã®ãã«ããŒãå®è£ ããŠãå°ããªUIç¶æ ã管çããã®ãé¢åã«ãªããªãããã«ããŠããŸãã
@gaearon @ lionng429 @xogenyãã®ã¢ãããŒãã«ã€ããŠèããããæ¬ ç¹ã¯ãããŸããïŒ
@inetfuture TypeScriptã䜿çšããŠããŠãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã®åããã£ãšäžãŸã§å®çŸ©ããŠããã®ã§ãã¢ããªã±ãŒã·ã§ã³ïŒreduxïŒã®ç¶æ
ã«ã€ããŠå°ãæ²æšãªåŸåããããŸãã ããã¯èšã£ãŠãããã¹ãŠã®ç¶æ
æäœãã¬ã³ããªã³ã°ããåé¢ããã³ã³ããŒãã³ãã©ã€ãã©ãªãéçºãããšãã«ãç§ã¯å¶ç¶ã«ééããŸããïŒè©³çŽ°ã«ã€ããŠã¯ãåã®ã³ã¡ã³ãã®ãªã³ã¯ãåç
§ããŠãã ããïŒã ããã¯ãäºçŽ°ãªããšã§ã¯ãªãäžè¬çãªã³ã³ããŒãã³ãã§ãã£ãŠããç¶æ
ãå®å
šã«å€éšåããããšãæå³ããŸãã ç§ã¯éåžžããã¹ãŠãå°éå
·ïŒç¶æ
ãšç¶æ
ãæäœããããã®ã¯ããŒãžã£ãŒã®äž¡æ¹ïŒãä»ããŠæž¡ããŸãã ããããã°ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã«ç°¡åã«ããã¯ã§ããŸãã ããã®äžéšã¯ééããªãTypeScriptã䜿çšããããšã®ã¢ãŒãã£ãã¡ã¯ãã§ããã combineReducers
ãšconnect
ã䜿çšããŠç©äºãããã¯ããïŒãããŠå°ãªããšãåã®å¶çŽãä¿æããïŒããšãã§ããªãããšã§ãã ãããã£ãŠãããã¯ãããã代衚çãªèŠç¹ã§ã¯ãããŸããã ãããããªãããã¹ãŠãReduxã¹ãã¢ã«å
¥ããã ãããšèšãã®ããç§ã¯ããªããç¶æ
ã®å°æã®æµãã«ãªã£ãŠããŸãã®ã§ã¯ãªãããšå¿é
ããŸãã TypeScriptã䜿çšãããšããããšã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ãæ¡åŒµããã®ã«ããçšåºŠã®åªåãå¿
èŠã§ããããšãæå³ãããšããäºå®ã¯ããæ¬åœã«ãããå¿
èŠãªã®ãããšå€æããããåŸãªããããå¿
ãããæªãããšã§ã¯ãªããšæããŸãã ç©ãç©ã¿äžãã代ããã«ã
å¥ã®èããšããŠãããŒã«ã«ã³ã³ããŒãã³ãã®ç¶æ ã¯ãé«éãªæŽæ°æéãå¿ èŠãšããå¶åŸ¡ãããå ¥åã«åœ¹ç«ã€ã ãã§ãªããããªã¬ãŒãããå®éã®ã¢ã¯ã·ã§ã³ã®æ°ãæžããããšãã§ããŸãã çŸåšã®ãããã¿ã€ãã§ã¯ãç·šéäžã®çŸåšã®ã¢ã€ãã ãå°éå ·ãšããŠåãåããã©ãŒã ç·šéHOCããŸãšããŸããã ãŸããå€æŽããããã£ãŒã«ãããã®ç¶æ ã§ä¿åããããŒã«ã«WIPã®å€æŽãçµã¿åãããŠããããŠã³ã¹ããããEDIT_ITEM_ATTRIBUTEãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãåŒã³åºãããšã«ããããã©ãŒã å ¥åå€æŽã€ãã³ããåŠçããŸãã ãã®çµæããã©ãŒã èªäœã®ã¿ãåã¬ã³ããªã³ã°ãããããªã¬ãŒãããã¢ã¯ã·ã§ã³ãã¯ããã«å°ãªããªãããããã©ãŒã ãã£ãŒã«ãã¯ããã«æŽæ°ãããŸãïŒããšãã°ããAããæ°ç§éæŒãç¶ãããšããAAAAAAAAAAAAãå€ã®ã¿ãæŽæ°ãããŸãã 'A'ã 'AA'ãªã©ã§ã¯ãªãã¢ã¯ã·ã§ã³ãšããŠéä¿¡ãããŸãïŒã
誰ããæ°ã«ãããŠãããªããç§ã¯https://gist.github.com/markerikson/554cab15d83fd994dfabã§èŠç¹ãšããŠHOCãåãäžããŸããã
ãšã«ãããéèŠãªã®ã¯ããã®ã³ã³ããŒãã³ãã®ç¶æ ãšã¹ãã¢ã®ç¶æ ã®äž¡æ¹ã«çšéããããšããããšã§ããå®éã®ãŠãŒã¹ã±ãŒã¹ãæ€èšããå¿ èŠããããŸãã
åå©çšå¯èœãªã³ã³ããŒãã³ãã«é¢ããŠã¯ãããããååã«å€§ãããŠè€éã§ããå Žåãäž»ã«ãã¬ãŒãµããªãã£ãšãã¹ãã®ããã®åçã®ããã«ãReduxã§ãããã®ç¶æ ãä¿æããããšã¯éåžžã«å°æ¥æ§ããããŸãã ãããããã®ã³ãŒãã®åå©çšãã©ã®ããã«æ£ç¢ºã«èšèšããå¿ èŠããããã«ã€ããŠã¯ããŸã çåããããŸãïŒã³ã³ããŒãã³ããšã¢ã¯ã·ã§ã³ãšã¬ãã¥ãŒãµãŒïŒã
ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã®åé¡ãæ¥ç¶ã®ãããªã¹ã¿ã€ã«ã§è§£æ±ºããŸããã https://github.com/Babo-Ltd/redux-state
Reduxã«å·ãä¿åããã®ãé¢åã ãšã¯ãã£ãã«æããŸããã§ããã ç§ã¯ãããæäŸãããã¯ãŒã奜ãã§ããå°æ¥çã«ã¯ãå¿ èŠã«å¿ããŠä»ã®ã³ã³ããŒãã³ããšçžäºäœçšãããããšãã§ããŸãã
åä»ãªããšã«é ã«æµ®ãã¶ã®ã¯ããã©ãŒã èŠçŽ ã®ç¶æ ãåŠçããããšã ãã§ãããã©ãŒã èŠçŽ ã¯éåžžã«å€ãååšããå¯èœæ§ãããããã§ãã ãã®å Žåãç§ã¯redux-formã®ãããªã©ã€ãã©ãªã䜿çšããŸãã
ç§ã®ãã€ã³ãã¯ãåä»ã§ãªãéãåäžã®ç¶æ ããªãŒã䜿çšãããããç©äºãè€éã«ããã®ã§ã¯ãªãåçŽåããå Žåã«ã®ã¿ãããè¡ããšããããšã§ãã ãããå¯äžã®ã¬ã€ãã©ã€ã³ã§ã
@gaearonã¯ããã€ãã©ã®ããã«_ããã¡ãªã_ãšèŠãªããããã決å®ããæ¹æ³ã«ã€ããŠã®çµéšãå ±æããããšæããŸããïŒ ããšãã°ãã¢ããªã±ãŒã·ã§ã³ç¶æ ã®ã¢ãã ã«é 眮ãããšãååã«åä»ã ãšæãå žåçãªã·ããªãª/äŸãããã€ãæããŠããã ããŸããïŒ åãã£ãŠæè¬ããŸãïŒ
@idavollenç§ã¯ã«ããã«ãäžããããšãã§ããŸãïŒ
<input>
å€æŽããããŠã³ã¹ããå Žåãç¶æ
ã䜿çšããŠå€ãå³åº§ã«æŽæ°ãïŒä»ã®ã³ã³ããŒãã³ããäžå¿
èŠã«åã¬ã³ããªã³ã°ãããªã¹ã¯ãåããã«ïŒããããŠã³ã¹ãããæ¹æ³ã§ã¹ãã¢ãæŽæ°ã§ããŸããåºæ¬çã«ãä»ã®ã³ã³ããŒãã³ãã«åœ±é¿ãäžããªãç¶æ ã«äœ¿çšããå¿ èŠããããŸãã
èæ ®ãã¹ã3çªç®ã®ç¶æ³ããããŸããããšãã°ããã§ãã¯ããã¯ã¹ãåã«ä»ããå€ãã®è¡ãšéä¿¡ãã¿ã³ã§æ§æããããã©ãŒã ïŒrenderã¡ãœããã§èšç®ã«ã³ã¹ãããããreactã³ã³ãããŒã³ã³ããŒãã³ãïŒããããŸãã éä¿¡ãã¿ã³ãã¯ãªãã¯ããããšããã©ãŒã ã¯ãã§ãã¯ããã¯ã¹ããªã³ã«ãªã£ãŠããè¡ãéä¿¡ããå¿ èŠããããŸããã€ãŸãããŠãŒã¶ãŒãåãæ¿ãããšãã«ãã©ãŒã ãéä¿¡ããåã®åã ã®ãã§ãã¯ããã¯ã¹ã®äžæçãªç¶æ ã¯éèŠã§ã¯ãªããã³ã³ããŒãã³ãã®ç¶æ ãšããŠæ±ãããã¹ãã§ã¯ãªãããã§ãã¯ããã¯ã¹ã®åãæ¿ãã«ãã£ãŠçºçããããšã¯ãããŸãããåŒã³åºãããrenderïŒïŒã
ãšããããããã§ãã¯ããã¯ã¹ã®ç¶æ ãã¢ããªã±ãŒã·ã§ã³ç¶æ ã¢ãã ã«ãããŒã«ã«ã³ã³ããŒãã³ãç¶æ ã«ãå ¥ããŸããã§ãããã€ãŸãããã§ãã¯ããã¯ã¹ãåãæ¿ããŠãããšãã«renderïŒïŒãäžå¿ èŠã«åŒã³åºããªãããã«ããããã«ããã©ãŒã ã¯ã³ã³ããŒãã³ããåå¿ãããŸãããã§ãã¯ããããã§ãã¯ããã¯ã¹ãä¿æããã«ã¯ã€ã³ã¹ã¿ã³ã¹å€æ°ãåªå ãããŸãããreact-patternã«ã¯åããŸãã
ãã®å Žåããã§ãã¯ããã¯ã¹ã®ãããã®ç¶æ ã管çããããã®æè¯ã®ã¢ãããŒãã¯äœã§ããããïŒ
@idavollenãããã®ãã§ãã¯ããã¯ã¹ã¯å¶åŸ¡ãããŠããŸãããïŒ ããã§ãªãå Žåã¯ããšã«ããããããåã¬ã³ããªã³ã°ããŠããã®ã§ãã³ã³ããŒãã³ãã®ç¶æ ã§éžæãããŠãããã®ã远跡ããããã䜿çšããŠããŒã¿ã®ã©ã®éšåãéä¿¡ããããéžæã§ããŸãã
ã³ã³ããŒãã³ãã®ç¶æ ãšæ¯èŒããŠãReduxã¯ã©ã®ãããã®éãã§ããïŒ å®éã®ã€ãã³ããšã¬ã³ããªã³ã°ããã»ã¹ã®éã®ã¿ã€ãã³ã°ã«é¢ããŠæ¬åœã«è³¢æãªUIå°éå ·ãReduxã«é Œãã¹ãã§ããïŒ ã³ã³ããŒãã³ãã®ç¶æ ã䜿çšããã«ã¯ãããã»ã©åçŽã§ã¯ãªãå€ãã®éä¿¡ãå¿ èŠã«ãªããšããè€éãªç¶æ³ããããŸãã ãã®ä»¶ã§ã®å©ããããã ããã°å¹žãã§ãã
@tiberiumaximç§ã®çµéšã§ã¯ïŒç§ã¯ã¹ããŒãTVã®ãããªäœé»åããã€ã¹ã§å®è¡ãããreactãšreduxã§ã¢ããªãéçºããŠããŸãïŒã ã»ãšãã©ã®å Žåãã³ã³ããŒãã³ãã®ç¶æ ã®æŽæ°ã¯ããã©ãŒãã³ã¹ãåäžããŸããããã¯ãçºçããå¿ èŠã®ããå·®åãããå°ããªããŒã¿ã»ããã§ããããã£ã¹ããããçºçãããå¿ èŠããªãããã§ãã ã³ã³ããŒãã³ããŸãã¯åã®ã¿ããã®ç¶æ ã«ã¢ã¯ã»ã¹ããå¿ èŠãããå ŽåãããŒã«ã«ã³ã³ããŒãã³ãã®ç¶æ ã«åºå·ããæ¹ãè¯ãã§ããããããã¯ãUIé¢é£ã®ç¶æ ã®å Žåã«ãããããŸãããããæç¹ã§ãã®ããŒã¿ãreduxã¹ãã¢ã«ä¿æããå¿ èŠãããå Žåã¯-ããŒã«ã«ïŒã³ã³ããŒãã³ãïŒç¶æ ãšã°ããŒãã«ïŒreduxïŒç¶æ ã®çµã¿åããã䜿çšãããã®ããŒã¿ãæ£ããæéïŒã€ãŸãããŠãŒã¶ãŒãããŒãžãã移åãããšãïŒãŸãã¯ãã®å¹æã®ããã«reduxã¹ãã¢ã«ä¿æããå¿ èŠãããå ŽåããããŸãã ãã¶ããããªããããªãã®ç¹å®ã®ã±ãŒã¹ã«ããå°ãå ãåœãŠãããšãã§ããã°-ç§ã¯ããªãã«ãã£ãšè©³çŽ°ãªæ å ±ãäžããããšãã§ããŸã
Reduxã§ã©ã®ç¶æ ã«ãªããããããŠäœãã³ã³ããŒãã³ãã«å¯ŸããŠããŒã«ã«ã®ãŸãŸã§ãããã決ããã®ã¯ããªã次第ã§ãã http://redux.js.org/docs/faq/OrganizingState.html#organizing-state-only-redux-stateããã³http://redux.js.org/docs/faq/Performanceãèªãããšããå§ãããŸã
@deowkããã©ãŒãã³ã¹ã®åé¡ã«ã€ããŠã®ç¥èãå
±æããŠãããŠããããšããç§ã¯åãã ãšæããŸãããã確èªãå¿
èŠã§ããã
ãŸãã @ markeriksonã¯ãªã³ã¯ã«æè¬ããŸããç§ã¯ããããããäžåºŠèŠãŠãããŸãã
誰ãããããæ瀺çã«èšåãããã©ããã¯ããããŸããããããŒã«ã«ã³ã³ããŒãã³ãã®ç¶æ
ã¯Reduxã§ã管çã§ããŸãã ã³ã³ããŒãã³ãã³ã³ã¹ãã©ã¯ã¿ãŒã§çŽæ¥ã¹ãã¢ãäœæã§ããŸãã ãã®ããŒã«ã«ã¹ãã¢ã«ã¯ããã®ã³ã³ããŒãã³ãã®ç¶æ
ãå«ãŸãããã®ã³ã³ããŒãã³ãã«é¢é£ããã¢ã¯ã·ã§ã³ïŒããã³ããã®ã¹ãã¢ã®dispatch
é¢æ°ããŸãã¯ãã®dispatch
é¢æ°ãåŒã³åºãã³ãŒã«ããã¯ã®ãããããæž¡ãããšã«ãã£ãŠãã®åïŒãåŠçããŸãã ã
ãã®ã¢ãŒããã¯ãã£ã¯æåã§å®è£ ããããšããredux-fractalãredux-uiãªã©ã®ã©ã€ãã©ãªã䜿çšããããšãã§ããŸãã
ãŸãã¯ãDanãææããŠããããã«ãã³ã³ããŒãã³ãã®ç¶æ ãæŽæ°ããããã®ã¬ãã¥ãŒãµãŒã¹ã¿ã€ã«ã®ã¢ãããŒããå®è£ ããããšãã§ããŸãã https://twitter.com/dan_abramov/status/736310245945933824ãåç §ããŠ
ã¢ã¯ãã£ããã£ã€ã³ãžã±ãŒã¿ãŒãã¢ãŒãã«ãªãŒãã³ãŸãã¯ã¯ããŒãºãªã©ã®UIç¶æ ãã©ãã«ä¿åãããç¥ãããã§ãã setStateã䜿çšãããšãreactã³ã³ããŒãã³ãã®ãŠããããã¹ãã§åé¡ãçºçããŸããïŒ
@ akshay2604 ïŒç¹°ãè¿ããŸãããããã¯ããªã次第ã§ãã ãã®ã¹ã¬ããã®ä»¥åã®ã³ã¡ã³ãã«æçš¿ãããªã³ã¯ãåç
§ããŠãã ããã ã³ã³ããŒãã³ãã®ãã¹ãäžãç¹ã«Enzymeã©ã€ãã©ãªã䜿çšããŠã³ã³ããŒãã³ãããã¹ãããŠããå Žåã¯ãééããªãsetState
ã䜿çšã§ããŸãã
ç§ã®èããå ±æãããŠãã ããã
ã¢ããªã±ãŒã·ã§ã³ã®å ¥åºåãšã®é¢ä¿ã«å¿ããŠãç¶æ ã3ã€ã®å€§ããªã«ããŽãªã«åé¡ããŸãã
{ "todos": [{ id: 1, title: "title" }, { id: 2, title: "title" }] }
{ "changeTodo": { title: "title", action: "add", done: false },
{ id: 1, title: "changed title", action: "modify", done: true }, { id: 2, action: "delete" } }
{ "displayOptions": { searchTerm: "title", sort: ["title", "desc"], filter: "done=false" } }
cache
ãšchanges
æ··ãããã cache
ãšview
æ··ãããã view
ãšæ··ãããããªãchanges
ã
ãã¡ãããããããäœããã®æ¹æ³ã§ããŒãžããŠãåäžã®Reactã³ã³ããŒãã³ãã«è¡šç€ºããå¿ èŠããããŸãã ãã®ããããããŒãžãããããªããžã§ã¯ãã¯æ¬¡ã®ããã«ãªããŸãã
{ "todos": [{id: undefined, title: "title", done: false }, { id: 1, title: "changed title" }] }
ããããããã¯ç¶æ
ã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ããžãã¯ã®çµæã§ãã ãããã£ãŠãã©ãã«ãä¿ç®¡ããªãã§ãã ããã
ãã®ããŒãžãããç¶æ
ãã»ã¬ã¯ã¿ãŒã«ãã£ãã·ã¥ããããã¹ãã¢ã«ãã£ãã·ã¥ããããã³ã³ããŒãã³ãã«ãã£ãã·ã¥ãããã§ããŸãããããã¯ãç¶æ
ãã§ã¯ãªããéèŠã§ã¯ãããŸãããã¢ããªã±ãŒã·ã§ã³ããžãã¯é¢æ°ã3ã€ã®ç¶æ
éšåãã¹ãŠã«ç°¡åã«åé©çšã§ããŸããåã³ããŒãžãããç¶æ
ãååŸããŸãã ãããæ©èœçã¢ãããŒãã®ãã¹ãŠã§ãã
Reduxã®ã¡ã³ããã¯ããã¢ããªã±ãŒã·ã§ã³ããžãã¯ãè€æ°ã®ã¬ãã¥ãŒãµãŒãšè€æ°ã®ã€ãã³ããšããŠå®è£
ããå¿
èŠããããŸããããã«ããããããŒãžãããããªããžã§ã¯ãã®ããŸããŸãªéšåãæ§ç¯ãããŸãããšèšãããŸãã
ããã¯ééã£ãã¢ãããŒãã ãšæããŸãã ããã¯ããªããreduxããéããããšãã§ããªãããšãæå³ããŸãã ç¶æ
ã管çããããã®ããŒã«ãšããŠæå³ãããŠãããã®ã¯ãæ¬è³ªçã«ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã®å®è£
ã«ãªããŸãã
ããã«ã¡ã¯ãç§ã¯æ°æ¥éReact / Reduxãæãäžããäžéšã®æ å ±ãã³ã³ããŒãã³ãã®ããŒã«ã«ç¶æ ã«ä¿åãããä¿æããããéžæããããã«è¡ããã決å®ãç解ããŠããŸãã
ãããã1ã€ã®ã¢ã¯ã·ã§ã³ã§äž¡æ¹ãåæã«å¿ èŠãšããå Žåã¯ã©ããªããŸããïŒ éåžžã«äžè¬çãªãŠãŒã¹ã±ãŒã¹ã¯æ¬¡ã®ãšããã§ãã
{ modelItems: myModelItems }
ã§ãã ãµãŒããŒã¢ãã«ïŒã®äžéš/äºæž¬ïŒããã£ãã·ã¥ããŸãMyItemsView
ã§æ§æãããŠããŸãã ããŠã³ãããããšãã³ã³ããŒãã³ãã¯ã¢ãã«ã¢ã€ãã ã®ãã§ãããããªã¬ãŒããŸãã ã³ã³ããŒãã³ãå
¥åïŒ myModelItems
ã ã³ã³ããŒãã³ãåºåïŒ fetchModelItems
ã¢ã¯ã·ã§ã³ããªã¬ãŒã ã³ã³ããŒãã³ãã®å
éšïŒ state.busy
ããã³state.errorId
MyItemsView
ãfetchModelItems
MyItemsView
ããªã¬ãŒãããšãã¢ãã«ããã§ããããŠã¹ãã¢ã«ãã£ãã·ã¥ããããã«HTTPãªã¯ãšã¹ãããµãŒããŒã«éä¿¡ãããŸãã ãã®éåæã¢ã¯ã·ã§ã³ã«ã¯4ã€ã®ãã§ãŒãºããããããã¯ã®æ°ã¯æ¬¡ã®ãšããã§ãã onStarted
ïŒHTTPãªã¯ãšã¹ããéå§ãããã¹ãããŒã®èªã¿èŸŒã¿ãã³ã³ããŒãã³ãã§éå§ãããŸãïŒã onEnded
ïŒHTTPå¿çãå°çããã¹ãããŒã®èªã¿èŸŒã¿ãã³ã³ããŒãã³ãã§åæ¢ããŸãïŒ ããŸã å¿çã¹ããŒã¿ã¹ã確èªããŠããŸããïŒã onFailed
ïŒãšã©ãŒéç¥ã¯ã³ã³ããŒãã³ãã«è¡šç€ºãããŸãïŒããã³onSucceed
ïŒReduxã¹ãã¢ãæŽæ°ãããä¿æãããŠããã¢ãã«ãã£ãã·ã¥ã転éãããŸãïŒã¬ã³ããªã³ã°çšã®ã³ã³ããŒãã³ãïŒãããã£ãŠã fetchModelItems
ã¢ã¯ã·ã§ã³ããªã¬ãŒã次ã®ããã«åå²ããæ¹æ³ïŒ
onStarted
ã onEnded
ã onFailed
ã¯Reduxã¹ãã¢ã«ãããããŸãããïŒ ããã¯ã onStarted
ãšonEnded
ãäžæçãªUIç¶æ
ã§ãããã¢ãã«ãã£ãã·ã¥ãšã®çžäºäœçšããã£ãŠã¯ãªããªãããã§ãã åãããšãonFailed
ãåœãŠã¯ãŸããŸãïŒã¢ãã«ãã£ãã·ã¥ã¯å€æŽããããUIã¯ãšã©ãŒéç¥ãã¬ã³ããªã³ã°ããŸãïŒã MyItemsView
ã¯ããã£ãã·ã¥ãããã¢ãã«ã§ã¯ãªããããã§UIç¶æ
ãã¬ã³ããªã³ã°ããŸãonSucceed
ãReduxã¹ãã¢ã«ãããããŸãããïŒ ããã¯ãã¢ãã«ãã£ãã·ã¥ã®å®ããã«åœéžããä¿¡é Œã§ããæ
å ±æºãžã®ã¢ã¯ã»ã¹ãèš±å¯ãããã·ã£ã¯ãŒã济ã³ãŠæ°Žåãè£çµŠãã MyItemsView
æ°é®®ãªmyModelItems
ãã¬ã³ããªã³ã°ããããã§ããç§ã®çŸåšã®è©Šã¿ã§ã®å®è£
ã«ã€ããŠã¯ãReduxThunkãfetchModelItems
ã¢ã¯ã·ã§ã³ããªã¬ãŒãåŠçããŸãã ããã§Reduxãã¹ãéžæãããããªæ°ãããŸããããéåæã®æåãReduxã¹ãã¢ã«æž¡ãã ãã§ãä»ã®ãã®ã¯ãã¹ãŠReactã³ã³ããŒãã³ãã®ç¶æ
ã«ä¿ã€ããšèšãããšã¯ããèããããŸããã
ããã«æžæããªãããæ¥ç¶ãããã³ã³ããŒãã³ãïŒã€ãŸãReduxã³ã³ããïŒã«è»¢éããæåããã§ããããŠä¿åããŸãã ããããã¹ãããŒã®èªã¿èŸŒã¿ã¯ãªããã³ã³ãœãŒã«ã«èšé²ãããæ²æšãªãšã©ãŒã¡ãã»ãŒãžATMã¯ãããŸããã store.ui.myItemsView.busy
ãstore.ui.myItemsView.errorId
ãå®çŸ©ããããããŸããããã³ã³ããŒãã³ãã®ç¶æ
ã§ãããã®æ
å ±ãååŸããã ãã§ãã
@pascalav ïŒ
ããã¯ãã°ãã©ãã«ãŒã§ããããµããŒãã·ã¹ãã ã§ã¯ãããŸããã 䜿çšæ³ã«é¢ãã質åã«ã€ããŠã¯ãStack OverflowãŸãã¯Reactifluxã䜿çšããŠãã ãããå€ãã®äººãããªããå©ããŠãããæºåãã§ããŠããŸãããããããããè¯ãçããããæ©ãåŸãããã§ãããã ããããšãïŒ
æãåèã«ãªãã³ã¡ã³ã
ã¢ããªã«ã°ããŒãã«ã«é¢ä¿ãªããè€éãªæ¹æ³ã§å€åããªãäžæçãªç¶æ ã«ã¯Reactã䜿çšããŸãã ããšãã°ãäžéšã®UIèŠçŽ ã®åãæ¿ãããã©ãŒã å ¥åç¶æ ã ã°ããŒãã«ã«éèŠãªç¶æ ããŸãã¯è€éãªæ¹æ³ã§å€æŽãããç¶æ ã«ã¯Reduxã䜿çšããŸãã ããšãã°ããã£ãã·ã¥ããããŠãŒã¶ãŒãæçš¿ã®äžæžããªã©ã§ãã
Reduxç¶æ ããReactç¶æ ïŒReduxã«äœããä¿åããã®ãé¢åã«ãªãå ŽåïŒãŸãã¯ãã®éïŒä»¥åã¯ããŒã«ã«ã§ãã£ãç¶æ ã«ã¢ã¯ã»ã¹ããå¿ èŠãããã³ã³ããŒãã³ããå¢ããå ŽåïŒã«ç§»è¡ãããå ŽåããããŸãã
çµéšåã¯æ¬¡ã®ãšããã§ããåä»ã§ãªãããšã¯äœã§ãããŸãã