ç§ã®ããŒã ã¯ããæ°ã¶æReduxã䜿çšããŠããŸãã ãã®éçšã§ãæ©èœã«ã€ããŠèãããããã¯ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«å±ããã®ãããããšãã¬ãã¥ãŒãµãŒã«å±ããã®ãããšçåã«æãããšããããŸãã ããã¥ã¡ã³ãã¯ãã®äºå®ã«ã€ããŠå°ãææ§ã«èŠããŸãã ïŒãŸãã¯ãã«ããŒãããŠããå ŽæãèŠéããã ããããããŸããããã®å Žåã¯ããè©«ã³ããŸããïŒããããã³ãŒããšãã¹ããå¢ããã«ã€ããŠãç©äºãã©ãã«ããã¹ããã«ã€ããŠãã匷ãæèŠãæã€ããã«ãªãã䟡å€ããããšæããŸãããä»ã®äººãšå ±æãã話ãåãã
ã ããããã«ç§ã®èãããããŸãã
ãã®æåã®ãã®ã¯å³å¯ã«ã¯Reduxã«é¢é£ããŠããŸãããã以äžã§éæ¥çã«èšåãããŠããã®ã§ããšã«ããå ±æããŸãã ç§ã®ããŒã ã¯rackt / reselectã䜿çšããŠããŸãã éåžžãç¶æ ããªãŒã®ç¹å®ã®ããŒãã®ã»ã¬ã¯ã¿ãŒããšã¯ã¹ããŒããããã¡ã€ã«ãå®çŸ©ããŸãïŒäŸïŒMyPageSelectorsïŒã 次ã«ããã¹ããŒããã³ã³ããã¯ãããã®ã»ã¬ã¯ã¿ãŒã䜿çšããŠããã ãã³ã³ããŒãã³ãããã©ã¡ãŒã¿ãŒåããŸãã
æéã®çµéãšãšãã«ããããã®åãã»ã¬ã¯ã¿ãŒãä»ã®å Žæã§äœ¿çšããããšã«ã¯è¿œå ã®å©ç¹ãããããšã«æ°ã¥ããŸããïŒåéžæã®ã³ã³ããã¹ãã ãã§ãªãïŒã ããšãã°ãèªåãã¹ãã§äœ¿çšããŸãã ãŸããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒããè¿ããããµã³ã¯ã§ã䜿çšããŸãïŒä»¥äžã§è©³ãã説æããŸãïŒã
ãããã£ãŠãç§ã®æåã®æšå¥šäºé
ã¯ãããŒã¿ã«åæçã«ã¢ã¯ã»ã¹ããå Žåã§ããå
±æã»ã¬ã¯ã¿ãŒã_ã©ãã§ã_䜿çšããããšã§ãïŒããšãã°ã state.myValue
ãããmyValueSelector(state)
ãåªå
ããŸãïŒã ããã«ãããå€æ°ã®å
¥åãã¹ã埮åŠãªæªå®çŸ©ã®å€ã«ã€ãªããå¯èœæ§ãäœããªããã¹ãã¢ã®æ§é ã®å€æŽãªã©ãç°¡åã«ãªããŸãã
ããã«ã¯ããããªããããããŸããããããã¯éåžžã«éèŠã ãšæããŸãã ããžãã¹ããžãã¯ã¯ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«å±ããŸãã ã¬ãã¥ãŒãµãŒã¯æãã§ã·ã³ãã«ã§ãªããã°ãªããŸããã å€ãã®å Žåãããã¯åé¡ã§ã¯ãããŸããããäžè²«æ§ã¯è¯å¥œã§ãããããããã_äžè²«ããŠ_è¡ãã®ãæåã§ãã çç±ã¯ããã€ããããŸãã
å·ã«ã¢ã€ãã ã®ãªã¹ãã«é¢é£ããã¡ã¿ããŒã¿ããããšæ³åããŠãã ããã ã¢ã€ãã ããªã¹ãã«å€æŽãè¿œå ããŸãã¯ãªã¹ãããåé€ããããã³ã«ãã¡ã¿ããŒã¿ãæŽæ°ããå¿ èŠããããŸãã ãªã¹ããšãã®ã¡ã¿ããŒã¿ã®åæãç¶æããããã®ãããžãã¹ããžãã¯ãã¯ãããã€ãã®å Žæã«ååšããå¯èœæ§ããããŸãã
updateMetadata
ã¢ã¯ã·ã§ã³ã®åŒã³åºããæ
åœããŸãã ãã®ã¢ãããŒãã¯ãïŒããŸãããã°ïŒæãããªçç±ã§ã²ã©ããã®ã§ããäžèšã®éžæè¢ãèãããšããªãã·ã§ã³3ã®æ¹ã確å®ã«åªããŠããŸãã ãªãã·ã§ã³1ãš3ã¯ã©ã¡ããã¯ãªãŒã³ãªã³ãŒãå ±æããµããŒãããŠããŸããããªã¹ããã¡ã¿ããŒã¿ã®æŽæ°ãéåæã§ããå¯èœæ§ãããå Žåã¯ãªãã·ã§ã³3ã®ã¿ããµããŒãããŠããŸãã ïŒããšãã°ãWebã¯ãŒã«ãŒã«äŸåããŠããå¯èœæ§ããããŸããïŒ
ã¢ã¯ã·ã§ã³ãã¬ãã¥ãŒãµãŒãã»ã¬ã¯ã¿ãŒããã¹ãããæãå¹ççãªæ¹æ³ã¯ããã¹ããäœæãããšãã«ãã¢ãã«ãã¢ãããŒãã«åŸãããšã§ãã ã€ãŸããããããã«åå¥ã«çŠç¹ãåœãŠã3ã»ããã®ãã¹ãã§ã¯ãªããç¹å®ã®ã¢ã¯ã·ã§ã³ãã¬ãã¥ãŒãµãŒãããã³ã»ã¬ã¯ã¿ãŒã®ã»ãããã«ããŒãã1ã»ããã®ãã¹ããäœæããå¿ èŠããããŸãã ããã«ãããå®éã®ã¢ããªã±ãŒã·ã§ã³ã§äœãèµ·ããããããæ£ç¢ºã«ã·ãã¥ã¬ãŒãããè²»çšå¯Ÿå¹æãæ倧éã«é«ããããšãã§ããŸãã
ããã«çŽ°ããåé¡ãããšãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«çŠç¹ãåœãŠããã¹ããäœæããã»ã¬ã¯ã¿ãŒã䜿çšããŠçµæãæ€èšŒããããšãæçšã§ããããšãããããŸããã ïŒã¬ãã¥ãŒãµãŒãçŽæ¥ãã¹ãããªãã§ãã ãããïŒéèŠãªã®ã¯ãç¹å®ã®ã¢ã¯ã·ã§ã³ãæåŸ ããç¶æ ã«ãªãããšã§ãã ïŒå ±æïŒã»ã¬ã¯ã¿ãŒã䜿çšããŠãã®çµæã確èªããããšã¯ã1åã®ãã¹ã§3ã€ãã¹ãŠãã«ããŒããæ¹æ³ã§ãã
Immutable.jsãŸãã¯ãã®ä»ã䜿çšãããã©ããèå³ããããŸãã Reduxã®ç©äºã®äžæ¡ãã§ãç§ã¯äžå€äœ¿çšããŠããªãæ³åã§ããŸããã§ãæ§ç¯ããŸããããç§ã¯äžå€ã§é£Œããªããã«åœ¹ç«ã€ããšã¯ããªãæ·±ããã¹ããããæ§é ãæããŠãã_do_ã
ããã ããã«ã€ããŠã¯èšããŸã§ããããŸããã ã¯ãïŒ ã€ãã¥ãŒã¿ãã«ã䜿çšããŠããŸãïŒ ããªããèšãããã«ããããå®è³ªçãªäœãã«äœ¿çšããªãããšãæ³åããã®ã¯é£ããã§ãã
@bvaughnç§ãèŠåŽããé åã®1ã€ã¯ãImmutableãšã³ã³ããŒãã³ãã®éã«ç·ãåŒãå Žæã§ãã äžå€ãªããžã§ã¯ããã³ã³ããŒãã³ãã«æž¡ããšãçŽç²ãªã¬ã³ããªã³ã°ã®ãã³ã¬ãŒã¿/ããã¯ã¹ã€ã³ãéåžžã«ç°¡åã«äœ¿çšã§ããŸãããã³ã³ããŒãã³ãã«äžå€ã®ã³ãŒããå«ãŸããããšã«ãªããŸãïŒç§ã¯å¥œãã§ã¯ãããŸããïŒã ãããŸã§ã®ãšãããç§ã¯ãããå®è¡ããŸããããImmutable.jsã®ã¡ãœããã«çŽæ¥ã¢ã¯ã»ã¹ãã代ããã«ãrenderïŒïŒã¡ãœããã§ã»ã¬ã¯ã¿ãŒã䜿çšããŠãããšæããŸããïŒ
æ£çŽãªãšãããããã¯ç§ãã¡ããŸã å³ããæ¹éãå®çŸ©ããŠããªããã®ã§ãã å€ãã®å Žåããã¹ããŒããã³ã³ããã§ã»ã¬ã¯ã¿ã䜿çšããŠãäžå€ãªããžã§ã¯ããããã€ãã£ãå€ãè¿œå ãããã€ãã£ãå€ãæååãããŒã«å€ãªã©ãšããŠã³ã³ããŒãã³ãã«æž¡ããŸããäžå€ãªããžã§ã¯ããæž¡ãããšããããŸãããã»ãšãã©ã®å Žåã Record
åãæž¡ããŠãã³ã³ããŒãã³ããããããã€ãã£ããªããžã§ã¯ãã®ããã«ïŒã²ãã¿ãŒã䜿çšããŠïŒåŠçã§ããããã«ããŸãã
ç§ã¯å察ã®æ¹åã«é²ãã§ãããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãããäºçŽ°ãªãã®ã«ããŠããŸãã ããããç§ã¯æ¬åœã«reduxããå§ããã°ããã§ãã ããªãã®ã¢ãããŒãã«é¢ããããã€ãã®è³ªåïŒ
1ïŒã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãã©ã®ããã«ãã¹ãããŸããïŒ ãã¹ããç°¡åãªãããå€éšãµãŒãã¹ã«äŸåããªãçŽç²ãªåæé¢æ°ã«ã§ããã ãå€ãã®ããžãã¯ã移åããã®ã奜ãã§ãã
2ïŒããããªããŒãã§ã¿ã€ã ãã©ãã«ã䜿çšããŠããŸããïŒ react redux devtoolsã®åªããç¹ã®1ã€ã¯ãããããªããŒããã»ããã¢ããããããšãã¹ãã¢ãæ°ããã¬ãã¥ãŒãµãŒã«å¯ŸããŠãã¹ãŠã®ã¢ã¯ã·ã§ã³ãåå®è¡ããããšã§ãã ããžãã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«ç§»ããšããããããã¯å€±ãããŸãã
3ïŒã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãå¹æãããããããã«è€æ°åãã£ã¹ãããããå Žåãããã¯ããªãã®ç¶æ
ãäžæçã«ç¡å¹ãªç¶æ
ã«ããããšãæå³ããŸããïŒ ïŒããã§ã¯ãåŸã§éåæã«ãã£ã¹ãããããã®ã§ã¯ãªããè€æ°ã®åæãã£ã¹ãããã«ã€ããŠèããŠããŸãïŒ
ã¯ããããã¯ããªãã®ã¬ãã¥ãŒãµãŒãããªãã®ç¶æ
ã®å®è£
ã®è©³çŽ°ã§ãããããªããã¯ãšãªAPIãéããŠããªãã®ç¶æ
ãããªãã®ã³ã³ããŒãã³ãã«å
¬éããŠãããšèšã£ãŠããããã§ãã
ä»ã®ã€ã³ã¿ãŒãã§ãŒã¹ãšåæ§ã«ããã«ãããªã³ã°ããŠç¶æ
ã®ãªãã¡ã¯ã¿ãªã³ã°ã容æã«ããŸãã
æ°ããJSæ§æã®IMOã¯ãéåžžã®JSã§ãªã¹ããšãªããžã§ã¯ããç°¡åã«å€æŽã§ãããããImmutableJSã䜿çšããããšã¯ããŸã圹ã«ç«ã¡ãŸããã å€ãã®ããããã£ãæã€éåžžã«å€§ããªãªã¹ããšãªããžã§ã¯ãããããããã©ãŒãã³ã¹äžã®çç±ã§æ§é çãªå ±æãå¿ èŠãªå Žåãé€ããŠãImmutableJSã¯å³å¯ãªèŠä»¶ã§ã¯ãããŸããã
@bvaughnããªãã¯æ¬åœã«ãã®ãããžã§ã¯ããèŠãå¿
èŠããããŸãïŒ https ïŒ
@yelouafiã«sagas ïŒåœåã¯ããã¯ãšã³ãã®æŠå¿µïŒã«ã€ããŠè©±ãå§ãããšããããã¯ãã®çš®ã®åé¡ã解決ããããšã§ããã ç§ã®å Žåãæ¢åã®ã¢ããªã«ãªã³ããŒãã£ã³ã°ããŠãããŠãŒã¶ãŒãæ¥ç¶ããŠãããšãã«ãæåã«sagasã䜿çšããããšããŸããã
1ïŒã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãã©ã®ããã«ãã¹ãããŸããïŒ ãã¹ããç°¡åãªãããå€éšãµãŒãã¹ã«äŸåããªãçŽç²ãªåæé¢æ°ã«ã§ããã ãå€ãã®ããžãã¯ã移åããã®ã奜ãã§ãã
ç§ã¯ãããäžã§èª¬æããããšããŸããããåºæ¬çã«ã¯...ãã¢ãã«ãã®ãããªã¢ãããŒãã§ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒããã¹ãããã®ãïŒãããŸã§ã®ãšããç§ã«ãšã£ãŠïŒæãçã«ããªã£ãŠãããšæããŸãã ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®çµæããã£ã¹ãããããŠãã¹ããéå§ããã»ã¬ã¯ã¿ãŒã䜿çšããŠç¶æ ã確èªããŸãã ãã®ããã«ãåäžã®ãã¹ãã§ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒããã®ã¬ãã¥ãŒãµãŒãããã³é¢é£ãããã¹ãŠã®ã»ã¬ã¯ã¿ãŒãã«ããŒã§ããŸãã
2ïŒããããªããŒãã§ã¿ã€ã ãã©ãã«ã䜿çšããŠããŸããïŒ react redux devtoolsã®åªããç¹ã®1ã€ã¯ãããããªããŒããã»ããã¢ããããããšãã¹ãã¢ãæ°ããã¬ãã¥ãŒãµãŒã«å¯ŸããŠãã¹ãŠã®ã¢ã¯ã·ã§ã³ãåå®è¡ããããšã§ãã ããžãã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«ç§»ããšããããããã¯å€±ãããŸãã
ããããã¿ã€ã ãã©ãã«ã¯äœ¿çšããŠããŸããã ãããããªãããªãã®ããžãã¹ããžãã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«ãªã£ãŠããããšãããã§äœããã®åœ±é¿ãäžããã®ã§ããããïŒ ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãæŽæ°ããã®ã¯ã¬ãã¥ãŒãµãŒã ãã§ãã ãããã£ãŠãäœæãããã¢ã¯ã·ã§ã³ãåå®è¡ãããšãã©ã¡ãã®æ¹æ³ã§ãåãçµæãåŸãããŸãã
3ïŒã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãå¹æãããããããã«è€æ°åãã£ã¹ãããããå Žåãããã¯ããªãã®ç¶æ ãäžæçã«ç¡å¹ãªç¶æ ã«ããããšãæå³ããŸããïŒ ïŒããã§ã¯ãåŸã§éåæã«ãã£ã¹ãããããã®ã§ã¯ãªããè€æ°ã®åæãã£ã¹ãããã«ã€ããŠèããŠããŸãïŒ
äžæçãªç¡å¹ç¶æ ã¯ãå Žåã«ãã£ãŠã¯å®éã«åé¿ã§ããªããã®ã§ãã çµææŽåæ§ãããéããéåžžã¯åé¡ãããŸããã ãŸããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãŸãã¯ãªãã¥ãŒãµãŒã«ããžãã¹ããžãã¯ãååšãããã©ããã«é¢ä¿ãªããç¶æ ãäžæçã«ç¡å¹ã«ãªãå¯èœæ§ããããŸãã ããã¯å¯äœçšãšããªãã®åºã®è©³çŽ°ãšãã£ãšé¢ä¿ããããŸãã
æ°ããJSæ§æã®IMOã¯ãéåžžã®JSã§ãªã¹ããšãªããžã§ã¯ããç°¡åã«å€æŽã§ãããããImmutableJSã䜿çšããããšã¯ããŸã圹ã«ç«ã¡ãŸããã å€ãã®ããããã£ãæã€éåžžã«å€§ããªãªã¹ããšãªããžã§ã¯ãããããããã©ãŒãã³ã¹äžã®çç±ã§æ§é çãªå ±æãå¿ èŠãªå Žåãé€ããŠãImmutableJSã¯å³å¯ãªèŠä»¶ã§ã¯ãããŸããã
ïŒç§ã®ç®ã«ã¯ïŒImmutableã䜿çšããäž»ãªçç±ã¯ãæŽæ°ã®ããã®ããã©ãŒãã³ã¹ãæ§æç³è¡£æ§æã§ã¯ãããŸããã äž»ãªçç±ã¯ãããªãïŒãŸãã¯ä»ã®èª°ãïŒãã¬ãã¥ãŒãµãŒå ã§çä¿¡ç¶æ ã_å¶ç¶ã«_å€æŽããã®ãé²ãããã§ãã ããã¯ããŒããŒã§ãããæ®å¿µãªãããã¬ãŒã³ãªJSãªããžã§ã¯ãã§è¡ãã®ã¯ç°¡åã§ãã
@bvaughnããªãã¯æ¬åœã«ãã®ãããžã§ã¯ããèŠãå¿ èŠããããŸãïŒ https ïŒ
@yelouafiã«sagas ïŒåœåã¯ããã¯ãšã³ãã®æŠå¿µïŒã«ã€ããŠè©±ãå§ãããšããããã¯ãã®çš®ã®åé¡ã解決ããããšã§ããã ç§ã®å Žåãæ¢åã®ã¢ããªã«ãªã³ããŒãã£ã³ã°ããŠãããŠãŒã¶ãŒãæ¥ç¶ããŠãããšãã«ãæåã«sagasã䜿çšããããšããŸããã
ç§ã¯å®éã«ãã®ãããžã§ã¯ãã以åã«ãã§ãã¯ã¢ãŠãããŸãã:)ãŸã 䜿çšããŠããŸãããã ããã¯ãã¡ããšèŠããŸãã
ç§ã¯ãããäžã§èª¬æããããšããŸããããåºæ¬çã«ã¯...ãã¢ãã«ãã®ãããªã¢ãããŒãã§ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒããã¹ãããã®ãïŒãããŸã§ã®ãšããç§ã«ãšã£ãŠïŒæãçã«ããªã£ãŠãããšæããŸãã ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®çµæããã£ã¹ãããããŠãã¹ããéå§ããã»ã¬ã¯ã¿ãŒã䜿çšããŠç¶æ ã確èªããŸãã ãã®ããã«ãåäžã®ãã¹ãã§ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒããã®ã¬ãã¥ãŒãµãŒãããã³é¢é£ãããã¹ãŠã®ã»ã¬ã¯ã¿ãŒãã«ããŒã§ããŸãã
ãã¿ãŸããããã®éšåãæã«å ¥ããŸããã ç§ãçåã«æã£ãŠããã®ã¯ãéåææ§ãšçžäºäœçšãããã¹ãã®äžéšã§ãã ç§ã¯ãã®ãããªãã¹ããæžããããããŸããïŒ
var store = createStore();
store.dispatch(actions.startRequest());
store.dispatch(actions.requestResponseReceived({...});
strictEqual(isLoaded(store.getState());
ããããããªãã®ãã¹ãã¯ã©ã®ããã«èŠããŸããïŒ ãã®ãããªãã®ïŒ
var mock = mockFetch();
store.dispatch(actions.request());
mock.expect("/api/foo.bar").andRespond("{status: OK}");
strictEqual(isLoaded(store.getState());
ããããã¿ã€ã ãã©ãã«ã¯äœ¿çšããŠããŸããã ãããããªãããªãã®ããžãã¹ããžãã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«ãªã£ãŠããããšãããã§äœããã®åœ±é¿ãäžããã®ã§ããããïŒ ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãæŽæ°ããã®ã¯ã¬ãã¥ãŒãµãŒã ãã§ãã ãããã£ãŠãäœæãããã¢ã¯ã·ã§ã³ãåå®è¡ãããšãã©ã¡ãã®æ¹æ³ã§ãåãçµæãåŸãããŸãã
ã³ãŒããå€æŽãããå Žåã¯ã©ããªããŸããïŒ ã¬ãã¥ãŒãµãŒãå€æŽãããšãåãã¢ã¯ã·ã§ã³ãåçãããŸãããæ°ããã¬ãã¥ãŒãµãŒã䜿çšãããŸãã äžæ¹ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãå€æŽãããšãæ°ããããŒãžã§ã³ã¯åçãããŸããã ãããã£ãŠã2ã€ã®ã·ããªãªãæ€èšããŸãã
ã¬ãã¥ãŒãµãŒä»ãïŒ
1ïŒã¢ããªã§ã¢ã¯ã·ã§ã³ãè©ŠããŸãã
2ïŒã¬ãã¥ãŒãµãŒã«ãã°ããããç¶æ
ãééã£ãŠããŸãã
3ïŒã¬ãã¥ãŒãµãŒã®ãã°ãä¿®æ£ããŠä¿åããŸã
4ïŒã¿ã€ã ãã©ãã«ã¯æ°ããã¬ãã¥ãŒãµãŒãããŒãããç§ãæ¬æ¥ããã¹ãç¶æ
ã«ããŸãã
äžæ¹ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®å Žå
1ïŒã¢ããªã§ã¢ã¯ã·ã§ã³ãè©ŠããŸãã
2ïŒã¢ã¯ã·ã§ã³äœæè
ã«ãã°ããããééã£ãã¢ã¯ã·ã§ã³ãäœæãããçµæã«ãªããŸã
3ïŒã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®ãã°ãä¿®æ£ããŠä¿åããŸã
4ïŒãŸã æ£ãããªãç¶æ
ã«ãããããå°ãªããšãã¢ã¯ã·ã§ã³ãåè©Šè¡ããå¿
èŠããããŸããå®å
šã«å£ããç¶æ
ã«ãªã£ãå Žåã¯ãæŽæ°ããå¿
èŠããããŸãã
äžæçãªç¡å¹ç¶æ ã¯ãå Žåã«ãã£ãŠã¯å®éã«åé¿ã§ããªããã®ã§ãã çµææŽåæ§ãããéããéåžžã¯åé¡ãããŸããã ãŸããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãŸãã¯ãªãã¥ãŒãµãŒã«ããžãã¹ããžãã¯ãååšãããã©ããã«é¢ä¿ãªããç¶æ ãäžæçã«ç¡å¹ã«ãªãå¯èœæ§ããããŸãã ããã¯å¯äœçšãšããªãã®åºã®è©³çŽ°ãšãã£ãšé¢ä¿ããããŸãã
ç§ã®reduxã®èãæ¹ã¯ãã¹ãã¢ã¯åžžã«æå¹ãªç¶æ ã«ãããšäž»åŒµããŠãããšæããŸãã ã¬ãã¥ãŒãµãŒã¯åžžã«æå¹ãªç¶æ ãåããæå¹ãªç¶æ ãçæããŸãã äžè²«æ§ã®ãªãç¶æ ãèš±å¯ããããã«åŒ·å¶ããã®ã¯ã©ã®ãããªå Žåã ãšæããŸããïŒ
äžæããŠç³ãèš³ãããŸããããç¡å¹ã§æå¹ãªç¶æ
ãšã¯ã©ãããæå³ã§ãã
ããïŒ ããŒã¿ãèªã¿èŸŒãŸããŠããããŸãã¯ã¢ã¯ã·ã§ã³ãå®è¡ãããŠãããããŸã å®äºããŠããªãå€èŠ³
ç§ã«ãšã£ãŠã¯æå¹ãªäžæçãªç¶æ
ã®ããã§ãã
Redux @bvaughnãš@sompylasarã®äžæçãªç¶æ ãšã¯ã©ãããæå³ã§ããïŒ ãã£ã¹ããããçµäºããããã¹ããŒãããŸãã ã¹ããŒãããå Žåãç¶æ ã¯å€åããŸããã
ã¬ãã¥ãŒãµãŒã«ã³ãŒãã®åé¡ããªãéããReduxã«ã¯ã¬ãã¥ãŒãµãŒããžãã¯ãšäžèŽããç¶æ ãããããŸããã ã©ããããããããã£ã¹ãããããããã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ãã©ã³ã¶ã¯ã·ã§ã³ã§åŠçãããŸããããªãŒå šäœãæŽæ°ãããããç¶æ ããŸã£ããå€æŽãããªããã®ã©ã¡ããã§ãã
ããªãŒå šäœãæŽæ°ãããŠãé©åãªæ¹æ³ã§ã¯ãªãå ŽåïŒReactãã¬ã³ããªã³ã°ã§ããªãç¶æ ãªã©ïŒãããã¯ããªããæ£ããä»äºãããŠããªãã ãã§ã:)
Reduxã§ã¯ãçŸåšã®ç¶æ ã¯ãåäžã®ãã£ã¹ãããããã©ã³ã¶ã¯ã·ã§ã³å¢çã§ãããšèŠãªãããšã§ãã
ãã ããåããã©ã³ã¶ã¯ã·ã§ã³ã§2ã€ã®ã¢ã¯ã·ã§ã³ãåæçã«ãã£ã¹ãããããããšæããã@winstonewertã®æžå¿µãç解ããŠããŸãã actionCreatorãè€æ°ã®ã¢ã¯ã·ã§ã³ããã£ã¹ããããããã¹ãŠã®ã¢ã¯ã·ã§ã³ãæ£ããå®è¡ãããããšãæåŸ ããå Žåãããããã§ãã 2ã€ã®ã¢ã¯ã·ã§ã³ããã£ã¹ãããããã2çªç®ã®ã¢ã¯ã·ã§ã³ã倱æããå Žåãæåã®ã¢ã¯ã·ã§ã³ã®ã¿ãé©çšããããäžè²«æ§ããªãããšèŠãªãããšãã§ããç¶æ ã«ãªããŸãã @winstonewertã¯ã2çªç®ã®ã¢ã¯ã·ã§ã³ã®ãã£ã¹ãããã倱æããå Žåã«ã2ã€ã®ã¢ã¯ã·ã§ã³ãããŒã«ããã¯ããããšãæãã§ããå¯èœæ§ããããŸãã
@winstonewertããã®å
éšãã¬ãŒã ã¯ãŒã¯ã«ãã®ãããªãã®ãå®è£
ããŸãããããããŸã§ã¯ãŸãïŒ //github.com/stample/atom-react/blob/master/src/atom/atom.js
ãŸããã¬ã³ããªã³ã°ãšã©ãŒãåŠçãããã£ãã®ã§ããç¶æ
ãæ£åžžã«ã¬ã³ããªã³ã°ã§ããªãå Žåã¯ãUIããããã¯ãããªãããã«ãç¶æ
ãããŒã«ããã¯ããå¿
èŠããããŸããã æ®å¿µãªããã次ã®ãªãªãŒã¹ãŸã§ãã¬ã³ããªã³ã°ã¡ãœããããšã©ãŒãã¹ããŒãããšReactã¯éåžžã«æªãä»äºãããã®ã§ãããã»ã©æçšã§ã¯ãããŸããã§ããããå°æ¥çã«ã¯åœ¹ç«ã€å¯èœæ§ããããŸãã
ããã«ãŠã§ã¢ãšã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ãã¹ãã¢ãè€æ°ã®åæãã£ã¹ããããåãå ¥ããããšãã§ãããšç¢ºä¿¡ããŠããŸãã
ãã ããã¬ã³ããªã³ã°ãšã©ãŒãçºçããå Žåã«ç¶æ ãããŒã«ããã¯ã§ãããã©ããã¯ããããŸãããéåžžãç¶æ ãã¬ã³ããªã³ã°ããããšãããšãreduxã¹ãã¢ã¯ãã§ã«ãã³ãããããããŠããããã§ãã ç§ã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯ãã¬ã³ããªã³ã°ãããªã¬ãŒããæçµçã«ã¬ã³ããªã³ã°ãšã©ãŒãããŒã«ããã¯ããããã«äœ¿çšãããbeforeTransactionCommitãããã¯ããããŸãã
@gaearonãã®çš®ã®æ©èœããµããŒãããäºå®ãããã®ãââã
redux-batched-subscribeã¯å®éã®ãã©ã³ã¶ã¯ã·ã§ã³ãå®è¡ããããšãèš±å¯ãããã¬ã³ããªã³ã°ã®æ°ãæžããã ãã§ããããã«ç§ã«ã¯æããŸãã ç§ãèŠãŠããã®ã¯ããµãã¹ã¯ãªãã·ã§ã³ãªã¹ããŒãæåŸã«äžåºŠã ãèµ·åããããšããŠããåãã£ã¹ãããã®åŸã«ã¹ãã¢ããã³ããããããããšã§ãã
å®å šãªãã©ã³ã¶ã¯ã·ã§ã³ãµããŒããå¿ èŠãªã®ã¯ãªãã§ããïŒ ãŠãŒã¹ã±ãŒã¹ãç解ããŠããªããšæããŸãã
@gaearonãŸã ããããããŸãããã @ winstonewertã®
ã¢ã€ãã¢ã¯ã dispatch([a1,a2])
ãå®è¡ã§ããa2ã倱æããå Žåãa1ããã£ã¹ããããããåã®ç¶æ
ã«ããŒã«ããã¯ãããšãããã®ã§ãã
ãããŸã§ãç§ã¯è€æ°ã®ã¢ã¯ã·ã§ã³ãåæçã«ãã£ã¹ãããããŠããïŒããšãã°ãåäžã®onClickãªã¹ããŒããŸãã¯actionCreatorã§ïŒããã£ã¹ããããããŠãããã¹ãŠã®ã¢ã¯ã·ã§ã³ã®æåŸã«ã®ã¿ã¬ã³ããŒãåŒã³åºãæ¹æ³ãšããŠäž»ã«ãã©ã³ã¶ã¯ã·ã§ã³ãå®è£ ããŠããŸããããããã¯redux-batched-subscribeãããžã§ã¯ãã«ãã£ãŠå¥ã®æ¹æ³ã§è§£æ±ºãããŸããã
ç§ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã§å®è¡ããããã«äœ¿çšããã¢ã¯ã·ã§ã³ã¯ãã»ãšãã©ã®å ŽåãäžèŠãªã¬ã³ããªã³ã°ãåé¿ããããã®ãã®ã§ããããã¢ã¯ã·ã§ã³ã¯ç¬ç«ããŠæå³ããã£ãããã2çªç®ã®ã¢ã¯ã·ã§ã³ã®ãã£ã¹ãããã倱æããå Žåã§ããæåã®ã¢ã¯ã·ã§ã³ãããŒã«ããã¯ããªããšãäžè²«ããç¶æ ãåŸãããŸãïŒããããèšç»ããããã®ã§ã¯ãªããããããŸãã...ïŒã 誰ããå®å šãªããŒã«ããã¯ã圹ç«ã€ãŠãŒã¹ã±ãŒã¹ãæãä»ãããšãã§ãããã©ããã¯æ¬åœã«ããããŸãã
ãã ããã¬ã³ããªã³ã°ã倱æããå Žåãã¬ã³ããªã³ã°ã§ããªãç¶æ ã§é²è¡ãè©Šã¿ãã®ã§ã¯ãªããã¬ã³ããªã³ã°ã倱æããªãæåŸã®ç¶æ ã«ããŒã«ããã¯ããããšããã®ã¯æå³ããããŸãããïŒ
åçŽãªã¬ãã¥ãŒãµãŒãšã³ãã³ãµãŒã¯æ©èœããŸããïŒ äŸãã°
const enhanceReducerWithTheAbilityToConsumeMultipleActions = (reducer =>
(state, actions) => (typeof actions.reduce === 'function'
? actions.reduce(reducer, state)
: reducer(state, actions)
)
)
ããã§ãé åãã¹ãã¢ã«ãã£ã¹ãããã§ããŸãã ãšã³ãã³ãµãŒã¯åã ã®ã¢ã¯ã·ã§ã³ãã¢ã³ããã¯ãããããåã¬ãã¥ãŒãµãŒã«éããŸãã
ã¯ããååšããŸãïŒ https ïŒ
ãã@gaearonç§ã¯ãããç¥ããŸããã§ããã éåžžã«ãã䌌ããŠãŒã¹ã±ãŒã¹ãããŸããŸãªæ¹æ³ã§è§£æ±ºããããšãã2ã€ã®ç°ãªããããžã§ã¯ããããããšã«æ°ã¥ããŸããã§ããã
ã©ã¡ããäžèŠãªã¬ã³ããªã³ã°ãåé¿ã§ããŸããã1ã€ç®ã¯ãããåŠçããããã¹ãŠã®ã¢ã¯ã·ã§ã³ãããŒã«ããã¯ãã2ã€ç®ã¯å€±æããã¢ã¯ã·ã§ã³ã®ã¿ãé©çšããŸããã
@gaearonçãããããèŠãªãã®ã¯æªãã ïŒãã©ãã·ã¥ïŒ
ç§ã¯ããããã»ãšãã©ã®äººã»ã©Reduxãå®éã«äœéšããããšã¯ãããŸããããäžèŠãããšããããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã§ããå€ãã®ããšãè¡ããã¬ãã¥ãŒãµãŒã§ããå°ãªãããšãè¡ããããšã«å察ããªããã°ãªããŸãããäŒç€Ÿã
Hacker WayïŒ Fluxãã¿ãŒã³ãå°å ¥ãWebã¢ããªéçºã®åèã§ã¯ãFluxãçºæãããããšã«ã€ãªãããŸãã«åé¡ã¯åœä»€åã³ãŒãã§ãã
ãã®å ŽåãI / Oãå®è¡ããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯ãã®åœä»€åã³ãŒãã§ãã
ç§ãã¡ã¯ä»äºã§Reduxã䜿çšããŠããŸããããç§ãä»äºãããŠããå Žæã§ã¯ããã现ããã¢ã¯ã·ã§ã³ïŒãã¡ããããã¹ãŠããèªäœã§æå³ããããŸãïŒãå®è¡ãããããããããã§ããªã¬ãŒããŠããŸããã ããšãã°ãã¡ãã»ãŒãžãã¯ãªãã¯ãããšã OPEN_MESSAGE_VIEW
ã FETCH_MESSAGE
ã MARK_NOTIFICATION_AS_READ
3ã€ã®ã¢ã¯ã·ã§ã³ãããªã¬ãŒãããŸãã
次ã«ããããã®ãäœã¬ãã«ãã¢ã¯ã·ã§ã³ã¯ãã¹ãã¢å ã«äœããã®å€ãèšå®ããããã®ãã³ãã³ããããã»ãã¿ãŒãããŸãã¯ãã¡ãã»ãŒãžãã«ãããªãããšãããããŸãã ãã®ããã«ç¶ããã°ãæ»ã£ãŠMVCã䜿çšããã³ãŒããåçŽã«ãªãå¯èœæ§ããããŸãã
ããæå³ã§ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯äžçŽãªã³ãŒããè¡šããã¬ãã¥ãŒãµãŒïŒããã³ã»ã¬ã¯ã¿ãŒïŒã¯çŽç²ãªã³ãŒããè¡šããŸãã Haskellã®äººã ã¯ãäžçŽãªã³ãŒããå°ãªãããããçŽç²ãªã³ãŒãã䜿çšããæ¹ããããšèããŠã
ããšãã°ãç§ã®ãµã€ããããžã§ã¯ãïŒReduxã䜿çšïŒã§ã¯ãwebkitã®é³å£°èªèAPIã䜿çšããŠããŸãã ããªãã話ããšãããã¯onresult
ã€ãã³ããçºããŸãã 2ã€ã®éžæè¢ããããŸãâãããã®ã€ãã³ãã¯ã©ãã§åŠçãããŸããïŒ
ç§ã¯2çªç®ã«è¡ããŸããïŒçã®ã€ãã³ããªããžã§ã¯ããã¹ãã¢ã«éä¿¡ããã ãã§ãã
ãã ããRedux dev-toolsã¯ããã¬ãŒã³ã§ãªããªããžã§ã¯ããã¹ãã¢ã«éä¿¡ããããšãã«ããã奜ãŸãªãããã§ããããã§ããããã®ã€ãã³ããªããžã§ã¯ãããã¬ãŒã³ãªããžã§ã¯ãã«å€æããããã«ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«ããã€ãã®å°ããªããžãã¯ãè¿œå ããŸããã ïŒã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®ã³ãŒãã¯éåžžã«äºçŽ°ãªãã®ãªã®ã§ãééãã¯ãããŸãããïŒ
次ã«ãã¬ãã¥ãŒãµãŒã¯ãããã®éåžžã«åå§çãªã€ãã³ããçµã¿åãããŠã話ãããå 容ã®ãã©ã³ã¹ã¯ãªãããæ§ç¯ã§ããŸãã ãã®ããžãã¯ã¯çŽç²ãªã³ãŒãå ã«ãããããïŒã¬ãã¥ãŒãµãŒãããããªããŒãããããšã§ïŒéåžžã«ç°¡åã«ã©ã€ãã§åŸ®èª¿æŽã§ããŸãã
@dtinthããµããŒãããããšæããŸãã ã¢ã¯ã·ã§ã³ã¯ããããã®ã€ãã³ãã«ã©ã®ããã«åå¿ããããã§ã¯ãªããçŸå®ã®äžçããçºçããã€ãã³ããè¡šãå¿ èŠããããŸãã ç¹ã«ãCQRSãåç §ããŠãã ãããå®éã®ã€ãã³ãã«ã€ããŠã§ããã ãå€ãã®è©³çŽ°ããã°ã«èšé²ããå¿ èŠããããŸããã¬ãã¥ãŒãµãŒã¯å°æ¥æ¹åãããå€ãã€ãã³ããæ°ããããžãã¯ã§åŠçããå¯èœæ§ããããŸãã
@dtinth @ denis-sokolovç§ãããªãã«åæããŸãã ãšããã§ã redux-sagaãããžã§ã¯ããåç §ããŠãããšããactionCreatorsãæé·ãããæéã®çµéãšãšãã«ãŸããŸãè€éã«ãããšããèãã«å察ããŠããããšãæ確ã«ã§ããªãã£ããããããŸããã
Redux-sagaãããžã§ã¯ããã @ dtinthã§èª¬æããŠããããšãå®è¡ããè©Šã¿ã§ãããäž¡æ¹ã®çºèšã«ã¯
ãã¶ããRedux sagaã®è°è«ã«ã€ãªããå ã®è°è«ã®ãã®æç¹ãèŠãããšãã§ããŸãïŒ https ïŒ
æãããªTodoCreatedã€ãã³ããããTodoã¢ããªããããšæ³åããŠãã ããã 次ã«ãã¢ããªã®ãªã³ããŒãã£ã³ã°ãã³ãŒãã£ã³ã°ããããã«ãé¡ãããŸãã ãŠãŒã¶ãŒãToDoãäœæãããããããã¢ããã§ç¥çŠããå¿ èŠããããŸãã
ããã¯@bvaughnã奜ãããã§ã
function createTodo(todo) {
return (dispatch, getState) => {
dispatch({type: "TodoCreated",payload: todo});
if ( getState().isOnboarding ) {
dispatch({type: "ShowOnboardingTodoCreateCongratulation"});
}
}
}
ãã®ã¢ãããŒãã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãã¢ããªãã¥ãŒã®ã¬ã€ã¢ãŠããšé«åºŠã«çµåãããããã奜ãã§ã¯ãããŸããã actionCreatorã¯ã決å®ãäžãããã«UIç¶æ ããªãŒã®æ§é ãç¥ã£ãŠããå¿ èŠãããããšãåæãšããŠããŸãã
ããã¯@ denis-sokolov @ dtinthã奜ãããã«æããããã®ã§ãïŒ
function onboardingTodoCreateCongratulationReducer(state = defaultState, action) {
var isOnboarding = isOnboardingReducer(state.isOnboarding,action);
switch (action) {
case "TodoCreated":
return {isOnboarding: isOnboarding, isCongratulationDisplayed: isOnboarding}
default:
return {isOnboarding: isOnboarding, isCongratulationDisplayed: false}
}
}
ã¯ããããã§ãšãã衚瀺ããå¿ èŠããããã©ãããç¥ãã¬ãã¥ãŒãµãŒãäœæã§ããŸãã ãã ãããããã¢ããã衚瀺ãããããšã瀺ãã¢ã¯ã·ã§ã³ããªããŠã衚瀺ããããããã¢ããããããŸãã ç§èªèº«ã®çµéšã§ã¯ããããå®è¡ããŠããïŒãããŠãããå®è¡ããŠããã¬ã¬ã·ãŒã³ãŒãããŸã æã£ãŠããïŒã®ã§ããããéåžžã«æ瀺çã«ããæ¹ãåžžã«è¯ãã§ããã¢ã¯ã·ã§ã³DISPLAY_CONGRATULATIONãèµ·åãããªãå Žåã¯ããç¥ããããã¢ããã衚瀺ããªãã§ãã ããã æ瀺çã¯ãæé»çãããä¿å®ãã¯ããã«ç°¡åã§ãã
redux-sagaã¯ãžã§ãã¬ãŒã¿ãŒã䜿çšããŠãããæ £ããŠããªãå Žåã¯å°ãè€éã«èŠãããããããŸããããåºæ¬çã«åçŽåãããå®è£ ã§ã¯ã次ã®ããã«èšè¿°ããŸãã
function createTodo(todo) {
return (dispatch, getState) => {
dispatch({type: "TodoCreated",payload: todo});
}
}
function onboardingSaga(state, action, actionCreators) {
switch (action) {
case "OnboardingStarted":
return {onboarding: true, ...state};
case "OnboardingStarted":
return {onboarding: false, ...state};
case "TodoCreated":
if ( state.onboarding ) dispatch({type: "ShowOnboardingTodoCreateCongratulation"});
return state;
default:
return state;
}
}
äœè³ã¯ãã€ãã³ããåãåããå¹æãçã¿åºãå¯èœæ§ã®ããã¹ããŒããã«ãªä¿³åªã§ãã ããã§ã¯ããããäœã§ããããç解ããããã«äžçŽãªã¬ãã¥ãŒãµãŒãšããŠå®è£ ãããŠããŸãããå®éã«ã¯redux-sagaãããžã§ã¯ãã«ã¯å«ãŸããŠããŸããã
ããªããæåã®ã«ãŒã«ã®äžè©±ããããªãã°ãããã¯ãã¹ãŠã«ã€ããŠããŸãæ確ã§ã¯ãããŸããã
äžèšã®å®è£
ãèŠããšããªã³ããŒãã£ã³ã°äžã«ToDoãäœæãããã³ã«ãç¥ããããã¢ãããéãããšãããããŸãã ã»ãšãã©ã®å Žåããªã³ããŒãã£ã³ã°äžã«æåã«äœæãããToDoã«å¯ŸããŠã®ã¿éãããã¹ãŠã§ã¯ãªãããã«ããŸãã ãŸãããŠãŒã¶ãŒãæçµçã«ãªã³ããŒãã£ã³ã°ãæåããããçŽãããšãã§ããããã«ããããšèããŠããŸãã
ãªã³ããŒãã£ã³ã°ããŸããŸãè€éã«ãªãã«ã€ããŠã3ã€ã®å®è£ ãã¹ãŠã§ã³ãŒããæéã®çµéãšãšãã«ã©ã®ããã«ä¹±éã«ãªãããããããŸããïŒ
redux-sagaãšäžèšã®ãªã³ããŒãã£ã³ã°ã«ãŒã«ã䜿çšãããšã次ã®ããã«èšè¿°ã§ããŸãã
function* onboarding() {
while ( true ) {
take(ONBOARDING_STARTED)
take(TODO_CREATED)
put(SHOW_TODO_CREATION_CONGRATULATION)
take(ONBOARDING_ENDED)
}
}
äžèšã®ãœãªã¥ãŒã·ã§ã³ãããã¯ããã«ç°¡åãªæ¹æ³ã§ãã®ãŠãŒã¹ã±ãŒã¹ã解決ã§ãããšæããŸãã ç§ãééã£ãŠããå Žåã¯ãããç°¡åãªå®è£ ãæããŠãã ãã:)
ããªãã¯äžçŽãªã³ãŒãã«ã€ããŠè©±ããŸãããããã®å Žåããã€ã¯/ãããå¹æã¯å®éã«ã¯ããŒã¿ã§ãããããRedux-sagaã®å®è£ ã«äžçŽç©ã¯ãããŸããã takeïŒïŒãåŒã³åºããããšãå®è¡ãããŸãããå®è¡ãããšãã§ã¯ãã®èšè¿°åãè¿ãããããæç¹ã§ã€ã³ã¿ãŒããªã¿ãŒãèµ·åããããããµã¬ããã¹ãããããã®ã¢ãã¯ã¯å¿ èŠãããŸããã Haskellããã£ãŠããæ©èœçãªéçºè ãªããFree / IOã¢ãããèããŠãã ããã
ãã®å Žåã次ã®ããšãå¯èœã«ãªããŸãã
getState
ã«äŸåããããã«ããŸããŸãã解éã¬ã€ã€ãŒãæäŸããŠãçã®ã€ãã³ããããæå³ã®ããé«ã¬ãã«ã®ã€ãã³ãã«å€æã§ããããã«ããŸãïŒELMãããã«ã¢ããæã«ã€ãã³ããã©ããããããšã§è¡ãã®ãšå°ã䌌ãŠããŸãïŒã
äŸïŒ
ã¢ãã«ã䜿çšããŠã¢ãžã¥ã©ãŒã¢ããªã®ã¬ã€ã¢ãŠããå®çŸããå Žåã¯ãã¢ãã«ãçµåããªãããã«ããããšãã§ããŸãã äœè³ãã«ãããªã³ã°ãã€ã³ãã«ãªããŸãã ã¢ãã«ã¯åœŒãã®çã®åºæ¥äºãç¥ã£ãŠããå¿ èŠããããäœè³ã¯ãããã®çã®åºæ¥äºã解éããŸãã ããã¯ãduck1ãããžã§ã¯ããå¥ã®ã³ã³ããã¹ãã§åå©çšãããããããããduck1ãduck2ã®ã¢ã¯ã·ã§ã³ãçŽæ¥ãã£ã¹ããããããããã¯ããã«åªããŠããŸãã ãã ããã«ãããªã³ã°ãã€ã³ãã¯actionCreatorsã«ãããå¯èœæ§ãããããããä»æ¥ã»ãšãã©ã®äººãè¡ã£ãŠããããšã§ãããšäž»åŒµãã人ããããããããŸããã
@slorberããã¯çŽ æŽãããäŸã§ãïŒ åã¢ãããŒãã®ã¡ãªãããšãã¡ãªãããæ確ã«èª¬æããããã«æéãå²ããŠããã ãããããšãããããŸãã ïŒç§ã¯ãããããã¥ã¡ã³ãã«ããã¹ãã ãšããæããŸããïŒ
ç§ã¯ä»¥åãåæ§ã®ã¢ã€ãã¢ïŒãã¯ãŒã«ãŒã³ã³ããŒãã³ãããšåä»ããŸããïŒãæ€èšããŠããŸããã åºæ¬çã«ãããã¯äœãã¬ã³ããªã³ã°ããªãïŒ render: () => null
ïŒããã€ãã³ãïŒããšãã°ãã¹ãã¢ããïŒããªãã¹ã³ããä»ã®å¯äœçšãããªã¬ãŒããReactã³ã³ããŒãã³ãã§ãã 次ã«ããã®ã¯ãŒã«ãŒã³ã³ããŒãã³ããã¢ããªã±ãŒã·ã§ã³ã«ãŒãã³ã³ããŒãã³ãå
ã«é
眮ãããŸãã è€éãªå¯äœçšãåŠçãããã1ã€ã®ã¯ã¬ã€ãžãŒãªæ¹æ³ã ïŒstuck_out_tongueïŒ
ç§ãå¯ãŠããéãããã§ããããã®è°è«ããããŸããã
@winstonewert ãããªãã¯ã¿ã€ã ãã©ãã«ãšãã°ã®ããã³ãŒãã®åçã«ã€ããŠè¯ãç¹ãæããŠããŸãã ç¹å®ã®çš®é¡ã®ãã°/å€æŽã¯ã©ã¡ãã®æ¹æ³ã§ãã¿ã€ã ãã©ãã«ã§ã¯æ©èœããªããšæããŸãããå šäœçã«ã¯æ£ãããšæããŸãã
@dtinth ãç³ãèš³ãããŸããããç§ã¯ããªãã®ã³ã¡ã³ãã®ã»ãšãã©ããã©ããŒããŠããŸããã ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒ/ãªãã¥ãŒãµãŒã®ãã¢ãã«ãã³ãŒãã®äžéšã¯ãããŒã¿ããã§ããããå¿ èŠããããšããç¹ã§ãäžçŽã§ããå¿ èŠããããŸãã ãããè¶ ããŠãããªãã¯ç§ã倱ããŸããã ç§ã®æåã®æçš¿ã®äž»ãªç®çã®1ã€ã¯ãå®çšäž»çŸ©ã®1ã€ã«ãããŸããã§ããã
@winstonewertã¯ããreduxã®ç§ã®èãæ¹ã¯ãã¹ãã¢ãåžžã«æå¹ãªç¶æ ã«ããããšã䞻匵ããŠãããšæããŸãããšè¿°ã¹ãŠããŸãã
@slorberã¯ããRedux @bvaughnãš@sompylasarã®äžæçãªç¶æ ãšã¯ã©ãããæå³ã§ããïŒãã£ã¹ããããçµäºããããã¹ããŒãããŸããã¹ããŒãããŠããç¶æ ã¯å€ãããŸãããã
ç§ãã¡ã¯ããŸããŸãªããšãèããŠãããšç¢ºä¿¡ããŠããŸãã ãäžæçãªç¡å¹ç¶æ ããšèšã£ããšããç§ã¯æ¬¡ã®ãããªãŠãŒã¹ã±ãŒã¹ãåç §ããŠããŸããã ããšãã°ãç§ãšååã¯æè¿redux-searchããªãªãŒã¹ããŸããã ãã®æ€çŽ¢ããã«ãŠã§ã¢ã¯ãæ€çŽ¢å¯èœãªãã®ã®ã³ã¬ã¯ã·ã§ã³ãžã®å€æŽããªãã¹ã³ããæ€çŽ¢ã®ããã«ãããã«ïŒåïŒã€ã³ããã¯ã¹ãä»ããŸãã ãŠãŒã¶ãŒããã£ã«ã¿ãŒããã¹ããæå®ãããšãredux-searchã¯ãŠãŒã¶ãŒã®ããã¹ãã«äžèŽãããªãœãŒã¹uidã®ãªã¹ããè¿ããŸãã ãããã£ãŠã次ã®ããšãèæ ®ããŠãã ããã
ã¢ããªã±ãŒã·ã§ã³ã¹ãã¢ã«ããã€ãã®æ€çŽ¢å¯èœãªãªããžã§ã¯ããå«ãŸããŠãããšæ³åããŠãã ããïŒ [{id: 1, name: "Alex"}, {id: 2, name: "Brian"}, {id: 3, name: "Charles"}]
ã ãŠãŒã¶ãŒããã£ã«ã¿ãŒããã¹ããeããå
¥åãããããæ€çŽ¢ããã«ãŠã§ã¢ã«ã¯ID 1ãš3ã®é
åãå«ãŸããŠããŸãããŠãŒã¶ãŒ1ïŒAlexïŒããããŒã«ã«ã§ã®ãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãŸãã¯ãªã¢ãŒãããŒã¿ã®æŽæ°ã«å¿ããŠåé€ããããšããŸãããã®ãŠãŒã¶ãŒã¬ã³ãŒãã¯å«ãŸããªããªããŸããã ã¬ãã¥ãŒãµãŒããŠãŒã¶ãŒã³ã¬ã¯ã·ã§ã³ãæŽæ°ããæç¹ã§ãã¹ãã¢ã¯äžæçã«ç¡å¹ã«ãªããŸããããã¯ãredux-searchãã³ã¬ã¯ã·ã§ã³ã«ååšããªããªã£ãIDãåç
§ããããã§ãã ããã«ãŠã§ã¢ãå床å®è¡ããããšãç¡å¹ãªç¶æ
ãä¿®æ£ãããŸãã ãã®çš®ã®ããšã¯ãããªãŒã®1ã€ã®ããŒããå¥ã®ããŒãã«é¢é£ä»ããããŠãããšãã«ãã€ã§ãçºçããå¯èœæ§ããããŸãã
@slorberæ°ã¯ãããã®ã¢ãããŒãã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãã¢ããªãã¥ãŒã®ã¬ã€ã¢ãŠããšé«åºŠã«çµåãããããã奜ãã§ã¯ãããŸãããactionCreatorã¯ã決å®ãäžãããã«UIç¶æ ããªãŒã®æ§é ãç¥ã£ãŠããå¿ èŠããããšæ³å®ããŠããŸããã
ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒããã¢ããªãã¥ãŒã®ã¬ã€ã¢ãŠãã«ãçµåããã¢ãããŒãã®æå³ãããããŸããã ç¶æ ããªãŒã¯UIã_ãã©ã€ã_ïŒãŸãã¯éç¥ïŒããŸãã ãããFluxã®äž»ãªç®çã®1ã€ã§ãã ãããŠãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãšãªãã¥ãŒãµãŒã¯ãå®çŸ©äžããã®ç¶æ ãšçµåãããŸãïŒãã ããUIãšã¯çµåãããŸããïŒã
ç§ã奜ããã®ãšããŠããªããæžãããµã³ãã«ã³ãŒãã®äŸ¡å€ãããã®ã¯ãç§ãèããŠãããããªãã®ã§ã¯ãããŸããã å€åç§ã¯èªåèªèº«ã説æããã®ã«è²§åŒ±ãªä»äºãããŸããã ãã®ãããªããšãè°è«ããããšã®é£ããã¯ããããéåžžãåçŽãªäŸãäžè¬çãªäŸã§ã¯çŸããªãããšã ãšæããŸãã ïŒããšãã°ãæšæºã®TODO MVCã¢ããªã¯ããã®ãããªåŸ®åŠãªè°è«ãè¡ãã«ã¯ååã«è€éã§ã¯ãããŸãããïŒ
æåŸã®ç¹ãæ確ã«ããããã«ç·šéã
ãšããã§@slorberã¯ããã§ç§ãèããŠãããã®ã®äŸã§ãã å°ã工倫ãåããããŠããŸãã
ããªãã®å·ã«å€ãã®ããŒãããããšããŸãããã ãããã®ããŒãã®1ã€ã¯ãå ±æãªãœãŒã¹ãæ ŒçŽããŸãã ïŒãå ±æããšã¯ãããŒã«ã«ã«ãã£ãã·ã¥ãããã¢ããªã±ãŒã·ã§ã³å ã®è€æ°ã®ããŒãžããã¢ã¯ã»ã¹ããããªãœãŒã¹ãæå³ããŸããïŒãããã®å ±æãªãœãŒã¹ã«ã¯ãç¬èªã®ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãšãªãã¥ãŒãµãŒïŒãã¢ãã«ãïŒããããŸãã å¥ã®ããŒãã¯ãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ããŒãžã®æ å ±ãæ ŒçŽããŸãã ããªãã®ããŒãžã«ãç¬èªã®ã¢ãã«ããããŸãã
ããªãã®ããŒãžãææ°ã§æé«ã®ThingãããŒããããŠãŒã¶ãŒããããç·šéã§ããããã«ããå¿ èŠããããšããŸãããã ãã®ãããªç¶æ³ã§äœ¿çšããå¯èœæ§ã®ããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¢ãããŒãã®äŸã次ã«ç€ºããŸãã
import { fetchThing, thingSelector } from 'resources/thing/duck'
import { showError } from 'messages/duck'
export function fetchAndProcessThing ({ params }): Object {
const { id } = params
return async ({ dispatch, getState }) => {
try {
await dispatch(fetchThing({ id }))
const thing = thingSelector(getState())
dispatch({ type: 'PROCESS_THING', thing })
} catch (err) {
dispatch(showError(`Invalid thing id="${id}".`))
}
}
}
@winstonewertã¯ã2çªç®ã®ã¢ã¯ã·ã§ã³ã®ãã£ã¹ãããã倱æããå Žåã«ã2ã€ã®ã¢ã¯ã·ã§ã³ãããŒã«ããã¯ããããšãæãã§ããå¯èœæ§ããããŸãã
ãããã2ã€ã®ã¢ã¯ã·ã§ã³ããã£ã¹ãããããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯äœæããŸããã 2ã€ã®ããšãè¡ãåäžã®ã¢ã¯ã·ã§ã³ãå®çŸ©ããŸãã OPã¯ãç§ãå«ãäžæçãªç¡å¹ç¶æ ãèš±å¯ããå°ããªã¢ã¯ã·ã§ã³ããã£ã¹ãããããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã奜ãããã§ãã
ã¬ãã¥ãŒãµãŒããŠãŒã¶ãŒã³ã¬ã¯ã·ã§ã³ãæŽæ°ããæç¹ã§ãã¹ãã¢ã¯äžæçã«ç¡å¹ã«ãªããŸããããã¯ãredux-searchãã³ã¬ã¯ã·ã§ã³ã«ååšããªããªã£ãIDãåç §ããããã§ãã ããã«ãŠã§ã¢ãå床å®è¡ããããšãç¡å¹ãªç¶æ ãä¿®æ£ãããŸãã ãã®çš®ã®ããšã¯ãããªãŒã®1ã€ã®ããŒããå¥ã®ããŒãã«é¢é£ä»ããããŠãããšãã«ãã€ã§ãçºçããå¯èœæ§ããããŸãã
ããã¯å®éã«ç§ãæ©ãŸããŠãããããªã±ãŒã¹ã§ãã ç§ã®èãã§ã¯ãã€ã³ããã¯ã¹ã¯çæ³çã«ã¯ã¬ãã¥ãŒãµãŒãŸãã¯ã»ã¬ã¯ã¿ãŒã«ãã£ãŠå®å šã«åŠçããããã®ã§ãã æ€çŽ¢ãææ°ã®ç¶æ ã«ä¿ã€ããã«è¿œå ã®ã¢ã¯ã·ã§ã³ããã£ã¹ãããããå¿ èŠãããã®ã¯ãreduxã®çŽç²ãªäœ¿çšæ³ã§ã¯ãªãããã§ãã
OPã¯ãç§ãå«ãäžæçãªç¡å¹ç¶æ ãèš±å¯ããå°ããªã¢ã¯ã·ã§ã³ããã£ã¹ãããããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã奜ãããã§ãã
ã§ã¯ãªãæ£ç¢ºã«ã ç¶æ ããªãŒã®ã¢ã¯ã·ã§ã³äœæè ã®ããŒãã«é¢ããŠã¯ãåäžã®ã¢ã¯ã·ã§ã³ãåªå ããŸãã ãã ããåäžã®æŠå¿µçãªãŠãŒã¶ãŒãã¢ã¯ã·ã§ã³ããç¶æ ããªãŒã®è€æ°ã®ããŒãã«åœ±é¿ãäžããå Žåã¯ãè€æ°ã®ã¢ã¯ã·ã§ã³ããã£ã¹ãããããå¿ èŠããããŸãã åã¢ã¯ã·ã§ã³ãåå¥ã«åŒã³åºãããšãïŒç§ã¯_bad_ã ãšæããŸãïŒãåäžã®ã¢ã¯ã·ã§ã³äœæè ã«ã¢ã¯ã·ã§ã³ããã£ã¹ããããããããšãã§ããŸãïŒredux-thunkã®æ¹æ³ã§ããã¥ãŒã¬ã€ã€ãŒãããã®æ å ±ãé ãã®ã§_better_ã ãšæããŸãïŒã
ããã¯å®éã«ç§ãæ©ãŸããŠãããããªã±ãŒã¹ã§ãã ç§ã®èãã§ã¯ãã€ã³ããã¯ã¹ã¯çæ³çã«ã¯ã¬ãã¥ãŒãµãŒãŸãã¯ã»ã¬ã¯ã¿ãŒã«ãã£ãŠå®å šã«åŠçããããã®ã§ãã æ€çŽ¢ãææ°ã®ç¶æ ã«ä¿ã€ããã«è¿œå ã®ã¢ã¯ã·ã§ã³ããã£ã¹ãããããå¿ èŠãããã®ã¯ãreduxã®çŽç²ãªäœ¿çšæ³ã§ã¯ãªãããã§ãã
äœåãªã¢ã¯ã·ã§ã³ããã£ã¹ãããããŠããŸããã æ€çŽ¢ã¯ããã«ãŠã§ã¢ã§ãã èªåã§ãã ãã ããããªãŒã®2ã€ã®ããŒããäžèŽããªãå Žåãäžæçãªç¶æ ãååšããŸãã
@bvaughnããããã®ãããªçŽç²äž»çŸ©è ã§ããããšããè©«ã³ããŸãïŒ
ãŸããäžçŽãªã³ãŒãã¯ããŒã¿ã®ãã§ããããã®ä»ã®å¯äœçš/ IOãšé¢ä¿ããããŸãããçŽç²ãªã³ãŒãã¯å¯äœçšãåŒãèµ·ããããšã¯ã§ããŸããã çŽç²ãªã³ãŒããšäžçŽãªã³ãŒãã®æ¯èŒã«ã€ããŠã¯ããã®è¡šãåç §ããŠãã ããã
Fluxã®ãã¹ããã©ã¯ãã£ã¹ã§ã¯ãã¢ã¯ã·ã§ã³ã¯ãã»ãã¿ãŒã§ã¯ãªãããŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ã説æãããå¿ èŠããããšãããŠããŸãã Fluxã®ããã¥ã¡ã³ãã¯ããããã®ã¢ã¯ã·ã§ã³ãã©ãããæ¥ãã®ããããã«ç€ºåããŠããŸãã
æ°ããããŒã¿ãã·ã¹ãã ã«å ¥ããšãã¢ããªã±ãŒã·ã§ã³ãæäœãã人ãŸãã¯Web APIåŒã³åºããä»ã
åºæ¬çã«ãã¢ã¯ã·ã§ã³ã¯ãäœãèµ·ãã£ãã®ããã説æããäºå®/ããŒã¿ã§ãããäœãèµ·ããã¹ããã§ã¯ãããŸããã ã¹ãã¢ã¯ããããã®ã¢ã¯ã·ã§ã³ã«åæçãã€äºæž¬å¯èœã«ã®ã¿åå¿ã§ããä»ã®å¯äœçšã¯ãããŸããã ä»ã®ãã¹ãŠã®å¯äœçšã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒïŒãŸãã¯sagasïŒwink :)ã§åŠçããå¿ èŠããããŸãã
ãããæåã®æ¹æ³ã§ãããšããä»ã®ã©ã®æ¹æ³ãããåªããŠãããšãããããã¯è¯ãæ¹æ³ã§ãããããšèšã£ãŠããã®ã§ã¯ãããŸããã ããããããã¯ç§ãçŸåšãã¹ããã©ã¯ãã£ã¹ãšèããŠãããã®ã§ãã
ããšãã°ããŠãŒã¶ãŒããªã¢ãŒããµãŒããŒãžã®æ¥ç¶ãå¿ èŠãšããã¹ã³ã¢ããŒãã衚瀺ããããšããŸãã äœãèµ·ããã¹ããã¯æ¬¡ã®ãšããã§ãã
ãŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ãŸãã¯ãµãŒããŒã®å¿çã®çµæãšããŠã®ã¿ã¢ã¯ã·ã§ã³ãã¹ãã¢ã«å°éã§ãããšä»®å®ãããšã5ã€ã®ã¢ã¯ã·ã§ã³ãäœæã§ããŸãã
SCOREBOARD_VIEW
ïŒãŠãŒã¶ãŒãã¹ã³ã¢ããŒãã®è¡šç€ºãã¿ã³ãã¯ãªãã¯ããçµæïŒSCOREBOARD_FETCH_SUCCESS
ïŒãµãŒããŒããã®å¿çãæåããçµæïŒSCOREBOARD_FETCH_FAILURE
ïŒãµãŒããŒããã®ãšã©ãŒå¿çã®çµæãšããŠïŒSCOREBOARD_CLOSE
ïŒãŠãŒã¶ãŒãéãããã¿ã³ãã¯ãªãã¯ããçµæïŒMESSAGE_BOX_CLOSE
ïŒãŠãŒã¶ãŒãã¡ãã»ãŒãžããã¯ã¹ã®éãããã¿ã³ãã¯ãªãã¯ããçµæïŒãããã®5ã€ã®ã¢ã¯ã·ã§ã³ã¯ãäžèšã®ãã¹ãŠã®èŠä»¶ãåŠçããã®ã«ååã§ãã æåã®4ã€ã®ã¢ã¯ã·ã§ã³ã¯ãã¢ãã«ããšã¯äœã®é¢ä¿ããªãããšãããããŸãã ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ãå€ã®äžçã§äœãèµ·ãã£ããã説æã§ããïŒãŠãŒã¶ãŒã¯ãããå®è¡ãããããµãŒããŒã¯ããèšã£ãŠããŸãïŒãã©ã®ã¬ãã¥ãŒãµãŒã§ãæ¶è²»ã§ããŸãã ãŸãã MESSAGE_BOX_OPEN
ã¢ã¯ã·ã§ã³ã¯ãããŸãããããã¯ããäœãèµ·ãã£ãã®ããã§ã¯ãªãããã§ãïŒãã ããããããã¹ãã§ãïŒã
ç¶æ ããªãŒãå€æŽããå¯äžã®æ¹æ³ã¯ãäœãèµ·ãã£ããã説æãããªããžã§ã¯ãã§ããã¢ã¯ã·ã§ã³ãçºè¡ããâReduxã®README
圌ãã¯ãããã®ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãšäžç·ã«æ¥çãããŠããŸãïŒ
function viewScoreboard () {
return async function (dispatch) {
dispatch({ type: 'SCOREBOARD_VIEW' })
try {
const result = fetchScoreboardFromServer()
dispatch({ type: 'SCOREBOARD_FETCH_SUCCESS', result })
} catch (e) {
dispatch({ type: 'SCOREBOARD_FETCH_FAILURE', error: String(e) })
}
}
}
function closeScoreboard () {
return { type: 'SCOREBOARD_CLOSE' }
}
次ã«ãã¹ãã¢ã®åéšåïŒã¬ãã¥ãŒãµãŒã«ãã£ãŠç®¡çãããïŒã¯ã次ã®ã¢ã¯ã·ã§ã³ã«åå¿ã§ããŸãã
| ã¹ãã¢/ãªãã¥ãŒãµãŒã®äžéš| è¡å|
| --- | --- |
| ã¹ã³ã¢ããŒããã¥ãŒ| SCOREBOARD_VIEW
ã§ã¯å¯èŠæ§ãtrueã«æŽæ°ãã SCOREBOARD_CLOSE
ãšSCOREBOARD_FETCH_FAILURE
ã§ã¯falseã«æŽæ°ããŸã|
| scoreboardLoadingIndicator | äžtrueã«æŽæ°èŠçSCOREBOARD_VIEW
ã§ãåœSCOREBOARD_FETCH_*
|
| ã¹ã³ã¢ããŒãããŒã¿| SCOREBOARD_FETCH_SUCCESS
ã¹ãã¢å
ã®ããŒã¿ãæŽæ°ãã|
| messageBox | å¯èŠæ§ãtrueã«æŽæ°ããã¡ãã»ãŒãžãSCOREBOARD_FETCH_FAILURE
ã«ä¿åããå¯èŠæ§ãMESSAGE_BOX_CLOSE
ã«falseã«æŽæ°ããŸã|
ã芧ã®ãšããã1ã€ã®ã¢ã¯ã·ã§ã³ãã¹ãã¢ã®å€ãã®éšåã«åœ±é¿ãäžããå¯èœæ§ããããŸãã ã¹ãã¢ã«ã¯ãã³ãã³ãïŒäœããã¹ããïŒã§ã¯ãªããã¢ã¯ã·ã§ã³ïŒäœãèµ·ãã£ãã®ãïŒã®é«ã¬ãã«ã®èª¬æã®ã¿ãäžããããŸãã çµæãšããŠïŒ
ã¡ãã»ãŒãžããã¯ã¹ã®ç¶æ ã«åœ±é¿ãäžãããã®ã¯ãããŸããã ãªãããã®çç±ã§éãããã«æ瀺ããããšã¯ã§ããŸããã ãµãã¹ã¯ã©ã€ããããŠãããã®ïŒãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãšãµãŒããŒå¿çïŒã«ã®ã¿åå¿ããŸãã
ããšãã°ããµãŒããŒãã¹ã³ã¢ããŒãã®ãã§ããã«å€±æããã¡ãã»ãŒãžããã¯ã¹ã衚瀺ãããªãã£ãå Žåã SHOW_MESSAGE_BOX
ã¢ã¯ã·ã§ã³ããã£ã¹ããããããªãçç±ã調ã¹ãå¿
èŠã¯ãããŸããã ã¡ãã»ãŒãžããã¯ã¹ãSCOREBOARD_FETCH_FAILURE
ã¢ã¯ã·ã§ã³ãé©åã«åŠçããªãã£ãããšãæããã«ãªããŸãã
ä¿®æ£ã¯ç°¡åã§ãããããªããŒãããŠã¿ã€ã ãã©ãã«ããããšãã§ããŸãã
ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒããã¹ãã¢ããããã«ã©ã®ããã«åå¿ãããã«é¢ä¿ãªããå€ã®äžçã§äœãèµ·ãã£ãŠããããæ£ãã説æãããã©ããããã¹ãã§ããŸãã
åæ§ã«ãã¬ãã¥ãŒãµãŒã¯ãå€çããã®ã¢ã¯ã·ã§ã³ã«é©åã«åå¿ãããã©ãããç°¡åã«ãã¹ãã§ããŸãã
ïŒçµ±åãã¹ãã¯äŸç¶ãšããŠéåžžã«åœ¹ç«ã¡ãŸããïŒ
å¿é
ãªãã :)ç§ã¯ãããªã説æã«æè¬ããŸãã å®éãããã§åæããŠããããã«èãããŸãã ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®äŸviewScoreboard
ãèŠããšããã®ããäžã«ããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®äŸfetchAndProcessThing
ã«ãã䌌ãŠããŸãã
ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãšãªãã¥ãŒãµãŒã¯å¥ã ã«ãã¹ãã§ããŸãã
ç§ã¯ããã«åæããŸãããããããäžç·ã«ãã¹ãããæ¹ãããå®çšçãªæå³ãæã€ããšãå€ããšæããŸãã ã¢ã¯ã·ã§ã³_ãŸãã¯_ãŸãã¯ã¬ãã¥ãŒãµãŒïŒããããäž¡æ¹ïŒã®ãããããéåžžã«åçŽã§ããå¯èœæ§ãé«ããããåçŽãªãã®ãåç¬ã§ãã¹ãããããšã«ããåŽåã®èŠè¿ãã®äŸ¡å€ã¯ããäœããªããŸãã ãã®ãããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãã¬ãã¥ãŒãµãŒãããã³é¢é£ããã»ã¬ã¯ã¿ãŒãäžç·ã«ïŒãã¢ãã«ããšããŠïŒãã¹ãããããšãææ¡ããŸããã
ãã ããåäžã®æŠå¿µçãªãŠãŒã¶ãŒãã¢ã¯ã·ã§ã³ããç¶æ ããªãŒã®è€æ°ã®ããŒãã«åœ±é¿ãäžããå Žåã¯ãè€æ°ã®ã¢ã¯ã·ã§ã³ããã£ã¹ãããããå¿ èŠããããŸãã
ããããããããªããããŠããããšã¯ãreduxã®ãã¹ããã©ã¯ãã£ã¹ãšèããããŠããããšãšã¯ç°ãªããšç§ãæããšããã§ãã æšæºçãªæ¹æ³ã¯ãç¶æ ããªãŒã®è€æ°ã®ããŒããå¿çãã1ã€ã®ã¢ã¯ã·ã§ã³ãæã€ããšã ãšæããŸãã
ãããèå³æ·±ã芳å¯@winstonewertã ç§ãã¡ã¯ããã¢ãã«ããã³ãã«ããšã«äžæã®åå®æ°ã䜿çšãããã¿ãŒã³ã«åŸã£ãŠããŸãããããã£ãŠãæ¡åŒµãããšããªãã¥ãŒãµãŒã¯ãå åŒã®ã¢ã¯ã·ã§ã³äœæè ã«ãã£ãŠãã£ã¹ããããããã¢ã¯ã·ã§ã³ã«ã®ã¿å¿çããŸãã æ£çŽãªãšãããæåã¯ãã¢ã¯ã·ã§ã³ã«å¿çããä»»æã®ã¬ãã¥ãŒãµãŒã«ã€ããŠã©ã®ããã«æããŠããã®ãããããŸããã ããã¯å°ãæªãã«ãã»ã«åã®ããã«æããŸãã
ãã¢ãã«ããã³ãã«ããšã«äžæã®ã¿ã€ãå®æ°ã䜿çšãããã¿ãŒã³ã«åŸã£ãŠããŸãã
ããã¥ã¡ã³ãã®ã©ãã«ããããæšå¥šããŠããªãããšã«æ³šæããŠãã ãã;-)æªããšèšã£ãŠããããã§ã¯ãããŸããããReduxã«ã€ããŠæã ééã£ãèãã人ã ã«äžããŸãã
ãããã£ãŠãæ¡åŒµãããšãã¬ãã¥ãŒãµãŒã¯ãå åŒã®ã¢ã¯ã·ã§ã³äœæè ã«ãã£ãŠãã£ã¹ããããããã¢ã¯ã·ã§ã³ã«ã®ã¿å¿çããŸãã
Reduxã«ã¯ã¬ãã¥ãŒãµãŒ/ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®ãã¢ãªã³ã°ã®ãããªãã®ã¯ãããŸããã ããã¯çŽç²ã«ã¢ãã«ã®ããšã§ãã äžéšã®äººã ã¯ããã奜ãã§ãããããã¯Redux / Fluxã¢ãã«ã®åºæ¬çãªåŒ·ã¿ãèŠãé ããŸãïŒç¶æ ã®çªç¶å€ç°ã¯ãäºããããããŠããããåŒãèµ·ããã³ãŒãããåãé¢ãããŠããŸãã
æ£çŽãªãšãããæåã¯ãã¢ã¯ã·ã§ã³ã«å¿çããä»»æã®ã¬ãã¥ãŒãµãŒã«ã€ããŠã©ã®ããã«æããŠããã®ãããããŸããã ããã¯å°ãæªãã«ãã»ã«åã®ããã«æããŸãã
ã«ãã»ã«åã®å¢çãšèŠãªããã®ã«ãã£ãŠç°ãªããŸãã ã¢ã¯ã·ã§ã³ã¯ã¢ããªå ã§ã°ããŒãã«ã§ãããããã§åé¡ãªããšæããŸãã è€éãªè£œåèŠä»¶ã®ããã«ãã¢ããªã®äžéšãå¥ã®éšåã®ã¢ã¯ã·ã§ã³ã«åå¿ãããå ŽåããããŸãããããã¯åé¡ãªããšèããŠããŸãã çµåã¯æå°éã§ããäŸåããã®ã¯æååãšã¢ã¯ã·ã§ã³ãªããžã§ã¯ãã®åœ¢ç¶ã ãã§ãã å©ç¹ã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãšã®å€§éã®é ç·ãäœæããããšãªããã¢ããªã®ããŸããŸãªéšåã«ã¢ã¯ã·ã§ã³ã®æ°ãã掟çãç°¡åã«å°å ¥ã§ããããšã§ãã ã³ã³ããŒãã³ãã¯ãã¢ã¯ã·ã§ã³ããã£ã¹ãããããããšãã«æ£ç¢ºã«äœãèµ·ããããèªèããŸãããããã¯ãã¬ãã¥ãŒãµãŒåŽã§æ±ºå®ãããŸãã
ãããã£ãŠãç§ãã¡ã®å ¬åŒã®æšå¥šäºé ã¯ãæåã«ç°ãªãã¬ãã¥ãŒãµãŒãåãã¢ã¯ã·ã§ã³ã«å¿çããããã«ããããšã§ãã ãããåä»ã«ãªã£ãå Žåã¯ã確ãã«ãå¥ã ã®ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãäœæããŠãã ããã ãããããã®ã¢ãããŒãããå§ããªãã§ãã ããã
ã»ã¬ã¯ã¿ãŒã䜿çšããããšããå§ãããŸããå®éãç¶æ
ããèªã¿åãé¢æ°ïŒãã»ã¬ã¯ã¿ãŒãïŒãã¬ãã¥ãŒãµãŒãšäžç·ã«ãšã¯ã¹ããŒãããã³ã³ããŒãã³ãã®ç¶æ
æ§é ãããŒãã³ãŒãã£ã³ã°ããã®ã§mapStateToProps
ãªããåžžã«åéžæã䜿çšã§ããŸãïŒãã ãã䜿çšããå¿
èŠã¯ãããŸããïŒãã shopping-cart
äŸã®ããã«åçŽã«ã»ã¬ã¯ã¿ãŒãå®è£
ããããšãã§ããŸãã
ãããããããã¯ããªããåœä»€åãŸãã¯åå¿åã®ã©ã¡ãã§ããã°ã©ãã³ã°ãããã«èŠçŽãããŸãã ã¢ãã«ã䜿çšãããšãã¢ã¯ã·ã§ã³ãšã¬ãã¥ãŒãµãŒãé«åºŠã«çµåãããå¯èœæ§ããããããå¿ é ã®ã¢ã¯ã·ã§ã³ãä¿é²ãããŸãã
SHOW_MESSAGE_BOX
ãŸãã¯SHOW_ERROR
DATA_FETCHING_FAILED
ãŸãã¯USER_ENTERED_INVALID_THING_ID
ã ã¹ãã¢ã¯ããã«å¿ããŠåå¿ããŸããåã®äŸã§ã¯ã SHOW_MESSAGE_BOX
ã¢ã¯ã·ã§ã³ãŸãã¯showError('Invalid thing id="'+id+'"')
ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯ãããŸãããããã¯äºå®ã§ã¯ãªãããã§ãã ããã¯ã³ãã³ãã§ãã
ãã®ãã¡ã¯ããã¹ãã¢ã«å ¥ããšããã®ãã¡ã¯ããçŽç²ãªã¬ãã¥ãŒãµãŒå ã®ã³ãã³ãã«å€æã§ããŸãã
// type Command = State â State
// :: Action â Command
function interpretAction (action) {
switch (action.type) {
case 'DATA_FETCHING_FAILED':
return showErrorMessage('Data fetching failed')
break
case 'USER_ENTERED_INVALID_THING_ID':
return showErrorMessage('User entered invalid thing ID')
break
case 'CLOSE_ERROR_MESSAGE':
return hideErrorMessage()
break
default:
return doNothing()
}
}
// :: (State, Action) â State
function errorMessageReducer (state, action) {
return interpretAction(action)(state)
}
const showErrorMessage = message => state => ({ visible: true, message })
const hideErrorMessage = () => state => ({ visible: false })
const doNothing = () => state => state
ã¢ã¯ã·ã§ã³ããã³ãã³ããã§ã¯ãªãããã¡ã¯ãããšããŠã¹ãã¢ã«å ¥åãããå Žåãããã倱æããå¯èœæ§ã¯äœããªããŸãããªããªããããã¯äºå®ã ããã§ãã
ããã§ãã¬ãã¥ãŒãµãŒããã®äºå®ã誀ã£ãŠè§£éããå Žåãããã¯ç°¡åã«ä¿®æ£ã§ããä¿®æ£ã¯æéã®çµéãšãšãã«é²ãå¯èœæ§ããããŸãã ãã ããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒããã®äºå®ã誀ã£ãŠè§£éããå Žåã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãåå®è¡ããå¿ èŠããããŸãã
USER_ENTERED_INVALID_THING_ID
çºçãããšãã«ãThingIDããã¹ããã£ãŒã«ãããªã»ãããããããã«ã¬ãã¥ãŒãµãŒãå€æŽããããšãã§ããŸãã ãããŠããã®å€åã¯æéãšãšãã«äŒãããŸãã ããŒãžãæŽæ°ããã«ããšã©ãŒã¡ãã»ãŒãžãããŒã«ã©ã€ãºããããšãã§ããŸãã ããã«ããããã£ãŒãããã¯ã«ãŒãã匷åããããããã°ãšèª¿æŽãã¯ããã«ç°¡åã«ãªããŸãã
ïŒç§ã¯ãããã«é·æã«ã€ããŠè©±ããŠããŸãããã¡ããçæããããŸããããªããããå€ãã®ãåºãå¯äžã®åæãããã®äºå®ã«ãšå¯äœçšãªãã§å¿çãèŠãããšãã§ããããšãèãããšããã®äºå®ãè¡šçŸããæ¹æ³ã«ã€ããŠå€ãã®ããšãèããå¿ èŠãããã«ã€ããŠè°è«ã代æ¿ã®éåæ/å¯äœçšã¢ãã«ãšç§ãStackOverflowã«æçš¿ãããã®è³ªåãç§ãã¡ã¯ãŸã ãã®éšåãéä»ãã«ããŠããªããšæããŸããïŒ
æ£çŽãªãšãããæåã¯ãã¢ã¯ã·ã§ã³ã«å¿çããä»»æã®ã¬ãã¥ãŒãµãŒã«ã€ããŠã©ã®ããã«æããŠããã®ãããããŸããã ããã¯å°ãæªãã«ãã»ã«åã®ããã«æããŸãã
è€æ°ã®ã³ã³ããŒãã³ããåãã¹ãã¢ããããŒã¿ãååŸããããšãéåžžã«äžè¬çã§ãã ãŸããåäžã®ã³ã³ããŒãã³ããã¹ãã¢ã®è€æ°ã®éšåããã®ããŒã¿ã«äŸåããããšããããããŸãã ãããã«ãã»ã«åãæªãããã«èãããŸãããïŒ çã«ã¢ãžã¥ãŒã«åããã«ã¯ãReactã³ã³ããŒãã³ãããããã¯ããã³ãã«å ã«å«ããã¹ãã§ã¯ãããŸãããïŒ ïŒ Elmã¢ãŒããã¯ãã£ã¯ãããè¡ããŸããïŒ
Reactã¯ãã¹ãã¢ããã®ããŒã¿ããã¡ã¯ããšããŠæ±ãããšã§
åæ§ã«ãRedux / Fluxã¯ãã¢ã¯ã·ã§ã³ããã¡ã¯ããšããŠæ±ãããšã§
æéãå²ããŠããªãã®èããæžããå ±æããŠãããŠããããšãã@ dtinthã ãŸãããã®è°è«ã«åå ããŠããã
è€æ°ã®ã³ã³ããŒãã³ããåãã¹ãã¢ããããŒã¿ãååŸããããšãéåžžã«äžè¬çã§ãã ãŸããåäžã®ã³ã³ããŒãã³ããã¹ãã¢ã®è€æ°ã®éšåããã®ããŒã¿ã«äŸåããããšããããããŸãã ãããã«ãã»ã«åãæªãããã«èãããŸãããïŒ
ãããš...ããã®ããã€ãã¯äž»èŠ³çã§ãããéããŸãã ãšã¯ã¹ããŒããããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãšã»ã¬ã¯ã¿ãŒã¯ãã¢ãžã¥ãŒã«ã®APIã ãšæããŸãã
ãšã«ãããããã¯è¯ãè°è«ã ã£ããšæããŸãã ã¿ã€äººã以åã®åçã§è¿°ã¹ãããã«ãç§ãã¡ãè°è«ããŠãããããã®ã¢ãããŒãã«ã¯è³åŠäž¡è«ããããŸãã ä»ã®ã¢ãããŒããžã®æŽå¯ãåŸãã®ã¯çŽ æŽãããããšã§ãã :)
ã¡ãªã¿ã«ãã¡ãã»ãŒãžããã¯ã¹ã¯ã衚瀺çšã«å¥ã®ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãçšæãããå Žåã®è¯ãäŸã§ãã èªåçã«åŽäžã§ããããã«äœæãããæéãæž¡ãããããã§ãïŒãããŠã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯ããªããäžçŽãªDate.now()
ãšåŒã¶ãšããã§ãïŒããããåŽäžããã¿ã€ããŒãèšå®ãããã®ã§ãç§ã¯ãã®ã¿ã€ããŒãªã©ããããŠã³ã¹ãããã®ã§ãã¡ãã»ãŒãžããã¯ã¹ã®ãã¢ã¯ã·ã§ã³ãããŒããå人çãªã¢ã¯ã·ã§ã³ãæ£åœåããã®ã«ååéèŠã§ããå ŽåãèããŸãã ããã¯èšã£ãŠããããããç§ã説æããããšã¯https://github.com/yelouafi/redux-sagaã«ãã£ãŠãããšã¬ã¬ã³ãã«è§£æ±ºã§ããã§ããã
ç§ã¯æåã«DiscordReactifluxãã£ããã§ãããæžããŸããããããã«è²Œãä»ããããã«æ±ããããŸããã
ç§ã¯æè¿ãåãããšã«ã€ããŠããèããŠããŸãã ç¶æ ã®æŽæ°ã¯3ã€ã®éšåã«åãããŠããããã«æããŸãã
- ã¢ã¯ã·ã§ã³ã®äœæè ã«ã¯ãæŽæ°ã®å®è¡ã«å¿ èŠãªæå°éã®æ å ±ãæž¡ãããŸãã ã€ãŸããçŸåšã®ç¶æ ããèšç®ã§ãããã®ã¯ãã¹ãŠãã®äžã«ããã¹ãã§ã¯ãããŸããã
- æŽæ°ãå®è¡ããããã«å¿ èŠãªæ å ±ã«ã€ããŠç¶æ ãç §äŒãããŸãïŒããšãã°ãID Xã®Todoãã³ããŒããå Žåã¯ãã³ããŒãäœæã§ããããã«ID Xã®Todoã®å±æ§ããã§ããããŸãïŒã ããã¯ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã§è¡ãããšãã§ãããã®æ å ±ã¯ã¢ã¯ã·ã§ã³ãªããžã§ã¯ãã«å«ãŸããŸãã ããã«ããããã¡ããã¢ã¯ã·ã§ã³ãªããžã§ã¯ããçæãããŸãã ãŸãã¯ãã¬ãã¥ãŒãµãŒïŒã·ã³ã¢ã¯ã·ã§ã³ãªããžã§ã¯ãïŒã§èšç®ããããšãã§ããŸãã
- ãã®æ å ±ã«åºã¥ããŠãçŽç²ãªã¬ãã¥ãŒãµãŒããžãã¯ãé©çšãããŠæ¬¡ã®ç¶æ ãååŸãããŸãã
ããã§åé¡ãšãªãã®ã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«äœãå ¥ããããã¬ãã¥ãŒãµãŒã«äœãå ¥ãããã倪ãã¢ã¯ã·ã§ã³ãªããžã§ã¯ããšèãã¢ã¯ã·ã§ã³ãªããžã§ã¯ãã®ã©ã¡ããéžæãããã§ãã ãã¹ãŠã®ããžãã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«é 眮ãããšãåºæ¬çã«ç¶æ ã®æŽæ°ã宣èšãããã¡ããã¢ã¯ã·ã§ã³ãªããžã§ã¯ãã«ãªããŸãã ã¬ãã¥ãŒãµãŒã¯çŽç²ã«ãªãã銬鹿ã«ãªãããããè¿œå ãããããåé€ãããããã®é¢æ°ãæŽæ°ããŸãã ãããã¯ç°¡åã«äœæã§ããŸãã ããããããžãã¹ããžãã¯ã®å€ãã¯ããã«ãããŸããã
ã¬ãã¥ãŒãµãŒã«ããå€ãã®ããžãã¯ãé 眮ãããšãããŒã¿ããžãã¯ã®ã»ãšãã©ã1ã€ã®å Žæã«ãããããŠãã§èãã¢ã¯ã·ã§ã³ãªããžã§ã¯ãã«ãªããŸãããä»ã®ãã©ã³ãããã®æ å ±ãå¿ èŠã«ãªãå¯èœæ§ããããããã¬ãã¥ãŒãµãŒãäœæããã®ã¯å°é£ã§ãã å·ã®äžäœããè¿œå ã®åŒæ°ãåã倧ããªã¬ãã¥ãŒãµãŒãŸãã¯ã¬ãã¥ãŒãµãŒã«ãªããŸãã
ãããã®åé¡ã«å¯Ÿããçããäœã§ãããããããªãããŸã ãããã©ããããããªã
ãããã®èãã@tommikaikkonenãšå ±æããŠããã ãããããšãããããŸãã ç§ã¯ãŸã ãçãããããã«ãããã«ã€ããŠèªåèªèº«ã決ããŠããŸããã ç§ã¯ããªãã®èŠçŽã«åæããŸãã ããã¹ãŠã®ããžãã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«å ¥ãã...ãã»ã¯ã·ã§ã³ã«1ã€ã®å°ããªã¡ã¢ãè¿œå ããŸããããã«ãããããŒã¿ã®èªã¿åãã«ïŒå ±æïŒã»ã¬ã¯ã¿ãŒã䜿çšã§ããããã«ãªããŸãã
ããã¯é¢çœãã¹ã¬ããã§ãïŒ reduxã¢ããªã®ã©ãã«ã³ãŒããé
眮ããããç解ããããšã¯ãç§ãã¡å
šå¡ãçŽé¢ããŠããåé¡ã ãšæããŸãã èµ·ãã£ãããšãèšé²ãããšããCQRSã®ã¢ã€ãã¢ã奜ãã§ãã
ããããCQRSã§ã¯ã¢ã€ãã¢ã®äžäžèŽãèŠãããŸããAFAIKã®ãã¹ããã©ã¯ãã£ã¹ã¯ããã¥ãŒã«ãã£ãŠçŽæ¥æ¶è²»ãããã¢ã¯ã·ã§ã³/ã€ãã³ãããéæ£èŠåãããç¶æ
ãæ§ç¯ããããšã§ãã ãã ããreduxã®ãã¹ããã©ã¯ãã£ã¹ã¯ãå®å
šã«æ£èŠåãããç¶æ
ãæ§ç¯ããã»ã¬ã¯ã¿ãŒãä»ããŠãã¥ãŒã®ããŒã¿ãååŸããããšã§ãã
ãã¥ãŒã«ãã£ãŠçŽæ¥æ¶è²»ã§ããéæ£èŠåç¶æ
ãæ§ç¯ãããšãã¬ãã¥ãŒãµãŒãå¥ã®ã¬ãã¥ãŒãµãŒã«ããŒã¿ãå¿
èŠãšãããšããåé¡ã¯ãªããªããšæããŸãïŒåã¬ãã¥ãŒãµãŒã¯æ£èŠåãæ°ã«ããå¿
èŠã®ãªããã¹ãŠã®ããŒã¿ãæ ŒçŽã§ããããïŒã ããããããŒã¿ãæŽæ°ãããšãã«ä»ã®åé¡ãçºçããŸãã å€åãããè°è«ã®æ žå¿ã§ããïŒ
é·å¹Žã®ãªããžã§ã¯ãæåéçºããæ¥ãŠããŸããReduxã¯å€§ããªåŸéã®ããã«æããŸãã ã€ãã³ãïŒã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒïŒãšããžãã¹ããžãã¯ãã«ãã»ã«åããã¯ã©ã¹ãäœæããããšãèªåèªèº«ãæé¡ããŠããããšã«æ°ä»ããŸããã ç§ã¯ãŸã æå³ã®ãã劥åç¹ãèŠã€ããããšããŠããŸãããçŸæç¹ã§ã¯ãããã§ããŠããŸããã ä»ã®èª°ããåãããã«æããŸããïŒ
ãªããžã§ã¯ãæåããã°ã©ãã³ã°ã§ã¯ãèªã¿åããšæžã蟌ã¿ãçµã¿åãããããšãæšå¥šãããŸãã ããã«ãããã¹ãããã·ã§ãããšããŒã«ããã¯ãéäžãã°ã誀ã£ãç¶æ ã®å€æŽã®ãããã°ããã现ããå¹ççãªæŽæ°ãªã©ãå€ãã®åé¡ãçºçããŸãã ããããåé¡ã§ãããšæããªãå ŽåãåŸæ¥ã®ãªããžã§ã¯ãæåMVCã³ãŒããèšè¿°ããªããããããåé¿ããæ¹æ³ãç¥ã£ãŠããå Žåãããã³Reduxãã¢ããªã§è§£æ±ºãããããå€ãã®åé¡ãåŒãèµ·ããå Žåã¯ãReduxïŒwinkïŒã䜿çšããªãã§ãã ããã ã
@jayesbeãªããžã§ã¯ãæåããã°ã©ãã³ã°ã®ããã¯ã°ã©ãŠã³ãããæ¥ãŠããã®ã§ãããã°ã©ãã³ã°ã®æ°ããã¢ã€ãã¢ãšè¡çªããããšããããŸãã ããã¯ããã®ããŒãã«é¢ããå€ãã®èšäºã®1ã€ã§ãïŒ https ïŒ
ã¢ã¯ã·ã§ã³ãããŒã¿å€æããåé¢ããããšã«ãããããžãã¹ã«ãŒã«ã®é©çšã®ãã¹ããããç°¡åã«ãªããŸãã å€æã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããã¹ããžã®äŸå床ãäœããªããŸãã
ããã¯ãJavascriptã§ãªããžã§ã¯ããã¯ã©ã¹ãæŸæ£ããããšãæå³ãããã®ã§ã¯ãããŸããã ããšãã°ãReactã³ã³ããŒãã³ãã¯ãªããžã§ã¯ããšããŠå®è£ ãããçŸåšã¯ã¯ã©ã¹ãšããŠå®è£ ãããŠããŸãã ããããReactã³ã³ããŒãã³ãã¯ãæäŸãããããŒã¿ã®æ圱ãäœæããããã ãã«èšèšãããŠããŸãã ç¶æ ãä¿åããªãçŽç²ãªã³ã³ããŒãã³ãã䜿çšããããšããå§ãããŸãã
ããã§Reduxãç»å ŽããŸããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãæŽçããã¢ã¯ã·ã§ã³ãšããã«å¯Ÿå¿ããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã®å€æããŸãšããããšã§ãã
@johnsoftekãªã³ã¯ãããããšãã ããããéå»10幎éã®ç§ã®çµéšã«åºã¥ããšãç§ã¯ããã«åæããŸããããããã§OOãšéOOã®éã®è°è«ã«å ¥ãå¿ èŠã¯ãããŸããã ç§ãæ±ããŠããåé¡ã¯ãã³ãŒãã®æŽçãšæœè±¡åã§ãã
ç§ã®ç®æšã¯ãïŒæ§æå€ã®ã¿ã䜿çšããŠïŒæ°çŸã®ã¢ããªãäœæããããã«äœ¿çšã§ããåäžã®ã¢ããª/åäžã®ã¢ãŒããã¯ãã£ãäœæããããšã§ãã ç§ã察åŠããªããã°ãªããªããŠãŒã¹ã±ãŒã¹ã¯ãå€ãã®ã¯ã©ã€ã¢ã³ãã«ãã£ãŠäœ¿çšãããŠãããã¯ã€ãã©ãã«ãœãããŠã§ã¢ãœãªã¥ãŒã·ã§ã³ãåŠçããããšã§ãããããããç¬èªã®ã¢ããªã±ãŒã·ã§ã³ãåŒã³åºããŸãã
ç§ã¯èå³æ·±ã劥åæ¡ãæãã€ããããããŠããã¯ååã«ããŸãåŠçã§ãããšæãããé¢æ°åããã°ã©ãã³ã°ã®çŸ€éã®åºæºãæºãããŠããªããããããªãã ç§ã¯ãŸã ãããããã«åºãããã§ãã
ãµãŒããŒåŽã¢ããªã±ãŒã·ã§ã³ãšã®ã€ã³ã¿ãŒãã§ã€ã¹ã«å¿ èŠãªãã¹ãŠã®ããžãã¹ããžãã¯ãAPIã©ãããŒãªã©ãå«ãåäžã®Applicationã¯ã©ã¹ããããŸãã
äŸ..
export default Application {
constructor(config) {
this.config = config;
}
config() {
return this.config;
}
login(data, cb) {
const url = [
this.config.url,
'?client=' + this.config.client,
'&username=' + data.username,
....
].join('');
fetch(url).then((responseText) => {
cb(responseText);
})
}
... more business logic
}
ãã®ãªããžã§ã¯ãã®åäžã®ã€ã³ã¹ã¿ã³ã¹ãäœæããReduxãããã€ããŒãæ¡åŒµããŠã³ã³ããã¹ãã«é 眮ããŸããã
import { Provider } from 'react-redux';
export default class MyProvider extends Provider {
getChildContext() {
return Object.assign({}, Provider.prototype.getChildContext.call(this), {
app: this.props.app
});
}
render() {
return this.props.children;
}
}
MyProvider.childContextTypes = {
store: React.PropTypes.object,
app: React.PropTypes.object
}
ããããç§ã¯ãã®ãããã€ããŒããã®ããã«äœ¿çšããŸãã
import Application from './application';
import config from './config';
class MyApp extends Component {
render() {
return (
<MyProvider store={store} app={new Application(config)}>
<Router />
</MyProvider>
);
}
}
AppRegistry.registerComponent('MyApp', () => MyApp);
æåŸã«ãã³ã³ããŒãã³ãã§ã¢ããªã䜿çšããŸããã
class Login extends React.Component {
render() {
const { app } = this.context;
const { state, actions } = this.props;
return (
<View style={style.transparentContainer}>
<Form ref="form" type={User} options={options} />
<Button
onPress={() => {
value = this.refs.form.getValue();
if (value) {
app.login(value, actions.login);
}
}}
>
Login
</Button>
</View>
);
}
};
Login.contextTypes = {
app: React.PropTypes.object,
};
function mapStateToProps(state) {
return {
state: state.default.auth
};
};
function mapDispatchToProps(dispatch) {
return {
actions: bindActionCreators(authActions, dispatch),
dispatch
};
}
export default connect(mapStateToProps, mapDispatchToProps)(Login);
ãããã£ãŠãAction Creatorã¯ãç§ã®ããžãã¹ããžãã¯ãžã®åãªãã³ãŒã«ããã¯é¢æ°ã§ãã
app.login(value, actions.login);
ç§ã¯èªèšŒããå§ããã°ããã§ããããã®ãœãªã¥ãŒã·ã§ã³ã¯çŸæç¹ã§ã¯ããŸãæ©èœããŠããããã§ãã
ã¹ãã¢ãã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ã¿ã³ã¹ã«æž¡ãããšãã§ãããšæããŸãããã¹ãã¢ã«å¶ç¶ã®å€åãçºçããããªãã®ã§ãããã¯ããããããŸããã ã¹ãã¢ãžã®ã¢ã¯ã»ã¹ã¯äŸ¿å©ãããããŸãããã å¿ èŠã«å¿ããŠãããã«ã€ããŠãã£ãšèããŸãã
ç§ã¯èå³æ·±ã劥åæ¡ãæãã€ããããããŠããã¯ååã«ããŸãåŠçã§ãããšæãããé¢æ°åããã°ã©ãã³ã°ã®çŸ€éã®åºæºãæºãããŠããªããããããªãã
ããã«ã¯ãæ©èœçãªçŸ€éãã¯ãããŸããïŒwink:ã Reduxã§æ©èœçãªãœãªã¥ãŒã·ã§ã³ãéžæããçç±ã¯ãç§ãã¡ãç¬æçã§ããããã§ã¯ãªããã¯ã©ã¹ã®ããã«äººã
ããã°ãã°ç¯ãããã€ãã®åé¡ã解決ããããã§ãã ããšãã°ãã¬ãã¥ãŒãµãŒãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒããåé¢ãããšããã°ã®ãã°èšé²ãšåçŸã«éèŠãªèªã¿åããšæžã蟌ã¿ãåé¢ã§ããŸãã ãã¬ãŒã³ãªããžã§ã¯ãã§ããã¢ã¯ã·ã§ã³ã¯ãã·ãªã¢ã«åå¯èœã§ãããããèšé²ãšåçãå¯èœã§ãã åæ§ã«ãç¶æ
ãMyAppState
ã€ã³ã¹ã¿ã³ã¹ã§ã¯ãªããã¬ãŒã³ãªããžã§ã¯ãã§ããããããµãŒããŒã§ã®ã·ãªã¢ã«åãšã¯ã©ã€ã¢ã³ãã§ã®éã·ãªã¢ã«åãéåžžã«ç°¡åã«ãªãããµãŒããŒã¬ã³ããªã³ã°ã®ããã«ããŸãã¯ãã®äžéšãlocalStorage
æ°žç¶åã§ããŸãã ã¬ãã¥ãŒãµãŒãé¢æ°ãšããŠè¡šçŸãããšãã¿ã€ã ãã©ãã«ãšããããªããŒããå®è£
ã§ããã»ã¬ã¯ã¿ãŒãé¢æ°ãšããŠè¡šçŸãããšãã¡ã¢åãç°¡åã«è¿œå ã§ããŸãã ãããã®å©ç¹ã¯ãã¹ãŠãç§ãã¡ããæ©èœçãªçŸ€è¡ãã§ããããšãšã¯é¢ä¿ããªãããã®ã©ã€ãã©ãªã解決ããããã«äœæãããç¹å®ã®ã¿ã¹ã¯ã解決ããããšãšé¢ä¿ããããŸãã
ãã®ãªããžã§ã¯ãã®åäžã®ã€ã³ã¹ã¿ã³ã¹ãäœæããReduxãããã€ããŒãæ¡åŒµããŠã³ã³ããã¹ãã«é 眮ããŸããã
ããã¯ç§ã«ã¯å®å šã«è³¢æã«èŠããŸãã ç§ãã¡ã¯ã¯ã©ã¹ã®äžåçãªæãã¿ãæã£ãŠããŸããã éèŠãªã®ã¯ãããããå³ããå¶éãããŠããå ŽåïŒã¬ãã¥ãŒãµãŒãã¢ã¯ã·ã§ã³ãªããžã§ã¯ããªã©ïŒã«ã¯äœ¿çšããããªããšããããšã§ãããããšãã°ãã¢ã¯ã·ã§ã³ãªããžã§ã¯ããçæããããã«äœ¿çšããããšã¯åé¡ãããŸããã
ãã ããããã¯å£ããããããã Provider
ãæ¡åŒµããããšã¯é¿ããŸãã ãã®å¿
èŠã¯ãããŸãããReactã¯ã³ã³ããŒãã³ãã®ã³ã³ããã¹ããããŒãžããã®ã§ã代ããã«ã©ããããã ãã§ãã
import { Component } from 'react';
import { Provider } from 'react-redux';
export default class MyProvider extends Component {
getChildContext() {
return {
app: this.props.app
};
}
render() {
return (
<Provider store={this.props.store}>
{this.props.children}
</Provider>
);
}
}
MyProvider.childContextTypes = {
app: React.PropTypes.object
}
MyProvider.propTypes = {
app: React.PropTypes.object,
store: React.PropTypes.object
}
ç§ã®èŠè§£ã§ã¯ãå®éã«ã¯èªã¿ããããå£ãã«ããã§ãã
ãããã£ãŠãå
šäœãšããŠãããªãã®ã¢ãããŒãã¯å®å
šã«çã«ããªã£ãŠããŸãã ãã®å Žåã®ã¯ã©ã¹ã®äœ¿çšã¯ãã¢ã¯ã·ã§ã³äœæè
ããã©ã¡ãŒã¿ãŒåããå¿
èŠãããå Žåã«ãæšå¥šããããã¿ãŒã³ã§ããcreateActions(config)
ãããªãã®ãšå®éã«ã¯éãã¯ãããŸããã äœãæªãããšã¯ãããŸããã
ã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ã¯ã·ãªã¢ã«åãéåžžã«ããªãããŒã«ãããããç¶æ ãªããžã§ã¯ããšã¢ã¯ã·ã§ã³ãªããžã§ã¯ãã«ã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ã䜿çšããããšã¯ãå§ãããŸããã ã¬ãã¥ãŒãµãŒã®å Žåãã¬ãã¥ãŒãµãŒæ§æãã€ãŸãä»ã®ã¬ãã¥ãŒãµãŒãåŒã³åºãã¬ãã¥ãŒãµãŒã䜿çšããã®ãé£ãããªããããã¯ã©ã¹ã®äœ¿çšããå§ãããŸããã ãã以å€ã®å Žåã¯ãã¯ã©ã¹ãå«ããã³ãŒãç·šæã®ä»»æã®æ段ã䜿çšã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ãšæ§æãäžå€ã§ããå ŽåïŒãããŠãããããã¹ãã ãšæããŸãããæ©èœçãªã¯ãŒã«ãšã€ãã飲ã¿ãããå¯èœæ§ããããŸãïŒã次ã®ã¢ãããŒããæ€èšã§ããŸãã
const appSelector = createSelector(
(state) => state.config,
(config) => new Application(config)
)
ãããŠãmapStateToPropsã§ïŒ
function mapStateToProps(state) {
return {
app: appSelector(state)
};
};
次ã«ãæ¡çšãããããã€ããŒææ³ã¯å¿ èŠãããŸãããç¶æ ããã¢ããªã±ãŒã·ã§ã³ãªããžã§ã¯ããååŸããã ãã§ãã åéžæã®ãããã§ãã¢ããªã±ãŒã·ã§ã³ãªããžã§ã¯ãã¯ãæ§æãå€æŽããããšãã«ã®ã¿æ§ç¯ãããŸããããã¯ãããã1åã ãã§ãã
ãã®ã¢ãããŒãã«å©ç¹ããããšæãã®ã¯ãã¢ã€ãã¢ãè€æ°ã®ãã®ãããªãªããžã§ã¯ããæã€ããã«ç°¡åã«æ¡åŒµã§ãããããã®ãªããžã§ã¯ããç¶æ ã®ä»ã®éšåã«äŸåãããããšãã§ãããšããããšã§ãã ããšãã°ãæ§æãšç¶æ ã®äžéšã®äž¡æ¹ã«ã¢ã¯ã»ã¹ã§ããlogin / logout / etcã¡ãœãããæã€UserControlã¯ã©ã¹ãäœæã§ããŸãã
ãããã£ãŠãå šäœãšããŠãããªãã®ã¢ãããŒãã¯å®å šã«çã«ããªã£ãŠããŸãã
ïŒ+1ïŒããããšãããããŸãã MyProviderã®æ¹åã«åæããŸãã åŸãããã«ã³ãŒããæŽæ°ããŸãã Reduxãæåã«åŠãã ãšãã«ç§ãæ±ããŠããæ倧ã®åé¡ã®1ã€ã¯ããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãã®ã»ãã³ãã£ãã¯ãªæŠå¿µã§ããã ç§ã«ãšã£ãŠã¯ãããçš®ã®æ°ã¥ãã§ããããããã¯ããã£ã¹ããããããŠããã€ãã³ãã§ãã
@winstonewertã¯createSelectorãreact-nativeã§å©çšã§ããŸããïŒ ããã ãšã¯æããªãã åæã«ãããã³ã³ããŒãã³ãã®mapStateToPropsã«ã¢ã¿ãããããã³ã«ãæ°ããã¢ããªã±ãŒã·ã§ã³ãäœæããŠããããã«èŠããŸããïŒ ç§ã®ç®çã¯ãã¢ããªã±ãŒã·ã§ã³ã«ãã¹ãŠã®ããžãã¹ããžãã¯ãæäŸãããã®ãªããžã§ã¯ãã«ã°ããŒãã«ã«ã¢ã¯ã»ã¹ã§ããããã«ããåäžã®ãªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åããããšã§ãã ããªããææ¡ãããŸããããã©ããã¯ããããŸããã å¿ èŠã«å¿ããŠè¿œå ã®ãªããžã§ã¯ãã䜿çšã§ããããã«ãããšããã¢ã€ãã¢ã¯æ°ã«å ¥ã£ãŠããŸãããæè¡çã«ã¯ãApplicationã€ã³ã¹ã¿ã³ã¹ãä»ããŠå¿ èŠã«å¿ããŠã€ã³ã¹ã¿ã³ã¹åããããšãã§ããŸãã
Reduxãæåã«åŠãã ãšãã«ç§ãæ±ããŠããæ倧ã®åé¡ã®1ã€ã¯ããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãã®ã»ãã³ãã£ãã¯ãªæŠå¿µã§ããã ç§ã«ãšã£ãŠã¯ãããçš®ã®æ°ã¥ãã§ããããããã¯ããã£ã¹ããããããŠããã€ãã³ãã§ãã
Reduxã«ã¯ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®ã»ãã³ãã£ãã¯ãªæŠå¿µã¯ãŸã£ãããããŸããã ã¢ã¯ã·ã§ã³ã®ã»ãã³ãã£ãã¯ãªæŠå¿µããããŸãïŒããã¯ãäœãèµ·ãã£ããã説æããã€ãã³ããšã»ãŒåçã§ãããå®å šã§ã¯ãããŸãããããšãã°ãïŒ351ã®èª¬æãåç §ããŠãã ããïŒã ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯ãã³ãŒããæŽçããããã®åãªããã¿ãŒã³ã§ãã åãã¿ã€ãã®ã¢ã¯ã·ã§ã³ãäžè²«ããæ§é ãæã¡ããã£ã¹ããããããåã«åãå¯äœçšãããããšã確èªãããã®ã§ãã¢ã¯ã·ã§ã³çšã®ãã¡ã¯ããªããããšäŸ¿å©ã§ããããããReduxã®èŠ³ç¹ããã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯ååšããŸããâReduxã¢ã¯ã·ã§ã³ã®ã¿ã衚瀺ãããŸãã
createSelectorã¯react-nativeã§å©çšã§ããŸããïŒ
ããã¯ãäŸåé¢ä¿ã®ãªããã¬ãŒã³ãªJavaScriptã§ãããWebããã€ãã£ãããµãŒããŒãªã©ã§æ©èœããReselectã§äœ¿çšã§ããŸãã
ããã ã¯ããããã£ãã ç©äºã¯ã¯ããã«æ確ã§ãã 也æ¯ã
æè¿ãReduxãmapStateToPropsãšmapDispatchToPropsãããŒãžãããšãã«ãã¹ãããããªããžã§ã¯ãã倱ããããšããåé¡ã«ééããŸããïŒreactjs / react-reduxïŒ324ãåç §ïŒã @gaearonã¯ããã¹ãããããªããžã§ã¯ãã䜿çšã§ããããã«ãããœãªã¥ãŒã·ã§ã³ãæäŸããŸãããããã¯ã¢ã³ããã¿ãŒã³ã§ãããšåœŒã¯ç¶ããŸãã
ãã®ããã«ãªããžã§ã¯ããã°ã«ãŒãåãããšãäžèŠãªå²ãåœãŠãçºçããçµæã®å°éå ·ãå€æŽããããã©ãããå€æããæ¹æ³ãšããŠçµæã®å°éå ·ã®æµ ãåçæ§ã«äŸåã§ããªããªããããããã©ãŒãã³ã¹ã®æé©åãé£ãããªãããšã«æ³šæããŠãã ããã ãã®ãããããã¥ã¡ã³ãã§æšå¥šãããŠããåå空éã®ãªãåçŽãªã¢ãããŒããããå€ãã®ã¬ã³ããªã³ã°ã衚瀺ãããŸãã
@bvaughnã¯èšã£ã
ã¬ãã¥ãŒãµãŒã¯æãã§ã·ã³ãã«ã§ãªããã°ãªããŸãã
ãããŠãã»ãšãã©ã®ããžãã¹ããžãã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«çµã¿èŸŒãå¿ èŠããããŸããç§ã¯ããã«å®å šã«åæããŸãã ãããããã¹ãŠãã¢ã¯ã·ã§ã³ã«ç§»è¡ããå Žåã§ãããªãã¬ãã¥ãŒãµãŒãã¡ã€ã«ãšé¢æ°ãæåã§äœæããå¿ èŠãããã®ã§ããããã ã¢ã¯ã·ã§ã³ã§æäœããããŒã¿ãçŽæ¥ä¿åããŠã¿ãŸãããïŒ
ããã¯ç§ããã°ããæ··ä¹±ãããŸãã...
ã¬ãã¥ãŒãµãŒãã¡ã€ã«ãšé¢æ°ãæåã§äœæããå¿ èŠãããã®ã¯ãªãã§ããïŒ
ã¬ãã¥ãŒãµãŒã¯çŽç²é¢æ°ã§ãããããç¶æ æŽæ°ããžãã¯ã«ãšã©ãŒãããå Žåã¯ãã¬ãã¥ãŒãµãŒãããããªããŒãã§ããŸãã ãã®åŸãéçºããŒã«ã¯ã¢ããªãåæç¶æ ã«å·»ãæ»ããæ°ããã¬ãã¥ãŒãµãŒã䜿çšããŠãã¹ãŠã®ã¢ã¯ã·ã§ã³ãåçã§ããŸãã ããã¯ãæåã§ããŒã«ããã¯ããŠã¢ã¯ã·ã§ã³ãåå®è¡ããããšãªããç¶æ æŽæ°ã®ãã°ãä¿®æ£ã§ããããšãæå³ããŸãã ããã¯ãç¶æ æŽæ°ããžãã¯ã®å€§éšåãã¬ãã¥ãŒãµãŒã«ä¿æããããšã®å©ç¹ã§ãã
ããã¯ãç¶æ æŽæ°ããžãã¯ã®å€§éšåãã¬ãã¥ãŒãµãŒã«ä¿æããããšã®å©ç¹ã§ãã
@dtinthæ確ã«ããããã«ããç¶æ æŽæ°ããžãã¯ããšã¯ãããžãã¹ããžãã¯ããæå³ããŸããïŒ
ããªãã®ããžãã¯ã®ã»ãšãã©ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«å
¥ããã®ãè¯ãèããã©ããã¯ããããŸããã ãã¹ãŠã®ã¬ãã¥ãŒãµãŒãADD_X
ãããªã¢ã¯ã·ã§ã³ãåãå
¥ããäºçŽ°ãªé¢æ°ã§ããå Žåããšã©ãŒãçºçããå¯èœæ§ã¯ã»ãšãã©ãããŸããã ãããããã®åŸããã¹ãŠã®ãšã©ãŒãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«ããã·ã¥ããã @ dtinthãã»ã®ããããŠããåªãããããã°ãšã¯ã¹ããªãšã³ã¹ã
ãããã @ tommikaikkonenãè¿°ã¹ãããã«ãè€éãªã¬ãã¥ãŒãµãŒãæžãã®ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã ç§ã®çŽæã¯ãReduxã®ã¡ãªããã享åãããå Žåã¯ãããã·ã¥ãããå Žæã§ãããã以å€ã®å Žåã¯ãå¯äœçšããšããžã«ããã·ã¥ãã代ããã«ãçŽç²é¢æ°ãããã·ã¥ããŠãæãäºçŽ°ãªã¿ã¹ã¯ã®ã¿ãåŠçããã»ãšãã©ãæ®ããŸããç¶æ ã«æºã¡ãå°çã§ããªãã®ã¢ããªã®ã :)
@sompylasar ãããžãã¹ããžãã¯ããšãç¶æ æŽæ°ããžãã¯ãã¯ã
ãã ããç§èªèº«ã®å®è£ ã®è©³çŽ°ãç解ããããã«ãç§ã®ã¢ã¯ã·ã§ã³ã¯äž»ã«ã¢ã¯ã·ã§ã³ãžã®å ¥åã®ã«ãã¯ã¢ããã§ãã å®éããã¹ãŠã®ãããžãã¹ããžãã¯ããã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã«ç§»åããããããã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯çŽç²ã§ãã
äŸãšããŠ..ããã¯ç§ã®å žåçãªã¬ãã¥ãŒãµãŒã§ã
export default function reducer(state = initialState, action = {}) {
switch (action.type) {
case 'FOO_REQUEST':
case 'FOO_RESPONSE':
case 'FOO_ERROR':
case 'FOO_RESET':
return {
...state,
...action.data
};
default:
return state;
}
}
ç§ã®å žåçãªè¡åïŒ
export function fooRequest( res ) {
return {
type: 'FOO_REQUEST',
data: {
isFooing: true,
toFoo: res.saidToFoo
}
};
}
export function fooResponse( res ) {
return {
type: 'FOO_RESPONSE',
data: {
isFooing: false,
isFooed: true,
fooData: res.data
}
};
}
export function fooError( res ) {
return {
type: 'FOO_ERROR',
data: {
isFooing: false,
fooData: null,
isFooed: false,
fooError: res.error
}
};
}
export function fooReset( res ) {
return {
type: 'FOO_RESET',
data: {
isFooing: false,
fooData: null,
isFooed: false,
fooError: null,
toFoo: true
}
};
}
ç§ã®ããžãã¹ããžãã¯ã¯ãã³ã³ããã¹ãã«æ ŒçŽãããŠãããªããžã§ã¯ãã§å®çŸ©ãããŠããŸãã
export default class FooBar
{
constructor(store)
{
this.actions = bindActionCreators({
...fooActions
}, store.dispatch);
}
async getFooData()
{
this.actions.fooRequest({
saidToFoo: true
});
fetch(url)
.then((response) => {
this.actions.fooResponse(response);
})
}
}
äžèšã®ã³ã¡ã³ããã芧ã«ãªããšãç§ãæåã®ã¢ãããŒãã«èŠåŽããŠããŸãããæçµçã«ãã¹ãã¢ãã¢ããªã±ãŒã·ã§ã³ãªããžã§ã¯ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããã®äžå¿ç¹ã§ãã¹ãŠã®ã¢ã¯ã·ã§ã³ããã£ã¹ãããã£ãŒã«æ¥ç¶ããããšã§ããªãã¡ã¯ã¿ãªã³ã°ãšè§£æ±ºãè¡ããŸããã ç§ã®ã¢ããªã±ãŒã·ã§ã³ãç¥ã£ãŠãããã¹ãŠã®ã¢ã¯ã·ã§ã³ãããã«å²ãåœãŠãããŸãã
mapDispatchToPropsïŒïŒãã©ãã§ã䜿çšããªããªããŸããã Reduxã®å Žåãæ¥ç¶ãããã³ã³ããŒãã³ããäœæãããšãã«mapStateToPropsã®ã¿ã䜿çšããããã«ãªããŸããã ã¢ã¯ã·ã§ã³ãããªã¬ãŒããå¿ èŠãããå Žåã¯ãã³ã³ããã¹ããä»ããŠã¢ããªã±ãŒã·ã§ã³ãªããžã§ã¯ãããã¢ã¯ã·ã§ã³ãããªã¬ãŒã§ããŸãã
class SomeComponent extends React.Component {
componentWillReceiveProps(nextProps) {
if (nextProps.someFoo != this.props.someFoo) {
const { app } = this.context;
app.actions.getFooData();
}
}
}
SomeComponent.contextTypes = {
app: React.PropTypes.object
};
äžèšã®ã³ã³ããŒãã³ãã¯ãreduxæ¥ç¶ããå¿ èŠã¯ãããŸããã ããã§ãã¢ã¯ã·ã§ã³ããã£ã¹ãããã§ããŸãã ãã¡ãããã³ã³ããŒãã³ãå ã®ç¶æ ãæŽæ°ããå¿ èŠãããå Žåã¯ãæ¥ç¶ãããã³ã³ããŒãã³ãã«å€æããŠãç¶æ ã®å€æŽã確å®ã«äŒéãããããã«ããŸãã
ãããç§ã®ã³ã¢ãããžãã¹ããžãã¯ããæŽçããæ¹æ³ã§ãã ç§ã®ç¶æ ã¯ããã¯ãšã³ããµãŒããŒã§å®éã«ç¶æãããŠããã®ã§ãããã¯ç§ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯éåžžã«ããŸãæ©èœããŸãã
ãããžãã¹ããžãã¯ããã©ãã«ä¿åãããã¯ãå®éã«ã¯ããªã次第ã§ããããããã©ã®ããã«ãŠãŒã¹ã±ãŒã¹ã«é©åãããã¯ããªã次第ã§ãã
@jayesbe次ã®éšåã¯ãã¬ãã¥ãŒãµãŒã«ãããžãã¹ããžãã¯ãããªãããšãæå³ããŸããããã«ãç¶æ æ§é ã¯ãã¬ãã¥ãŒãµãŒãä»ããŠã¹ãã¢ã«è»¢éããããã€ããŒããäœæããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«ç§»åããŸããã
case 'FOO_REQUEST':
case 'FOO_RESPONSE':
case 'FOO_ERROR':
case 'FOO_RESET':
return {
...state,
...action.data
};
export function fooRequest( res ) {
return {
type: 'FOO_REQUEST',
data: {
isFooing: true,
toFoo: res.saidToFoo
}
};
}
@jayesbeç§ã®ã¢ã¯ã·ã§ã³ãšã¬ãã¥ãŒãµãŒã¯ããªãã®ãã®ãšéåžžã«äŒŒãŠãããäžéšã®ã¢ã¯ã·ã§ã³ã¯åŒæ°ãšããŠãã¬ãŒã³ãããã¯ãŒã¯å¿çãªããžã§ã¯ããåãåããŸããå¿çããŒã¿ãã¢ã¯ã·ã§ã³ã«åŠçããæåŸã«éåžžã«åçŽãªãªããžã§ã¯ããæ»ãå€ãšããŠè¿ããã«æž¡ãæ¹æ³ã®ããžãã¯ãã«ãã»ã«åããŸãããåŒã³åºãdispatchïŒïŒãä»ããã¬ãã¥ãŒãµãŒã ããªããããã®ãšåãããã«ã åé¡ã¯ãã¢ã¯ã·ã§ã³ããã®ããã«èšè¿°ãããŠããŠãã¢ã¯ã·ã§ã³ãã»ãŒãã¹ãŠãå®è¡ããã¬ãã¥ãŒãµãŒã®è²¬ä»»ãéåžžã«è»œãå Žåãã¬ãã¥ãŒãµãŒãã¢ã¯ã·ã§ã³ãªããžã§ã¯ããåçŽã«æ¡æ£ããã ãã®å ŽåãããŒã¿ã転éããŠæåã§ä¿åããå¿ èŠãããã®ã¯ãªãã§ããïŒ Reduxã¯ãããèªåçã«æäžããã®ã¯é£ããããšã§ã¯ãããŸããã
å¿
ãããã ããããå€ãã®å Žåãããžãã¹ããã»ã¹ã®äžéšã§ã
ããžãã¹ã«ãŒã«ã«åŸã£ãŠã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ãæŽæ°ããå¿
èŠããããŸãã
ãããã£ãŠãããã«ããžãã¹ããžãã¯ãé
眮ããå¿
èŠããããããããŸããã
極端ãªå Žåã¯ãããã確èªããŠãã ããã
ãåæRTSãšã³ãžã³ãšéåæã®ç©èªã@ForrestTheWoods
https://blog.forrestthewoods.com/synchronous-rts-engines-and-a-tale-of-desyncs-9d8c3e48b2be
2016幎4æ5æ¥ååŸ5æ54åããJohnBabakã [email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
ããã¯ãç¶æ æŽæ°ããžãã¯ã®å€§éšåã
ã¬ãã¥ãŒãµãŒã@dtinth https://github.com/dtinthæ確ã«ããããã«ã
ãç¶æ æŽæ°ããžãã¯ããšã¯ãããžãã¹ããžãã¯ãã®ããšã§ããïŒâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/reactjs/redux/issues/1171#issuecomment -205754910
@LumiaSakiè€éãªããžãã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«ç¶æããªãããã¬ãã¥ãŒãµãŒãã·ã³ãã«ã«ä¿ã€ãšããã¢ããã€ã¹ã¯ãReduxã䜿çšããããã®æšå¥šãããæ¹æ³ã«åããŸãã Reduxã®æšå¥šãã¿ãŒã³ã¯éã§ããã¬ãã¥ãŒãµãŒã§è€éãªããžãã¯ãç¶æããªãããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãã·ã³ãã«ã«ä¿ã¡ãŸãã ãã¡ããããšã«ãããã¹ãŠã®ããžãã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«èªç±ã«é 眮ã§ããŸãããããããããšã§ãReduxã䜿çšããŠããå Žåã§ããReduxãã©ãã€ã ã«åŸããªããªããŸãã
ãã®ãããReduxã¯ã¢ã¯ã·ã§ã³ããã¹ãã¢ã«ããŒã¿ãèªåçã«è»¢éããŸããã ããã¯ããªããReduxã䜿ãããšã«ãªã£ãŠããæ¹æ³ã§ã¯ãªãããã§ãã Reduxã¯ãæå³ãã以å€ã®æ¹æ³ã§ã®äœ¿çšã容æã«ããããã«å€æŽãããããšã¯ãããŸããã ãã¡ãããããªãã¯ããªãã®ããã«åãããšã絶察ã«èªç±ã«è¡ãããšãã§ããŸãããReduxãããã®ããã«å€ããããšãæåŸ ããªãã§ãã ããã
ãã®äŸ¡å€ã®ããã«ãç§ã¯æ¬¡ã®ãããªãã®ã䜿çšããŠã¬ãã¥ãŒãµãŒãäœæããŸãã
let {reducer, actions} = defineActions({
fooRequest: (state, res) => ({...state, isFooing: true, toFoo: res.saidToFoo}),
fooResponse: (state, res) => ({...state, isFooing: false, isFooed: true, fooData: res.data}),
fooError: (state, res) => ({...state, isFooing: false, fooData: null, isFooed: false, fooError: res.error})
fooReset: (state, res) => ({...state, isFooing: false, fooData: null, isFooed: false, fooError: null, toFoo: false})
})
defineActionsã¯ãã¬ãã¥ãŒãµãŒãšã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®äž¡æ¹ãè¿ããŸãã ãã®ããã«ããŠãäºçŽ°ãªã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®äœæã«å€ãã®æéãè²»ããå¿ èŠããªããæŽæ°ããžãã¯ãã¬ãã¥ãŒãµãŒå ã«ä¿æããã®ãéåžžã«ç°¡åã§ããããšãããããŸãã
ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã§ããžãã¯ãç¶æããããšã䞻匵ããå Žåã¯ãããŒã¿ãèªåã§èªååããããšã«åé¡ã¯ãããŸããã ããªãã®ã¬ãã¥ãŒãµãŒã¯é¢æ°ã§ãããããã¯ãããæãããšãäœã§ãããããšãã§ããŸãã ãããã£ãŠãã¬ãã¥ãŒãµãŒã¯æ¬¡ã®ããã«åçŽã«ããããšãã§ããŸãã
function reducer(state, action) {
if (action.data) {
return {...state, ...action.data}
} else {
return state;
}
}
ããžãã¹ããžãã¯ã«é¢ãããããŸã§ã®ãã€ã³ããæ¡åŒµãããšãããžãã¹ããžãã¯ã次ã®2ã€ã®éšåã«åããããšãã§ãããšæããŸãã
ãŠãŒã¶ãŒãå®è¡ãã¿ã³ãã¯ãªãã¯ã§ããã¢ããªãã³ã³ãã€ã«ããŠå®è¡ããIDEã®ãããªãœãããŠã§ã¢ã«ã€ããŠèããŠã¿ãŸãã ïŒããã§ã¯ãã¹ãã¢ãååŸããéåæé¢æ°ã䜿çšããŠããŸããã代ããã«redux-thunk
䜿çšã§ããŸããïŒ
js
export async function runApp (store) {
try {
store.dispatch({ type: 'startCompiling' })
const compiledApp = await compile(store)
store.dispatch({ type: 'startRunning', app: compiledApp })
} catch (e) {
store.dispatch({ type: 'errorCompiling', error: e })
}
}
`` `js
'updeep'ããuãã€ã³ããŒãããŸã
export const reducer = createReducerïŒ{
// [ã¢ã¯ã·ã§ã³å]ïŒaction => currentState => nextState
startCompilingïŒïŒïŒ=> uïŒ{ã³ã³ãã€ã«ïŒtrue}ïŒã
errorCompilingïŒïŒ{ãšã©ãŒ}ïŒ=> uïŒ{ã³ã³ãã€ã«ïŒfalseãcompileErrorïŒãšã©ãŒ}ïŒã
startRunningïŒïŒ{app}ïŒ=> uïŒ{
å®è¡äžïŒïŒïŒ=>ã¢ããªã
ã³ã³ãã€ã«ïŒfalse
}ïŒã
stopRunningïŒïŒïŒ=> uïŒ{runningïŒfalse}ïŒã
destroyCompileErrorïŒïŒïŒ=> uïŒ{compileErrorïŒnull}ïŒã
//..ã
}ïŒ
`` `
ç§ã¯ããã®æ±ºå®è«çãªåå°ã«ã§ããã ãå€ãã®ã³ãŒããå ¥ããããã«ããŠããŸãããã¬ãã¥ãŒãµãŒã®å¯äžã®è²¬ä»»ã¯ãå ¥ã£ãŠããã¢ã¯ã·ã§ã³ãèæ ®ããŠãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãäžå®ã«ä¿ã€ããšã§ããããšã念é ã«çœ®ããŠããŸãã ãã以äžäœããªãã Reduxã¯åãªãç¶æ ã³ã³ãããªã®ã§ããã以å€ã¯Reduxã®å€ã§è¡ããŸãã
@dtinthãã°ããããhttpsïŒ //github.com/reactjs/redux/issues/1171#issuecomment-205782740ã®åã®äŸã¯ã ã issues / 1171ïŒissuecomment -205888533-ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã§ç¶æ ã®äžéšãæ§ç¯ããããããã¬ãã¥ãŒãµãŒã«æž¡ããŠæŽæ°ãæ¡æ£ããããšãææ¡ããŸãïŒãã®ã¢ãããŒãã¯ç§ã«ã¯ééã£ãŠããããã«èŠããŸãããããŠç§ã¯ã§ææãããåãããšã«åæããŸãhttps://github.com/reactjs/redux/issues/1171#issuecomment-205865840ïŒã
@winstonewert
Reduxã®æšå¥šãã¿ãŒã³ã¯éã§ããã¬ãã¥ãŒãµãŒã§è€éãªããžãã¯ãç¶æããªãããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãã·ã³ãã«ã«ä¿ã¡ãŸãã
ã©ãããã°ã«ãŒãã¥ãŒãµãŒã«è€éãªããžãã¯ãé 眮ããããã§ãããããçŽç²ã«ä¿ã€ããšãã§ããŸããïŒ
ããšãã°ãfetchïŒïŒãåŒã³åºããŠãµãŒããŒããããŒã¿ãããŒãããŠããå Žåã¯ãäœããã®æ¹æ³ã§åŠçããŸãã ãè€éãªããžãã¯ããåããã¬ãã¥ãŒãµãŒã®äŸã¯ãŸã èŠãŠããŸãã
@jayesbe ïŒãããš...ãè€éããšãçŽç²ãã¯çŽäº€ããŠããŸãã ã¬ãã¥ãŒãµãŒå ã§_æ¬åœã«_è€éãªæ¡ä»¶ä»ãããžãã¯ãŸãã¯æäœãè¡ãããšãã§ãããããå¯äœçšã®ãªãå ¥åã®é¢æ°ã§ããéããããã§ãçŽç²ã§ãã
è€éãªããŒã«ã«ç¶æ ïŒæçš¿ãšãã£ã¿ãŒãããªãŒãã¥ãŒãªã©ïŒãããå ŽåããŸãã¯æ¥œèŠ³çãªæŽæ°ãªã©ãåŠçããå Žåãã¬ãã¥ãŒãµãŒã«ã¯è€éãªããžãã¯ãå«ãŸããŸãã ããã¯æ¬åœã«ã¢ããªã«äŸåããŸãã è€éãªãªã¯ãšã¹ãããããã®ãããã°ãè€éãªç¶æ æŽæ°ããããã®ããããŸãã ããã€ãã¯äž¡æ¹ãæã£ãŠããŸã:-)
@markerikson okããžãã¯ã¹ããŒãã¡ã³ãã¯1ã€ã§ãããç¹å®ã®ã¿ã¹ã¯ãå®è¡ããŸããïŒ ããšãã°ã1ã€ã®ã¢ã¯ã·ã§ã³ããããããå Žåã«ã¯ä»ã®3ã€ã®ã¢ã¯ã·ã§ã³ãããªã¬ãŒããããå¥ã®å Žåã«ã¯2ã€ã®å¥åã®ã¢ã¯ã·ã§ã³ãããªã¬ãŒããŸãã ãã®ããžãã¯+ã¿ã¹ã¯ã®å®è¡ã¯ãã¬ãã¥ãŒãµãŒã§å®è¡ããå¿ èŠãããããã«ã¯èãããŸããã
ç§ã®ç¶æ ããŒã¿/ã¢ãã«ç¶æ ã¯ãµãŒããŒäžã«ããããã¥ãŒç¶æ ã¯ããŒã¿ã¢ãã«ãšã¯ç°ãªããŸããããã®ç¶æ ã®ç®¡çã¯ã¯ã©ã€ã¢ã³ãäžã«ãããŸãã ç§ã®ããŒã¿ã¢ãã«ã®ç¶æ ã¯åã«ãã¥ãŒã«æž¡ãããŸãããããç§ã®ã¬ãã¥ãŒãµãŒãšã¢ã¯ã·ã§ã³ãéåžžã«ã¹ãªã ã«ããŠããçç±ã§ãã
@jayesbe ïŒä»ã®ã¢ã¯ã·ã§ã³ã®ããªã¬ãŒã¯ã¬ãã¥ãŒãµãŒã§è¡ãã¹ãã ãšèª°ãèšã£ãããšããªããšæããŸãã ãããŠå®éããããã¹ãã§ã¯ãããŸããã ã¬ãã¥ãŒãµãŒã®ä»äºã¯åã«(currentState + action) -> newState
ã§ãã
è€æ°ã®ã¢ã¯ã·ã§ã³ãçµã³ä»ããå¿ èŠãããå Žåã¯ããµã³ã¯ããµã¬ã®ãããªãã®ã§ãããå®è¡ããŠé çªã«èµ·åããããç¶æ ã®å€åããªãã¹ã³ããããããã«ãŠã§ã¢ã䜿çšããŠã¢ã¯ã·ã§ã³ãã€ã³ã¿ãŒã»ããããŠè¿œå ã®äœæ¥ãè¡ããŸãã
æ£çŽãªãšãããçŸæç¹ã§ã®è°è«ã¯å°ãæ··ä¹±ããŠããŸãã
@markeriksonãããã¯ã¯ããããžãã¹ããžãã¯ããšãã®
ãæ°ã¥ãã®ããã«ãæ¬åœã«éèŠãªã®ã¯ããªãã®ããã«åããã®ã§ãã ãããããããç§ãããªããå°ããåé¡ã«åãçµãæ¹æ³ã§ãã
ããšãã°ãfetchïŒïŒãåŒã³åºããŠãµãŒããŒããããŒã¿ãããŒãããŠããå Žåã¯ãäœããã®æ¹æ³ã§åŠçããŸãã ãè€éãªããžãã¯ããåããã¬ãã¥ãŒãµãŒã®äŸã¯ãŸã èŠãŠããŸãã
ã¬ãã¥ãŒãµãŒã¯ãµãŒããŒããçã®å¿çãåãåããããã§ç¶æ ãæŽæ°ããŸãã ããããã°ãããªãã話ããŠããåŠçå¿çã¯ç§ã®ã¬ãã¥ãŒãµãŒã§è¡ãããŸãã ããšãã°ããªã¯ãšã¹ãããµãŒããŒã®JSONã¬ã³ãŒãããã§ããããå ŽåããããŸããããã¯ãã¬ãã¥ãŒãµãŒãããŒã«ã«ã¬ã³ãŒããã£ãã·ã¥ã«ä¿æããŸãã
kåã®è«çã¹ããŒãã¡ã³ãã¯1ã€ã§ãããç¹å®ã®ã¿ã¹ã¯ãå®è¡ããŸããïŒ ããšãã°ã1ã€ã®ã¢ã¯ã·ã§ã³ããããããå Žåã«ã¯ä»ã®3ã€ã®ã¢ã¯ã·ã§ã³ãããªã¬ãŒããããå¥ã®å Žåã«ã¯2ã€ã®å¥åã®ã¢ã¯ã·ã§ã³ãããªã¬ãŒããŸãã ãã®ããžãã¯+ã¿ã¹ã¯ã®å®è¡ã¯ãã¬ãã¥ãŒãµãŒã§å®è¡ããå¿ èŠãããããã«ã¯èãããŸããã
ããã¯ããªããããŠããããšã«äŸåããŸãã æããã«ããµãŒããŒãã§ããã®å Žåã1ã€ã®ã¢ã¯ã·ã§ã³ãå¥ã®ã¢ã¯ã·ã§ã³ãããªã¬ãŒããŸãã ããã¯ãæšå¥šãããReduxã®æé ã®ç¯å²å ã§ãã ãã ãã次ã®ãããªããšãããŠããå¯èœæ§ããããŸãã
function createFoobar(dispatch, state, updateRegistry) {
dispatch(createFoobarRecord());
if (updateRegistry) {
dispatch(updateFoobarRegistry());
} else {
dispatch(makeFoobarUnregistered());
}
if (hasFoobarTemps(state)) {
dispatch(dismissFoobarTemps());
}
}
ããã¯ãReduxã䜿çšããããã®æšå¥šãããæ¹æ³ã§ã¯ãããŸããã æšå¥šãããReduxã®æ¹æ³ã¯ããããã®å¿ èŠãªå€æŽããã¹ãŠåŒãèµ·ããåäžã®CREATE_FOOBARã¢ã¯ã·ã§ã³ã䜿çšããããšã§ãã
@winstonewert ïŒ
ããã¯ãReduxã䜿çšããããã®æšå¥šãããæ¹æ³ã§ã¯ãããŸããã æšå¥šãããReduxã®æ¹æ³ã¯ããããã®å¿ èŠãªå€æŽããã¹ãŠåŒãèµ·ããåäžã®CREATE_FOOBARã¢ã¯ã·ã§ã³ã䜿çšããããšã§ãã
æå®ãããå Žæãžã®ãã€ã³ã¿ããããŸããïŒ ãããã質åã®ããŒãžã調ã¹ãŠãããšãã«æãã€ããã®ã¯ããã³ããçŽæ¥ã®ãç¶æ³æ¬¡ç¬¬ãã ã£ãããã§ãã http://redux.js.org/docs/FAQ.html#actions -multiple-actionsãšãSOã«é¢ããDanã«ãããã®åçãåç §ããŠãã ããã
ãããžãã¹ããžãã¯ãã¯å®éã«ã¯ããªãåºãçšèªã§ãã ãäœããèµ·ãã£ãã®ãããããããèµ·ãã£ãä»ãç§ãã¡ã¯äœãããŠããã®ããããããã¯æå¹ã§ããïŒããªã©ã®å 容ãã«ããŒã§ããŸãã Reduxã®èšèšã«åºã¥ããŠããããã®è³ªåã¯ç¶æ³ã«å¿ããŠããŸããŸãªå Žæã§åçã§ããŸããããããã¯èµ·ãã£ãã®ãããšããã®ã¯ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®è²¬ä»»ã§ããããä»äœãèµ·ãã£ãã®ããã¯ã»ãŒééããªãåæžè ã®è²¬ä»»ã§ãã
å šäœãšããŠããããžãã¹ããžãã¯ãã®ãã®_å šäœã®è³ªå_ã«å¯Ÿããç§ã®èŠè§£ã¯æ¬¡ã®ãšããã§ãã_ ã«äŸåããŸããã ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã§ãªã¯ãšã¹ãã®è§£æãå®è¡ããçç±ãšãã¬ãã¥ãŒãµãŒã§èŠæ±ã®è§£æãå®è¡ããçç±ããããŸãã ã¬ãã¥ãŒãµãŒãåã«ããã®ãªããžã§ã¯ããååŸããŠç§ã®ç¶æ ã«å©ã蟌ããå Žåãããã°ãã¬ãã¥ãŒãµãŒãéåžžã«è€éãªæ¡ä»¶ä»ãããžãã¯ã§ããå ŽåããããŸãã ã¢ã¯ã·ã§ã³ã®äœæè ãéåžžã«åçŽãªå Žåãããã°ãè€éãªå ŽåããããŸãã ããã»ã¹ã®ã¹ããããè¡šãããã«è€æ°ã®ã¢ã¯ã·ã§ã³ãé£ç¶ããŠãã£ã¹ãããããããšãçã«ããªã£ãŠããå Žåãããã°ããã¹ãŠãè¡šãããã«äžè¬çãªãTHING_HAPPENEDãã¢ã¯ã·ã§ã³ã®ã¿ããã£ã¹ããããããå ŽåããããŸãã
ç§ãåæããå¯äžã®å³æ Œãªã«ãŒã«ã«ã€ããŠã¯ããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®é決å®è«ãã¬ãã¥ãŒãµãŒã®çŽç²ãªæ±ºå®è«ãã§ãã ããã¯åœç¶ã®ããšã§ãã
ãã以å€ïŒ ããªãã®ããã«åãäœããèŠã€ããŠãã ããã äžè²«æ§ãä¿ã€ã ãªãããªãããããç¹å®ã®æ¹æ³ã§ãã£ãŠããã®ããç¥ã£ãŠãã ããã ãããšäžç·ã«è¡ããªããã
ãããã¯èµ·ãã£ãã®ãããšããã®ã¯ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®è²¬ä»»ã§ããããä»äœãèµ·ãã£ãã®ããã¯ã»ãŒééããªãåæžè ã®è²¬ä»»ã ãšæããŸããã
ãã®ãããå¯äœçšãã€ãŸããä»äœããã®çŽç²ã§ãªãéšåãã¬ãã¥ãŒãµãŒã«å ¥ããæ¹æ³ã«ã€ããŠäžŠè¡ããŠè°è«ããããŸããïŒ1528ãããŠã次ã«ãã£ã¹ãããããã¢ã¯ã·ã§ã³ã®ããã«ãäœãèµ·ããã¹ãããçŽç²ã«èª¬æããã ãã§ãã
ç§ã䜿çšããŠãããã¿ãŒã³ã¯æ¬¡ã®ãšããã§ãã
ãã®ã¹ã¬ããã®ååããããã³ã®å£°æã¯æ¬¡ã®ãšããã§ããã
ãããã£ãŠãç§ãã¡ã®å ¬åŒã®æšå¥šäºé ã¯ãæåã«ç°ãªãã¬ãã¥ãŒãµãŒãåãã¢ã¯ã·ã§ã³ã«å¿çããããã«ããããšã§ãã ãããåä»ã«ãªã£ãå Žåã¯ã確ãã«ãå¥ã ã®ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãäœæããŠãã ããã ãããããã®ã¢ãããŒãããå§ããªãã§ãã ããã
ãã®ããšãããæšå¥šãããã¢ãããŒãã¯ãã€ãã³ãããšã«1ã€ã®ã¢ã¯ã·ã§ã³ããã£ã¹ãããããããšã§ãããšæããŸãã ããããå®éçã«ã¯ãããŸãããããšãããŠãã ããã
@winstonewert ïŒDanã¯ããã¬ãã¥ãŒãµãŒæ§æããã¿ãŒã³ãåç §ããŠããŸããã€ãŸããã1ã€ã®ã¬ãã¥ãŒãµãŒã ããèããã¢ã¯ã·ã§ã³ã§ãããšãå€ãã®ã¬ãã¥ãŒãµãŒã¯åãã¢ã¯ã·ã§ã³ã«å¿çã§ããŸããã§ãã ãã³ã¯ãåäžã®ã¢ã¯ã·ã§ã³ã«å¿çããä»»æã®ã¬ãã¥ãŒãµãŒã«éåžžã«å€§ããªé¢å¿ãæã£ãŠããŸãã ä»ã®äººã¯ãã¬ãã¥ãŒãµãŒãšã¢ã¯ã·ã§ã³ãéåžžã«ç·å¯ã«ãã³ãã«ããã1ã€ã®ã¬ãã¥ãŒãµãŒã ããç¹å®ã®ã¢ã¯ã·ã§ã³ãåŠçãããã¢ãã«ãã¢ãããŒãã®ãããªãã®ã奜ã¿ãŸãã ãããã£ãŠããã®äŸã¯ãè€æ°ã®ã¢ã¯ã·ã§ã³ãé çªã«ãã£ã¹ããããããããšã§ã¯ãªãããã¬ãã¥ãŒãµãŒæ§é ã®ããã€ã®éšåãããã«å¿çããããšãæåŸ ããŠãããããšããããšã§ãã
ããããå®éçã«ã¯ãããŸãããããšãããŠãã ããã
ïŒ+1ïŒ
@sompylasarã¢ã¯ã·ã§ã³ã«ç¶æ æ§é ããããšãèªåã®ããæ¹ã®ãšã©ãŒãããããŸãã ç¶æ æ§é ãã¬ãã¥ãŒãµãŒã«ç°¡åã«ã·ããããŠãã¢ã¯ã·ã§ã³ãåçŽåã§ããŸãã 也æ¯ã
åãããšã ãšç§ã«ã¯æããŸãã
è€æ°ã®ã¬ãã¥ãŒãµãŒãããªã¬ãŒããŠè€æ°ã®ç¶æ å€åãåŒãèµ·ããåäžã®ã¢ã¯ã·ã§ã³ããããããããããåäžã®ã¬ãã¥ãŒãµãŒãããªã¬ãŒããŠåäžã®ç¶æ å€åãåŒãèµ·ããè€æ°ã®ã¢ã¯ã·ã§ã³ããããŸãã è€æ°ã®ã¬ãã¥ãŒãµãŒãã¢ã¯ã·ã§ã³ã«å¿çããã€ãã³ããè€æ°ã®ã¢ã¯ã·ã§ã³ããã£ã¹ãããããããšã¯ãåãåé¡ã®ä»£æ¿ãœãªã¥ãŒã·ã§ã³ã§ãã
ããªããèšåããStackOverflowã®è³ªåã§ã圌ã¯æ¬¡ã®ããã«è¿°ã¹ãŠããŸãã
ã¢ã¯ã·ã§ã³ãã°ã¯ããŠãŒã¶ãŒã®æäœã®å±¥æŽã«ã§ããã ãè¿ã¥ããŠãã ããã ãã ããã¬ãã¥ãŒãµãŒã®å®è£ ãé£ããå Žåã¯ãããã€ãã®ã¢ã¯ã·ã§ã³ãããã€ãã«åå²ããããšãæ€èšããŠãã ãããUIã®æŽæ°ããããŸããŸäžç·ã«ãªã£ãŠãã2ã€ã®å¥ã ã®æäœãšèããããå Žåã
ç§ãèŠãŠããããã«ãDanã¯ãçæ³çãªæ¹æ³ãšããŠããŠãŒã¶ãŒã®æäœããšã«1ã€ã®ã¢ã¯ã·ã§ã³ãç¶æããããšãæšå¥šããŠããŸãã ãããã圌ã¯å®çšçã§ããããããã¬ãã¥ãŒãµãŒã®å®è£ ãé£ãããããšãã圌ã¯ã¢ã¯ã·ã§ã³ã®åå²ãæ¯æããŸãã
ããã§ã¯ã䌌ãŠãããå€å°ç°ãªããŠãŒã¹ã±ãŒã¹ãããã€ãèŠèŠåããŠããŸãã
1ïŒã¢ã¯ã·ã§ã³ã§ã¯ãç¹ã«combineReducers
ã䜿çšããŠåãµããã¡ã€ã³ãåŠçããåå¥ã®ã¬ãã¥ãŒãµãŒé¢æ°ã䜿çšããŠããå Žåã¯ãç¶æ
ã®è€æ°ã®é åãæŽæ°ããå¿
èŠããããŸãã ããªãã¯ïŒ
2ïŒç¹å®ã®é åºã§çºçããäžé£ã®ã¹ãããããããåã¹ãããã«ã¯ç¶æ ã®æŽæ°ãŸãã¯ããã«ãŠã§ã¢ã®ã¢ã¯ã·ã§ã³ãå¿ èŠã§ãã ããªãã¯ïŒ
ããã§ããã確ãã«ããã€ãã®éè€ããããŸãããããã§ã®ã¡ã³ã¿ã«ã€ã¡ãŒãžã®éãã®äžéšã¯ããŸããŸãªãŠãŒã¹ã±ãŒã¹ã ãšæããŸãã
@markeriksonã€ãŸããããªãã®ã¢ããã€ã¹ã¯ãééããç¶æ³ã«ãã£ãŠç°ãªããŸããã§ãããã¢ã¯ã·ã§ã³ãŸãã¯ã¬ãã¥ãŒãµãŒã®ãããžãã¹ããžãã¯ãã®ãã©ã³ã¹ããšãæ¹æ³ã¯ããªãã®æ€èšæ¬¡ç¬¬ã§ããçŽç²é¢æ°ã®å©ç¹ãå¯èœãªéã
ããã Reduxã®èŠä»¶ãšããŠãã¬ãã¥ãŒãµãŒã¯çŽç²ã§ããå¿ èŠããããŸãïŒç¹å¥ãªå Žåã®0.00001ïŒ ãé€ãïŒã ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯çµ¶å¯Ÿã«çŽç²ã§ããå¿ èŠã¯ãããŸãããå®éãã»ãšãã©ã®ãäžçŽç©ããååšããå Žæã§ãã ãã ããçŽç²é¢æ°ã¯çŽç²é¢æ°ãããæããã«ç解ãšãã¹ãã容æã§ãããããã¢ã¯ã·ã§ã³äœæããžãã¯ã®äžéšãçŽç²ã§åªãããã®ã«ããããšãã§ããŸãã ããã§ãªãå Žåã¯ãããã§åé¡ãããŸããã
ãããŠãã¯ããç§ã®èŠ³ç¹ããã¯ãéçºè ãšããŠãèªåã®ã¢ããªã®ããžãã¯ãšãã®å Žæã«é©åãªãã©ã³ã¹ã決å®ããã®ã¯ããªã次第ã§ãã ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒ/ãªãã¥ãŒãµãŒã®ã©ã¡ãåŽã«åå²ãããã«ã€ããŠã®åäžã®å³æ Œãªã«ãŒã«ã¯ãããŸããã ïŒãããšãç§ãäžã§è¿°ã¹ãã決å®è«/é決å®è«ãã®ããšãé€ããŠãç§ã¯æããã«ãã®ã³ã¡ã³ãã§åç §ããã€ããã§ãããæããã«ãïŒ
@cpsubrian
çµæãã©ããããïŒã¬ãã¥ãŒãµãŒ
å®éãããããµã¬ã®ç®çã§ããçç±ã§ããããããèµ·ãã£ãå Žåããããèµ·ããã¯ãã§ãããªã©ã®åœ±é¿ã«å¯ŸåŠãããã
@markerikson @LumiaSaki
ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯çµ¶å¯Ÿã«çŽç²ã§ããå¿ èŠã¯ãªããå®éãããªãã®ãäžçŽç©ãã®ã»ãšãã©ãäœãå Žæã§ãã
å®éãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯ãäžçŽã§ããå¿
èŠããååšããå¿
èŠãããããŸããã
http://stackoverflow.com/a/34623840/82609ãåç
§ããŠ
ãããŠãã¯ããç§ã®èŠ³ç¹ããã¯ãéçºè ãšããŠãèªåã®ã¢ããªã®ããžãã¯ãšãã®å Žæã«é©åãªãã©ã³ã¹ã決å®ããã®ã¯ããªã次第ã§ãã ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒ/ãªãã¥ãŒãµãŒã®ã©ã¡ãåŽã«åå²ãããã«ã€ããŠã®åäžã®å³æ Œãªã«ãŒã«ã¯ãããŸããã
ã¯ãããã ããçµéšããªããŠãåã¢ãããŒãã®æ¬ ç¹ã«æ°ä»ãã®ã¯ããã»ã©æçœã§ã¯ãããŸãã:)ããã«ããç§ã®ã³ã¡ã³ããåç §ããŠãã ããïŒ https ïŒ
ã»ãšãã©ã®åçŽãªã¢ããªã§ã¯å³å¯ãªã«ãŒã«ã¯é©åã«æ©èœããŸããããåå©çšå¯èœãªã³ã³ããŒãã³ããæ§ç¯ããå Žåããããã®ã³ã³ããŒãã³ãã¯ç¬èªã®ç¯å²å€ã®äœããèªèããŠã¯ãªããŸããã
ãã®ãããã¢ããªå šäœã®ã°ããŒãã«ã¢ã¯ã·ã§ã³ãªã¹ããå®çŸ©ãã代ããã«ãã¢ããªãåå©çšå¯èœãªã³ã³ããŒãã³ãã«åå²ãå§ããããšãã§ããŸããåã³ã³ããŒãã³ãã«ã¯ç¬èªã®ã¢ã¯ã·ã§ã³ãªã¹ããããããããããã£ã¹ããã/åæžããããšããã§ããŸããã åé¡ã¯ããæ¥ä»ããã«ãŒã§æ¥ä»ãéžæãããããã®ToDoã¢ã€ãã ã«ãªãã€ã³ããŒãä¿åãããã£ãŒãããã¯ããŒã¹ãã衚瀺ããŠããããªãã€ã³ããŒä»ãã®ToDoã«ã¢ããªãããã²ãŒãããå¿ èŠãããããšã©ã®ããã«è¡šçŸãããã§ããäœè³ãè¡åãèµ·ããïŒã³ã³ããŒãã³ãã®èª¿æŽ
https://github.com/slorber/scalable-frontend-with-elm-or-reduxãåç §ããŠ
ãããŠãã¯ããç§ã®èŠ³ç¹ããã¯ãéçºè ãšããŠãèªåã®ã¢ããªã®ããžãã¯ãšãã®å Žæã«é©åãªãã©ã³ã¹ã決å®ããã®ã¯ããªã次第ã§ãã ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒ/ãªãã¥ãŒãµãŒã®ã©ã¡ãåŽã«åå²ãããã«ã€ããŠã®åäžã®å³æ Œãªã«ãŒã«ã¯ãããŸããã
ã¯ããããžãã¯ãã¬ãã¥ãŒãµãŒã«é 眮ãããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«é 眮ãããã¯ãReduxããã®èŠä»¶ã¯ãããŸããã Reduxã¯ã©ã¡ãã®æ¹æ³ã§ãå£ããŸããã ããããã®æ¹æ³ã§ãããè¡ãããšãèŠæ±ããå³æ ŒãªèŠåã¯ãããŸããã ããããDanã®æšå¥šã¯ããã¢ã¯ã·ã§ã³ãã°ããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã®å±¥æŽã«ã§ããã ãè¿ã¥ãããããšã§ããã ãŠãŒã¶ãŒã€ãã³ãããšã«1ã€ã®ã¢ã¯ã·ã§ã³ããã£ã¹ãããããå¿ èŠã¯ãããŸããããæšå¥šãããŸãã
ç§ã®å Žåã1ã€ã®ã¢ã¯ã·ã§ã³ã«é¢å¿ã®ãã2ã€ã®ã¬ãã¥ãŒãµãŒããããŸãã çã®action.dataã§ã¯äžååã§ãã å€æãããããŒã¿ãåŠçããå¿ èŠããããŸãã 2ã€ã®ã¬ãã¥ãŒãµãŒã§å€æãå®è¡ããããããŸããã§ããã ããã§ãå€æãå®è¡ããé¢æ°ããµã³ã¯ã«ç§»åããŸããã ãã®ããã«ããŠãç§ã®ã¬ãã¥ãŒãµãŒã¯æ¶è²»ã®æºåãã§ããŠããããŒã¿ãåãåããŸãã ããã¯ã1ãæã®çãreduxã®çµéšã§ç§ãèããããšãã§ããæé«ã®ãã®ã§ãã
ã³ã³ããŒãã³ã/ãã¥ãŒãã¹ãã¢ã®æ§é ããåãé¢ãã®ã¯ã©ãã§ããïŒ ç§ã®ç®æšã¯ãã¹ãã¢ã®æ§é ã«åœ±é¿ããããã®ã¯ãã¹ãŠã¬ãã¥ãŒãµãŒã§ç®¡çããããšã§ãããã®ãããã»ã¬ã¯ã¿ãŒãã¬ãã¥ãŒãµãŒãšåãå Žæã«é 眮ããã®ã奜ããªã®ã§ãã³ã³ããŒãã³ãã¯ã¹ãã¢ã®ç¹å®ã®ããŒããååŸããæ¹æ³ãå®éã«ç¥ãå¿ èŠã¯ãããŸããã
ããã¯ãã³ã³ããŒãã³ããã¢ã¯ã·ã§ã³ããã£ã¹ããããããšãã«ãã³ã³ããŒãã³ãã«ããŒã¿ãæž¡ãã®ã«æé©ã§ããéã®å Žåã¯ã©ãã§ããããã
ããšãã°ãTodoã¢ããªã§ãTodoã¢ã€ãã ã®ååãæŽæ°ããŠãããšããŸãããããã®ãããæŽæ°ãããã¢ã€ãã ã®éšåãæž¡ãã¢ã¯ã·ã§ã³ããã£ã¹ãããããŸãã
dispatch(updateItem({name: <text variable>}));
ãããã³ã¢ã¯ã·ã§ã³ã®å®çŸ©ã¯æ¬¡ã®ãšããã§ãã
const updateItem = (updatedData) => {type: "UPDATE_ITEM", updatedData}
ããã¯ãåçŽã«å®è¡ã§ããã¬ãã¥ãŒãµãŒã«ãã£ãŠåŠçãããŸãã
Object.assign({}, item, action.updatedData)
ã¢ã€ãã ãæŽæ°ããŸãã
ããã¯ãåãã¢ã¯ã·ã§ã³ãšã¬ãã¥ãŒãµãŒãåå©çšããŠTodoã¢ã€ãã ã®å°éå ·ãæŽæ°ã§ãããããéåžžã«å¹æçã§ãã
updateItem({description: <text variable>})
代ããã«èª¬æãå€æŽããããšãã
ããããããã§ã³ã³ããŒãã³ãã¯Todoã¢ã€ãã ãã¹ãã¢ã§ã©ã®ããã«å®çŸ©ãããŠããããç¥ãå¿ èŠãããããã®å®çŸ©ãå€æŽãããå Žåãããã«äŸåãããã¹ãŠã®ã³ã³ããŒãã³ãã§ãããå€æŽããããšãèŠããŠããå¿ èŠããããŸããããã¯æããã«æªãèãã§ãããã®ã·ããªãªã®ææ¡ã¯ãããŸããïŒ
@dcoellarb
ãã®çš®ã®ç¶æ³ã§ã®ç§ã®è§£æ±ºçã¯ãJavascriptã®æè»æ§ãå©çšããŠãå®åçãªãã®ãçæããããšã§ãã
ã ããç§ã¯æã£ãŠãããããããŸããïŒ
const {reducer, actions, selector} = makeRecord({
name: TextField,
description: TextField,
completed: BooleanField
})
makeRecordã¯ãç§ã®èª¬æããã¬ãã¥ãŒãµãŒãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãã»ã¬ã¯ã¿ãŒãèªåçã«äœæããé¢æ°ã§ãã ããã§å®åæããªããªããŸãããåŸã§ãã®ãã¡ããšãããã¿ãŒã³ã«åããªãããšãããå¿ èŠãããå Žåã¯ãmakeRecordã®çµæã«ã«ã¹ã¿ã ã®ã¬ãã¥ãŒãµãŒ/ã¢ã¯ã·ã§ã³/ã»ã¬ã¯ã¿ãŒãè¿œå ã§ããŸãã
tks @winstonewertãã€ã©ãŒãã¬ãŒããåé¿ããã¢ãããŒãã奜ãã§ããå€ãã®ã¢ãã«ã䜿çšããã¢ããªã§ã¯ãå€ãã®æéãç¯çŽã§ããããšãããããŸãã ãããããããã³ã³ããŒãã³ããã¹ãã¢æ§é ããã©ã®ããã«åé¢ãããã¯ãŸã ããããŸãããã€ãŸããã¢ã¯ã·ã§ã³ãçæãããå Žåã§ããã³ã³ããŒãã³ãã¯æŽæ°ããããã£ãŒã«ããæž¡ãå¿ èŠããããŸããã€ãŸããã³ã³ããŒãã³ãã¯æ¬¡ã®æ§é ãç¥ãå¿ èŠããããŸããåºã§ããïŒ
@winstonewert @dcoellarbç§ã®æèŠã§ã¯ãã¢ã¯ã·ã§ã³ãã€ããŒãæ§é ã¯ãã¬ãã¥ãŒãµãŒã§ã¯ãªãã¢ã¯ã·ã§ã³ã«å±ããã¬ãã¥ãŒãµãŒã®ç¶æ æ§é ã«æ瀺çã«å€æãããå¿ èŠããããŸãã ãããã®æ§é ãæåã®åçŽãã®ããã«äºãã«ãã©ãŒãªã³ã°ããŠããã®ã¯å¹žéãªå¶ç¶ã§ãã ãããã®2ã€ã®æ§é ã¯ãåããšã³ãã£ãã£ã§ã¯ãªããããåžžã«çžäºã«ãã©ãŒãªã³ã°ããå¿ èŠã¯ãããŸããã
@sompylasarããã§ããç§ã¯api / restããŒã¿ãã¹ãã¢æ§é ã«å€æããŸãããããã§ãã¹ãã¢æ§é ãç¥ã£ãŠããå¿ èŠãããã®ã¯ã¬ãã¥ãŒãµãŒãšã»ã¬ã¯ã¿ãŒã ãã§ããïŒ ç§ãããããåãå Žæã«é 眮ããçç±ãç§ã®åé¡ã¯ãåŸã§å€æŽããããšã«ããå Žåã«åããŠãã¹ãã¢ã®æ§é ãç¥ãå¿ èŠããªãããšãæãã§ããã³ã³ããŒãã³ã/ãã¥ãŒã«ãããŸãããç§ã®äŸã§èª¬æãããŠããããã«ã圌ãã¯æ§é ãç¥ãå¿ èŠããããŸãæŽæ°ããé©åãªããŒã¿ãéä¿¡ããŸãããããè¡ãããã®ããè¯ãæ¹æ³ãèŠã€ãããŸãã:(ã
@dcoellarbãã¥ãŒã¯ãç¹å®ã®ã¿ã€ãã®ããŒã¿ã®å ¥åãšèããããšãã§ããŸãïŒæååãæ°å€ãªã©ã§ããããã£ãŒã«ããæã€æ§é åãªããžã§ã¯ãïŒã ãã®ããŒã¿ãªããžã§ã¯ãã¯ãå¿ ãããã¹ãã¢æ§é ãåæ ããŠããããã§ã¯ãããŸããã ãã®ããŒã¿ãªããžã§ã¯ããã¢ã¯ã·ã§ã³ã«å ¥ããŸãã ããã¯åºèæ§é ãšã¯é¢ä¿ãããŸããã ã¹ãã¢ãšãã¥ãŒã®äž¡æ¹ãã¢ã¯ã·ã§ã³ãã€ããŒãæ§é ãšçµã¿åãããå¿ èŠããããŸãã
@sompylasarã¯çã«ããªã£ãŠããŸããç§ã¯ãããè©ŠããŠã¿ãŸããã©ããããããšã!!!
redux-saga
ã䜿çšãããšãã¢ã¯ã·ã§ã³ãããçŽç²ã«ããããšãã§ããããšãä»ãå ããŠãããŸãã ãã ããredux-sagaã¯éåæã€ãã³ãã®åŠçã«èŠåŽããŠãããããredux-sagaã®ä»£ããã«RxJSïŒãŸãã¯ä»»æã®FRPã©ã€ãã©ãªïŒã䜿çšããããšã§ããã®ã¢ã€ãã¢ãããã«äžæ©é²ããããšãã§ããŸãã KefirJSã䜿çšããäŸã次ã«ç€ºããŸãïŒ https ïŒ
ããã«ã¡ã¯@frankandrobot ã
redux-sagaã¯éåæã€ãã³ãã®åŠçã«èŠåŽããŠããŸã
ããã¯ã©ãããæå³ã§ããïŒ redux-saga
ã¯ãéåæã€ãã³ããšå¯äœçšããšã¬ã¬ã³ããªæ¹æ³ã§åŠçããããã«äœãããŠããŸãããïŒ https://github.com/reactjs/redux/issues/1171#issuecomment-167715393ãã芧ãã ãã
@IceOnFireã¯ãããŸããã ååredux-saga
ããã¥ã¡ã³ããèªãã ãšããè€éãªéåæã¯ãŒã¯ãããŒãåŠçããã®ã¯å°é£ã§ãã ããšãã°ã次ãåç
§ããŠãã ããïŒ http ïŒ
ããã¯å¹æã«äœããèšã£ãïŒãŸã èšãïŒïŒ
è€éã«ãªãå§ããŠããã®ã§ãæ®ãã®è©³çŽ°ã¯èªè ã«ä»»ããŸã
ãããFRPã®æ¹æ³ãšæ¯èŒããŠãã ããïŒ //github.com/frankandrobot/rflux/blob/master/doc/06-sideeffects.md#a -more-complex-workflow
ãã®ã¯ãŒã¯ãããŒå
šäœãå®å
šã«åŠçãããŸãã ïŒã»ãã®æ°è¡ã§è¿œå ã§ããŸããïŒããã«ã redux-saga
ã®é·æã®ã»ãšãã©ãåŸãããšãã§ããŸãïŒãã¹ãŠãçŽç²é¢æ°ã§ãããã»ãšãã©ãç°¡åãªåäœãã¹ãã§ãïŒã
ååããã«ã€ããŠèãããšããåé¡ã¯redux-sagaã§ããããã¹ãŠãåæããŠããããã«èŠãããšããçµè«ã«éããŸããã åçŽãªã¯ãŒã¯ãããŒã«ã¯æé©ã§ãããè€éãªéåæã¯ãŒã¯ãããŒã®å Žåã¯ãéåæãæ瀺çã«åŠçãããšç°¡åã«ãªããŸã...ãããFRPã®åªããç¹ã§ãã
ããã«ã¡ã¯@frankandrobot ã
説æããããšãããããŸãã ããªããèšåããèŠç©ããã衚瀺ãããŸãããã©ã€ãã©ãªãé²åããå¯èœæ§ããããŸãïŒããšãã°ãä»ãŸã§èŠãããšã®ãªãcancel
å¹æã衚瀺ãããŸãïŒã
2ã€ã®äŸïŒsagaãšFRPïŒããŸã£ããåãããã«åäœããŠããå Žåã倧ããªéãã¯èŠãããŸããã1ã€ã¯try / catchãããã¯å
ã®äžé£ã®åœä»€ã§ããããã1ã€ã¯ã¹ããªãŒã äžã®äžé£ã®ã¡ãœããã§ãã ã¹ããªãŒã ã®çµéšãäžè¶³ããŠãããããsagaã®äŸã¯ããã«èªã¿ãããããã¹ãŠã®yield
1ã€ãã€ãã¹ãã§ããããããã¹ããããããªã£ãŠããŸãã ããããããã¯ãã¯ãããžãŒãããç§ã®èãæ¹ã«ãããã®ã ãšç¢ºä¿¡ããŠããŸãã
ãšã«ãããããã«é¢ãã@yelouafiã®æèŠãç¥ãããã§ãã
@bvaughnããã§èª¬æããŠããã®ãšåããã¹ãã§ãã¢ã¯ã·ã§ã³ãã¬ãã¥ãŒãµãŒãã»ã¬ã¯ã¿ãŒããã¹ãããé©åãªäŸã瀺ããŠããã ããŸããïŒ
ã¢ã¯ã·ã§ã³ãã¬ãã¥ãŒãµãŒãã»ã¬ã¯ã¿ãŒããã¹ãããæãå¹ççãªæ¹æ³ã¯ããã¹ããäœæãããšãã«ãã¢ãã«ãã¢ãããŒãã«åŸãããšã§ãã ã€ãŸããããããã«åå¥ã«çŠç¹ãåœãŠã3ã»ããã®ãã¹ãã§ã¯ãªããç¹å®ã®ã¢ã¯ã·ã§ã³ãã¬ãã¥ãŒãµãŒãããã³ã»ã¬ã¯ã¿ãŒã®ã»ãããã«ããŒãã1ã»ããã®ãã¹ããäœæããå¿ èŠããããŸãã ããã«ãããå®éã®ã¢ããªã±ãŒã·ã§ã³ã§äœãèµ·ããããããæ£ç¢ºã«ã·ãã¥ã¬ãŒãããè²»çšå¯Ÿå¹æãæ倧éã«é«ããããšãã§ããŸãã
ããã«ã¡ã¯@ morgs32ð
ãã®åé¡ã¯å°ãå€ãããã°ããReduxã䜿çšããŠããŸããã Reduxãµã€ãã«ã¯ãã©ã€ãã£ã³ã°ãã¹ãã«é¢ããã»ã¯ã·ã§ã³ããããŸãã®ã§ããã§ãã¯ããŠã¿ãŠãã ããã
åºæ¬çã«ç§ã¯ãã¢ã¯ã·ã§ã³ãšã¬ãã¥ãŒãµãŒã®ãã¹ããåå¥ã«äœæãããããã次ã®ããã«äžç·ã«äœæããæ¹ãå¹ççã§ããå¯èœæ§ãããããšãææããŠããŸããã
import configureMockStore from 'redux-mock-store'
import { actions, selectors, reducer } from 'your-redux-module';
it('should support adding new todo items', () => {
const mockStore = configureMockStore()
const store = mockStore({
todos: []
})
// Start with a known state
expect(selectors.todos(store.getState())).toEqual([])
// Dispatch an action to modify the state
store.dispatch(actions.addTodo('foo'))
// Verify the action & reducer worked successfully using your selector
// This has the added benefit of testing the selector also
expect(selectors.todos(store.getState())).toEqual(['foo'])
})
ããã¯ããããžã§ã¯ãã§æ°ãæéReduxã䜿çšããåŸã®ç§èªèº«ã®èŠ³å¯ã§ããã å ¬åŒã®æšå¥šã§ã¯ãããŸããã YMMVã ð
ãã¢ã¯ã·ã§ã³ã§ããå€ãã®ããšãè¡ã-ã¯ãªãšãŒã¿ãŒã§ããå°ãªããã¬ãã¥ãŒãµãŒã§ããå°ãªãã
ã¢ããªã±ãŒã·ã§ã³ããµãŒããŒãšã¯ã©ã€ã¢ã³ãã§ããããµãŒããŒã«ããžãã¹ããžãã¯ãšããªããŒã¿ãŒãå«ãŸããŠããå¿
èŠãããå Žåã¯ã©ããªããŸããïŒ
ã ããç§ã¯ã¢ã¯ã·ã§ã³ããã®ãŸãŸéä¿¡ããã»ãšãã©ã®äœæ¥ã¯ãµãŒããŒåŽã§ã¬ãã¥ãŒãµãŒã«ãã£ãŠè¡ãããŸã...
ãŸããè±èªã§ããããªããã ããããç§ã¯ããã€ãã®ç°ãªãæèŠãæã£ãŠããŸãã
ç§ã®éžæã¯fat
ã¬ãã¥ãŒãµãŒã thin
ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã§ãã
ç§ã®ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯ãããã€ãã®__promiseããã«ãŠã§ã¢__ã«åºã¥ããŠ__dispatch__ã¢ã¯ã·ã§ã³ïŒasyncãsyncãserial-asyncãparallel-asyncãparallel-async in for-loopïŒãå®è¡ããŸãã
ç§ã®ã¬ãã¥ãŒãµãŒã¯ãããžãã¹ããžãã¯ãåŠçããããã«ãå€ãã®å°ããªç¶æ
ã¹ã©ã€ã¹ã«åå²ãããŸãã combineReduers
ãŠããããçµã¿åãããŸãã reducer
ã¯__çŽç²é¢æ°__ãªã®ã§ãç°¡åã«åå©çšã§ããŸãã ãã€ãangularJSã䜿çšãããããããŸããããåãããžãã¹ããžãã¯ã®ãµãŒãã¹ã§reducer
ãåå©çšã§ãããšæããŸãã reducer
ã«å€ãã®ã©ã€ã³ã³ãŒããããå Žåã¯ãããå°ããªã¬ãã¥ãŒãµãŒã«åå²ããããããã€ãã®é¢æ°ãæœè±¡åãããããããšãã§ããŸãã
ã¯ãã A
ãB, C
äŸåããããšãæå³ããã¯ãã¹ã¹ããŒãã±ãŒã¹ãããã€ããããŸã..ãããŠB, C
ã¯éåæããŒã¿ã§ãã Aãåãããåæåããã«ã¯ã B,C
ã䜿çšããå¿
èŠããããŸãããã®ããã crossSliceReducer
ã䜿çšããŸãã
__ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã§ããå€ãã®ããšãè¡ããã¬ãã¥ãŒãµãŒã§ããå°ãªãããšãè¡ã__ã«ã€ããŠã
redux-thunk
ãªã©ã䜿çšããå Žåãããã getState()
ã§ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒå
ã®å®å
šãªç¶æ
ã«ã¢ã¯ã»ã¹ã§ããŸãã ããã¯éžæã§ãã ãŸãã¯ãããã€ãã®__crossSliceReducer__ãäœæããŠãå®å
šãªç¶æ
ã«ã¢ã¯ã»ã¹ããããšãã§ããŸããããã€ãã®ç¶æ
ã¹ã©ã€ã¹ã䜿çšããŠãä»ã®ç¶æ
ãèšç®ããããšãã§ããŸãã__ãŠããããã¹ãã«ã€ããŠ__
reducer
ã¯__çŽç²é¢æ°__ã§ãã ãããã£ãŠããã¹ãããã®ã¯ç°¡åã§ãã ä»ã®ãšãããä»ã®éšåãããéèŠãªã®ã§ãã¬ãã¥ãŒãµãŒããã¹ãããã ãã§ãã
action creators
ããã¹ãããã«
ç§ã¯ããªãã«åæããŸã@mrdulinããã¯ä»ç§ãè¡ã£ãæ¹æ³ã§ãã
@mrdulinããã ããã«ãŠã§ã¢ã¯ãäžçŽãªããžãã¯ãé
眮ããã®ã«é©ããå Žæã®ããã§ãã
ããããããžãã¹ããžãã¯ã«ãšã£ãŠãã¬ãã¥ãŒãµãŒã¯é©åãªå Žæã®ããã«ã¯æããŸããã æçµçã«ã¯ããŠãŒã¶ãŒã®è³ªåã§ã¯ãªããããžãã¹ããžãã¯ã«å¿
èŠãªãã®ãè¡šãè€æ°ã®ãåæãã¢ã¯ã·ã§ã³ãçºçããŸãã
ã¯ããã«ç°¡åãªéžæã¯ãããã«ãŠã§ã¢ããããã€ãã®çŽç²é¢æ°/ã¯ã©ã¹ã¡ãœãããåŒã³åºãããšã§ãã
middleware = (...) => {
// if(action.type == 'HIGH_LEVEL')
handlers[action.name]({ dispatch, params: action.payload })
}
const handlers = {
async highLevelAction({ dispatch, params }) {
dispatch({ loading: true });
const data = await api.getData(params.someId);
const processed = myPureLogic(data);
dispatch({ loading: false, data: processed });
}
}
@bvaughn
ããã«ãããå€æ°ã®å ¥åãã¹ã埮åŠãªæªå®çŸ©ã®å€ã«ã€ãªããå¯èœæ§ãäœããªããã¹ãã¢ã®æ§é ã®å€æŽãªã©ãç°¡åã«ãªããŸãã
ã¡ã¢åãããŒã¿å€æãå¿ èŠãšããªãäºçŽ°ãªç¶æ ã§ãã£ãŠããã©ãã§ãã»ã¬ã¯ã¿ãŒã䜿çšããããšã«å察ããç§ã®å ŽåïŒ
state.stuff.item1
ãstate.stuff.item2
å€æŽãããšãä»ã®ååãå®éã«å€æŽããã®ãšåãããã«ãã³ãŒããæ€çŽ¢ããŠã©ãã§ãå€æŽã§ããŸãã ããã¯äžè¬çãªã¿ã¹ã¯ã§ãããç¹ã«IDEã䜿çšããŠãã人ã«ãšã£ãŠã¯ç°¡åã§ããæããã«ã»ã¬ã¯ã¿ãŒãå¿ èŠã§ãããããããå¿ é ã®APIã«ããããã®ä»ã®ããã€ãã®è°è«ãèããããšæããŸãã
å®çšçãªèŠ³ç¹ãããç§ã®çµéšã®1ã€ã®æ£åœãªçç±ã¯ãreselectãredux-sagaãªã©ã®ã©ã€ãã©ãªãã»ã¬ã¯ã¿ãŒãå©çšããŠç¶æ ã®äžéšã«ã¢ã¯ã»ã¹ããããšã§ãã ããã¯ç§ãã»ã¬ã¯ã¿ãŒã«åºå·ããã®ã«ååã§ãã
å²åŠçã«èšãã°ãç§ã¯åžžã«ã»ã¬ã¯ã¿ãŒãæ©èœçãªäžçã®ãããè¯ãæ¹æ³ããšèŠãªããŠããŸãã ãŸããJavaãªããžã§ã¯ãã®ãããªãã¯å±æ§ã«ã¢ã¯ã»ã¹ããªãã®ãšåãçç±ã§ãReduxã¢ããªã§ãµãã¹ããŒãã«çŽæ¥ã¢ã¯ã»ã¹ããããšã¯ãããŸããã
@IceOnFireèšç®ã«è²»çšãããããªãå ŽåããŸãã¯ããŒã¿å€æãå¿ èŠãªãå Žåã¯ã掻çšãããã®ã¯äœããããŸããã
ã²ãã¿ãŒã¡ãœããã¯Javaã§ã¯äžè¬çãªæ¹æ³ãããããŸããããJSã§çŽæ¥POJOã«ã¢ã¯ã»ã¹ããããšãåæ§ã§ãã
@timotgl
ã¹ãã¢ãšä»ã®reduxã³ãŒãã®éã«APIãããã®ã¯ãªãã§ããïŒ
ã»ã¬ã¯ã¿ãŒã¯ã¬ãã¥ãŒãµãŒã®ã¯ãšãªïŒèªã¿åãïŒãããªãã¯APIã§ãããã¢ã¯ã·ã§ã³ã¯ã¬ãã¥ãŒãµãŒã®ã³ãã³ãïŒæžã蟌ã¿ïŒãããªãã¯APIã§ãã ã¬ãã¥ãŒãµãŒã®æ§é ã¯ããã®å®è£ ã®è©³çŽ°ã§ãã
ã»ã¬ã¯ã¿ãŒãšã¢ã¯ã·ã§ã³ã¯ãã¬ãã¥ãŒãµãŒèªäœã§ã¯ãªããUIã¬ã€ã€ãŒãšsagaã¬ã€ã€ãŒïŒredux-sagaã䜿çšããŠããå ŽåïŒã§äœ¿çšãããŸãã
@sompylasarããã§ããªãã®èŠè§£ã«åŸããã©ããã¯ãããŸãã
ã»ã¬ã¯ã¿ãŒãã¬ãã¥ãŒãµãŒã®ãèªã¿åããAPIãšããŠèããæ¹æ³ã説æããŠããŸãããç§ã®è³ªåã¯ãã»ã¬ã¯ã¿ãŒãæåã«å¿ é ã®APIã«ããããšãæ£åœåãããã®ã§ããïŒã©ã€ãã©ãªã§ã¯ãªãããããžã§ã¯ãã®ãã¹ããã©ã¯ãã£ã¹ãšããŠããã匷å¶ããå Žåã®ããã«å¿ é ã§ãïŒãèšèšïŒã
@timotglã¯ããã»ã¬ã¯ã¿ãŒã¯å¿ é ã§ã¯ãããŸããã ãã ããã¢ããªã³ãŒãã®å°æ¥ã®å€æŽã«åããŠãåå¥ã«ãªãã¡ã¯ã¿ãªã³ã°ã§ããããã«ããããšããå§ãããŸãã
ã¹ãã¢æ§é ãå€æŽããããšããŠãããšããã»ã¬ã¯ã¿ãŒããªããšã圱é¿ãåããç¶æ ã®éšåã«ã¢ã¯ã»ã¹ãããã¹ãŠã®å ŽæãèŠã€ããŠãªãã¡ã¯ã¿ãªã³ã°ããå¿ èŠããããŸããããã¯ãåã«èŠã€ããŠ-ã ãã§ãªããéèŠãªã¿ã¹ã¯ã«ãªãå¯èœæ§ããããŸããç¹ã«ãã»ã¬ã¯ã¿ãŒãä»ããã«ã¹ãã¢ããçŽæ¥ååŸããç¶æ ã®ãã©ã°ã¡ã³ããæž¡ãå Žåã¯ã眮ãæããŸãã
@sompylasarã
ããã¯æœåšçã«éèŠãªã¿ã¹ã¯ã§ããå¯èœæ§ããããŸã
ããã¯æå¹ãªæžå¿µäºé ã§ããç§ã«ãšã£ãŠã¯ãã³ã¹ãã®ããããã¬ãŒããªãã®ããã«æããŸãã ãã®ãããªåé¡ãåŒãèµ·ãããç¶æ ãªãã¡ã¯ã¿ãªã³ã°ã«åºããããããšã¯ãªããšæããŸãã ããããç§ã¯ãã»ã¬ã¯ã¿ãŒã¹ãã²ããã£ãã«åºããããŸãããããã§ã¯ãç¶æ ã®äºçŽ°ãªãµãããŒã¹ããšã«ãã¹ããããã»ã¬ã¯ã¿ãŒãããªãã®æ··ä¹±ãåŒãèµ·ãããŸããã çµå±ã®ãšããããã®å¯Ÿçèªäœãç¶æããå¿ èŠããããŸãã ããããç§ã¯ããã®èåŸã«ããçç±ãä»ããç解ããŠããŸãã
@timotglç§ãå ¬ã«å ±æã§ããç°¡åãªäŸïŒ
export const PROMISE_REDUCER_STATE_IDLE = 'idle';
export const PROMISE_REDUCER_STATE_PENDING = 'pending';
export const PROMISE_REDUCER_STATE_SUCCESS = 'success';
export const PROMISE_REDUCER_STATE_ERROR = 'error';
export const PROMISE_REDUCER_STATES = [
PROMISE_REDUCER_STATE_IDLE,
PROMISE_REDUCER_STATE_PENDING,
PROMISE_REDUCER_STATE_SUCCESS,
PROMISE_REDUCER_STATE_ERROR,
];
export const PROMISE_REDUCER_ACTION_START = 'start';
export const PROMISE_REDUCER_ACTION_RESOLVE = 'resolve';
export const PROMISE_REDUCER_ACTION_REJECT = 'reject';
export const PROMISE_REDUCER_ACTION_RESET = 'reset';
const promiseInitialState = { state: PROMISE_REDUCER_STATE_IDLE, valueOrError: null };
export function promiseReducer(state = promiseInitialState, actionType, valueOrError) {
switch (actionType) {
case PROMISE_REDUCER_ACTION_START:
return { state: PROMISE_REDUCER_STATE_PENDING, valueOrError: null };
case PROMISE_REDUCER_ACTION_RESOLVE:
return { state: PROMISE_REDUCER_STATE_SUCCESS, valueOrError: valueOrError };
case PROMISE_REDUCER_ACTION_REJECT:
return { state: PROMISE_REDUCER_STATE_ERROR, valueOrError: valueOrError };
case PROMISE_REDUCER_ACTION_RESET:
return { ...promiseInitialState };
default:
return state;
}
}
export function extractPromiseStateEnum(promiseState = promiseInitialState) {
return promiseState.state;
}
export function extractPromiseStarted(promiseState = promiseInitialState) {
return (promiseState.state === PROMISE_REDUCER_STATE_PENDING);
}
export function extractPromiseSuccess(promiseState = promiseInitialState) {
return (promiseState.state === PROMISE_REDUCER_STATE_SUCCESS);
}
export function extractPromiseSuccessValue(promiseState = promiseInitialState) {
return (promiseState.state === PROMISE_REDUCER_STATE_SUCCESS ? promiseState.valueOrError || null : null);
}
export function extractPromiseError(promiseState = promiseInitialState) {
return (promiseState.state === PROMISE_REDUCER_STATE_ERROR ? promiseState.valueOrError || true : null);
}
ä¿åãããŠãããã®ãstate, valueOrError
ãããããšãä»ã®ãã®ã§ãããã¯ããã®ã¬ãã¥ãŒãµãŒãŠãŒã¶ãŒã®é¢å¿äºã§ã¯ãããŸããã å
¬éãããŠããã®ã¯ãç¶æ
æååïŒåæåïŒããã®ç¶æ
ãå€ãããã³ãšã©ãŒã«ã€ããŠé »ç¹ã«äœ¿çšãããããã€ãã®ãã§ãã¯ã§ãã
ããããç§ã¯ãã»ã¬ã¯ã¿ãŒã¹ãã²ããã£ãã«åºããããŸãããããã§ã¯ãç¶æ ã®äºçŽ°ãªãµãããŒã¹ããšã«ãã¹ããããã»ã¬ã¯ã¿ãŒãããªãã®æ··ä¹±ãåŒãèµ·ãããŸããã
ãã®å ¥ãåãã¬ãã¥ãŒãµãŒã®å ¥ãåïŒæ§æïŒã®ãã©ãŒãªã³ã°ã«ãã£ãŠåŒãèµ·ããããå Žåãããã¯ç§ããå§ããããã®ã§ã¯ãªãããããã¬ãã¥ãŒãµãŒã®å®è£ ã®è©³çŽ°ã§ãã äžèšã®äŸã䜿çšãããšãç¶æ ã®äžéšã«promiseReducerã䜿çšããã¬ãã¥ãŒãµãŒã¯ããããã®éšåã«åŸã£ãŠååãä»ããããç¬èªã®ã»ã¬ã¯ã¿ãŒããšã¯ã¹ããŒãããŸãã ãŸããã»ã¬ã¯ã¿ãŒã®ããã«èŠãããã¹ãŠã®é¢æ°ããšã¯ã¹ããŒãããŠãã¬ãã¥ãŒãµãŒAPIã®äžéšã«ããå¿ èŠãããããã§ã¯ãããŸããã
function extractTransactionLogPromiseById(globalState, transactionId) {
return extractState(globalState).transactionLogPromisesById[transactionId] || undefined;
}
export function extractTransactionLogPromiseStateEnumByTransactionId(globalState, transactionId) {
return extractPromiseStateEnum(extractTransactionLogPromiseById(globalState, transactionId));
}
export function extractTransactionLogPromiseErrorTransactionId(globalState, transactionId) {
return extractPromiseError(extractTransactionLogPromiseById(globalState, transactionId));
}
export function extractTransactionLogByTransactionId(globalState, transactionId) {
return extractPromiseSuccessValue(extractTransactionLogPromiseById(globalState, transactionId));
}
ãããç§ãã»ãšãã©å¿ããŠããããäžã€ã®ããšã é¢æ°åãšãšã¯ã¹ããŒã/ã€ã³ããŒãã¯ãé©åãã€å®å šã«æå°åã§ããŸãã ãã¹ãããããªããžã§ã¯ãããŒâããã»ã©å€ãã¯ãããŸããããã³ãŒããå°ç¡ãã«ããªãããã«ããããã¡ã€ã¢ã«é©åãªããŒã¿ãããŒãã¬ãŒãµãŒãå¿ èŠã§ãã
@timotgl ïŒReduxã§æšå¥šããããã¹ããã©ã¯ãã£ã¹ã®å€ãã¯ãReduxé¢é£ã®ããžãã¯ãšåäœãã«ãã»ã«åããããšã§ãã
ããšãã°ã this.props.dispatch({type : "INCREMENT"})
å®è¡ããããšã«ãããæ¥ç¶ãããã³ã³ããŒãã³ãããçŽæ¥ã¢ã¯ã·ã§ã³ããã£ã¹ãããã§ããŸãã ãã ããã³ã³ããŒãã³ããReduxãšéä¿¡ããŠããããšããèªèãããããã«åŒ·å¶ãããããããã¯ãå§ãããŸããã ããReactã®æ
£çšçãªæ¹æ³ã¯ããã€ã³ããããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãæž¡ãããšã§ããããã«ãããã³ã³ããŒãã³ãã¯this.props.increment()
åŒã³åºãããšãã§ãããã®é¢æ°ããã€ã³ããããReduxã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã§ãããã©ããã¯é¢ä¿ãããŸãããã³ãŒã«ããã¯ãæž¡ãããŸãã芪ã«ããããŠã³ããŸãã¯ãã¹ãã®æš¡æ¬é¢æ°ã
ã©ãã«ã§ãã¢ã¯ã·ã§ã³ã¿ã€ããææžãããããšãã§ããŸãããå®æ°å€æ°ãå®çŸ©ããŠãããããã€ã³ããŒãããã¬ãŒã¹ããã¿ã€ããã¹ã®å¯èœæ§ãæžããããšããå§ãããŸãã
åæ§ã«ã mapState
é¢æ°ãŸãã¯ãµã³ã¯ã§state.some.deeply.nested.field
ã«ã¢ã¯ã»ã¹ããããšã劚ãããã®ã¯äœããããŸããã ãã ãããã®ã¹ã¬ããã§ãã§ã«èª¬æããããã«ãããã«ããã¿ã€ããã¹ã®å¯èœæ§ãé«ãŸããç¹å®ã®ç¶æ
ã䜿çšãããŠããå Žæã远跡ããã®ãé£ãããªãããªãã¡ã¯ã¿ãªã³ã°ãããå°é£ã«ãªããé«äŸ¡ãªå€æããžãã¯ãããããåå®è¡ãããããšãæå³ããŸã-å¿
èŠããªããŠãæ¯åå®è¡ããŸãã
ããããã»ã¬ã¯ã¿ãŒã䜿çšããå¿ èŠã¯ãããŸããããã»ã¬ã¯ã¿ãŒã¯åªããã¢ãŒããã¯ãã£ãŒãã©ã¯ãã£ã¹ã§ãã
ç§ã®æçš¿ãæ £çšçãªReduxïŒã«ãã»ã«åãšããã©ãŒãã³ã¹ã®ããã®åéžæã»ã¬ã¯ã¿ãŒã®äœ¿çšãããèªã¿ãã ããã
@markeriksonç§ã¯äžè¬çãªã»ã¬ã¯ã¿ãŒããŸãã¯é«äŸ¡ãªèšç®ã®ããã®ã»ã¬ã¯ã¿ãŒã«å察ããŠããããã§ã¯ãããŸããã ãããŠãç§ã¯ãã£ã¹ãããèªäœãã³ã³ããŒãã³ãã«æž¡ãã€ããã¯ãããŸããã§ãã:)
ç§ã®ãã€ã³ãã¯ãç§ããã®ä¿¡å¿µã«åæããªããšããããšã§ããïŒ
çæ³çã«ã¯ãã¬ãã¥ãŒãµãŒé¢æ°ãšã»ã¬ã¯ã¿ãŒã®ã¿ãæ£ç¢ºãªç¶æ æ§é ãç¥ã£ãŠããå¿ èŠããããããäžéšã®ç¶æ ãååšããå Žæãå€æŽããå Žåã¯ãããã2ã€ã®ããžãã¯ãæŽæ°ããã ãã§æžã¿ãŸãã
state.some.deeply.nested.field
ã䜿çšããäŸã«ã€ããŠã¯ããããççž®ããããã®ã»ã¬ã¯ã¿ãŒã䜿çšããããšã®äŸ¡å€ãããããŸãã selectSomeDeeplyNestedField()
ã¯1ã€ã®é¢æ°åã§ããã®ã«å¯Ÿãã5ã€ã®ããããã£ã¯ééã£ãŠããå¯èœæ§ããããŸãã
äžæ¹ããã®æçŽã®ã¬ã€ãã©ã€ã³ã«åŸããšã const selectSomeField = state => state.some.field;
ãŸãã¯const selectSomething = state => state.something;
ãããæç¹ã§ãããäžè²«ããŠå®è¡ãããªãŒããŒãããïŒã€ã³ããŒãããšã¯ã¹ããŒãããã¹ãïŒãçºçããŸããç§ã®æèŠã§ã¯ãïŒè°è«ã®äœå°ã®ããïŒå®å
šæ§ãšçŽåºŠã¯ãã¯ãæ£åœåãããŸããã ããã¯æå³ã®ããããšã§ãããç§ã¯ã¬ã€ãã©ã€ã³ã®ç¬æçãªç²Ÿç¥ãæ¯ãæãããšã¯ã§ããŸããã ç§ã®ãããžã§ã¯ãã®éçºè
ã¯ãã»ã¬ã¯ã¿ãŒãè³¢ããé©åãªå Žåã«äœ¿çšããããšãä¿¡é ŒããŸãããããŸã§ã®ç§ã®çµéšã§ã¯ãã»ã¬ã¯ã¿ãŒã䜿çšããŠããããã§ãã
ç¹å®ã®æ¡ä»¶äžã§ã¯ãå®å šæ§ãšæ £ç¿ã®é¢ã§ééããç¯ããããšæãçç±ãããããŸããã ããªãã®æéãšé¢äžã«æè¬ããŸããç§ã¯ç§ãã¡ãreduxãæã£ãŠããããšãå šäœçã«éåžžã«å¬ããæããŸãã
ãã¡ããã FWIWã«ã¯ãä»ã®ã»ã¬ã¯ã¿ãŒã©ã€ãã©ãªããããReselectã®ã©ãããŒããããŸãã ããšãã°ã httpsïŒ//github.com/planttheidea/selectoratorã䜿çšãããšããããè¡šèšã®ããŒãã¹ãå®çŸ©ã§ããå éšã§äžéã»ã¬ã¯ã¿ãŒãå®è¡ã§ããŸãã
æãåèã«ãªãã³ã¡ã³ã
@dtinth @ denis-sokolovç§ãããªãã«åæããŸãã ãšããã§ã redux-sagaãããžã§ã¯ããåç §ããŠãããšããactionCreatorsãæé·ãããæéã®çµéãšãšãã«ãŸããŸãè€éã«ãããšããèãã«å察ããŠããããšãæ確ã«ã§ããªãã£ããããããŸããã
Redux-sagaãããžã§ã¯ããã @ dtinthã§èª¬æããŠããããšãå®è¡ããè©Šã¿ã§ãããäž¡æ¹ã®çºèšã«ã¯
ãã¶ããRedux sagaã®è°è«ã«ã€ãªããå ã®è°è«ã®ãã®æç¹ãèŠãããšãã§ããŸãïŒ https ïŒ
解決ãããŠãŒã¹ã±ãŒã¹
æãããªTodoCreatedã€ãã³ããããTodoã¢ããªããããšæ³åããŠãã ããã 次ã«ãã¢ããªã®ãªã³ããŒãã£ã³ã°ãã³ãŒãã£ã³ã°ããããã«ãé¡ãããŸãã ãŠãŒã¶ãŒãToDoãäœæãããããããã¢ããã§ç¥çŠããå¿ èŠããããŸãã
ãäžçŽãªãæ¹æ³ïŒ
ããã¯@bvaughnã奜ãããã§ã
ãã®ã¢ãããŒãã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãã¢ããªãã¥ãŒã®ã¬ã€ã¢ãŠããšé«åºŠã«çµåãããããã奜ãã§ã¯ãããŸããã actionCreatorã¯ã決å®ãäžãããã«UIç¶æ ããªãŒã®æ§é ãç¥ã£ãŠããå¿ èŠãããããšãåæãšããŠããŸãã
ãçã®ã€ãã³ããããã¹ãŠãèšç®ãããæ¹æ³ïŒ
ããã¯@ denis-sokolov @ dtinthã奜ãããã«æããããã®ã§ãïŒ
ã¯ããããã§ãšãã衚瀺ããå¿ èŠããããã©ãããç¥ãã¬ãã¥ãŒãµãŒãäœæã§ããŸãã ãã ãããããã¢ããã衚瀺ãããããšã瀺ãã¢ã¯ã·ã§ã³ããªããŠã衚瀺ããããããã¢ããããããŸãã ç§èªèº«ã®çµéšã§ã¯ããããå®è¡ããŠããïŒãããŠãããå®è¡ããŠããã¬ã¬ã·ãŒã³ãŒãããŸã æã£ãŠããïŒã®ã§ããããéåžžã«æ瀺çã«ããæ¹ãåžžã«è¯ãã§ããã¢ã¯ã·ã§ã³DISPLAY_CONGRATULATIONãèµ·åãããªãå Žåã¯ããç¥ããããã¢ããã衚瀺ããªãã§ãã ããã æ瀺çã¯ãæé»çãããä¿å®ãã¯ããã«ç°¡åã§ãã
ç°¡ç¥åãããäœè³ã®æ¹æ³ã
redux-sagaã¯ãžã§ãã¬ãŒã¿ãŒã䜿çšããŠãããæ £ããŠããªãå Žåã¯å°ãè€éã«èŠãããããããŸããããåºæ¬çã«åçŽåãããå®è£ ã§ã¯ã次ã®ããã«èšè¿°ããŸãã
äœè³ã¯ãã€ãã³ããåãåããå¹æãçã¿åºãå¯èœæ§ã®ããã¹ããŒããã«ãªä¿³åªã§ãã ããã§ã¯ããããäœã§ããããç解ããããã«äžçŽãªã¬ãã¥ãŒãµãŒãšããŠå®è£ ãããŠããŸãããå®éã«ã¯redux-sagaãããžã§ã¯ãã«ã¯å«ãŸããŠããŸããã
ã«ãŒã«ãå°ãè€éã«ããŸãã
ããªããæåã®ã«ãŒã«ã®äžè©±ããããªãã°ãããã¯ãã¹ãŠã«ã€ããŠããŸãæ確ã§ã¯ãããŸããã
äžèšã®å®è£ ãèŠããšããªã³ããŒãã£ã³ã°äžã«ToDoãäœæãããã³ã«ãç¥ããããã¢ãããéãããšãããããŸãã ã»ãšãã©ã®å Žåããªã³ããŒãã£ã³ã°äžã«æåã«äœæãããToDoã«å¯ŸããŠã®ã¿éãããã¹ãŠã§ã¯ãªãããã«ããŸãã ãŸãããŠãŒã¶ãŒãæçµçã«ãªã³ããŒãã£ã³ã°ãæåããããçŽãããšãã§ããããã«ããããšèããŠããŸãã
ãªã³ããŒãã£ã³ã°ããŸããŸãè€éã«ãªãã«ã€ããŠã3ã€ã®å®è£ ãã¹ãŠã§ã³ãŒããæéã®çµéãšãšãã«ã©ã®ããã«ä¹±éã«ãªãããããããŸããïŒ
redux-sagaã®æ¹æ³
redux-sagaãšäžèšã®ãªã³ããŒãã£ã³ã°ã«ãŒã«ã䜿çšãããšã次ã®ããã«èšè¿°ã§ããŸãã
äžèšã®ãœãªã¥ãŒã·ã§ã³ãããã¯ããã«ç°¡åãªæ¹æ³ã§ãã®ãŠãŒã¹ã±ãŒã¹ã解決ã§ãããšæããŸãã ç§ãééã£ãŠããå Žåã¯ãããç°¡åãªå®è£ ãæããŠãã ãã:)
ããªãã¯äžçŽãªã³ãŒãã«ã€ããŠè©±ããŸãããããã®å Žåããã€ã¯/ãããå¹æã¯å®éã«ã¯ããŒã¿ã§ãããããRedux-sagaã®å®è£ ã«äžçŽç©ã¯ãããŸããã takeïŒïŒãåŒã³åºããããšãå®è¡ãããŸãããå®è¡ãããšãã§ã¯ãã®èšè¿°åãè¿ãããããæç¹ã§ã€ã³ã¿ãŒããªã¿ãŒãèµ·åããããããµã¬ããã¹ãããããã®ã¢ãã¯ã¯å¿ èŠãããŸããã Haskellããã£ãŠããæ©èœçãªéçºè ãªããFree / IOã¢ãããèããŠãã ããã
ãã®å Žåã次ã®ããšãå¯èœã«ãªããŸãã
getState
ã«äŸåããããã«ããŸããŸãã解éã¬ã€ã€ãŒãæäŸããŠãçã®ã€ãã³ããããæå³ã®ããé«ã¬ãã«ã®ã€ãã³ãã«å€æã§ããããã«ããŸãïŒELMãããã«ã¢ããæã«ã€ãã³ããã©ããããããšã§è¡ãã®ãšå°ã䌌ãŠããŸãïŒã
äŸïŒ
ã¢ãã«ã䜿çšããŠã¢ãžã¥ã©ãŒã¢ããªã®ã¬ã€ã¢ãŠããå®çŸããå Žåã¯ãã¢ãã«ãçµåããªãããã«ããããšãã§ããŸãã äœè³ãã«ãããªã³ã°ãã€ã³ãã«ãªããŸãã ã¢ãã«ã¯åœŒãã®çã®åºæ¥äºãç¥ã£ãŠããå¿ èŠããããäœè³ã¯ãããã®çã®åºæ¥äºã解éããŸãã ããã¯ãduck1ãããžã§ã¯ããå¥ã®ã³ã³ããã¹ãã§åå©çšãããããããããduck1ãduck2ã®ã¢ã¯ã·ã§ã³ãçŽæ¥ãã£ã¹ããããããããã¯ããã«åªããŠããŸãã ãã ããã«ãããªã³ã°ãã€ã³ãã¯actionCreatorsã«ãããå¯èœæ§ãããããããä»æ¥ã»ãšãã©ã®äººãè¡ã£ãŠããããšã§ãããšäž»åŒµãã人ããããããããŸããã