
reduxéçºè
ã¯ãã¢ããªã±ãŒã·ã§ã³éçºã®æãé£ããéšåã®1ã€ãéåæåŒã³åºã-reduxã¢ã¯ã·ã§ã³ãšãªãã¥ãŒãµãŒãè€éã«ããããšãªããªã¯ãšã¹ããã¿ã€ã ã¢ãŠãããã®ä»ã®ã³ãŒã«ããã¯ãåŠçããæ¹æ³ã§ããããšãæããŠãããŸãã
ãã®èšäºã§ã¯ãredux-thunkã®ãããªåçŽãªã¢ãããŒãããredux-sagaã®ãããªããé«åºŠãªã©ã€ãã©ãªã«è³ããŸã§ãã¢ããªã±ãŒã·ã§ã³ã§éåæã管çããããã®ããã€ãã®ç°ãªãã¢ãããŒãã«ã€ããŠèª¬æããŸãã
ReactãšReduxã䜿çšããã®ã§ãããããã©ã®ããã«æ©èœãããã«ã€ããŠå°ãªããšãããçšåºŠã®èãããããšä»®å®ããŸãã
ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒ
APIãšã®çžäºäœçšã¯ãã¢ããªã±ãŒã·ã§ã³ã§ããªãäžè¬çãªèŠä»¶ã§ãã ãã¿ã³ãã¯ãªãã¯ãããšãç¬ã®ã©ã³ãã ãªåçã衚瀺ããå¿
èŠããããšæ³åããŠãã ããã
Dog CEO APIãšãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒå
ã§fetchãåŒã³åºããããªéåžžã«åçŽãªãã®ã䜿çšã§ããŸãã
const {Provider, connect} = ReactRedux; const createStore = Redux.createStore
jsfiddle.net/eh3rrera/utwt4dr8ãã®ã¢ãããŒãã«ã¯äœã®åé¡ããããŸããã ä»ã®æ¡ä»¶ãåãã§ããã°ãåžžã«ããã·ã³ãã«ãªã¢ãããŒãã䜿çšããããšããå§ãããŸãã
ãã ããReduxã®ã¿ã䜿çšããŠãååãªæè»æ§ã¯åŸãããŸããã Reduxã«ãŒãã«ã¯ãåæããŒã¿ã¹ããªãŒã ã®ã¿ããµããŒãããç¶æ
ã³ã³ããã§ãã
åã¢ã¯ã·ã§ã³ã«ã€ããŠãäœãèµ·ãã£ãã®ãã説æãããªããžã§ã¯ããã¹ãã¢ã«éä¿¡ãããã¬ãã¥ãŒãµãŒãåŒã³åºãããç¶æ
ãããã«æŽæ°ãããŸãã
ãã ããéåæåŒã³åºãã®å Žåã¯ãæåã«å¿çãåŸ
ã€å¿
èŠãããããã®åŸãšã©ãŒããªããã°ç¶æ
ãæŽæ°ããŸãã ããããã¢ããªã±ãŒã·ã§ã³ã«äœããã®è€éãªããžãã¯/ã¯ãŒã¯ãããŒãããå Žåã¯ã©ãã§ããããïŒ
ãããè¡ãããã«ãReduxã¯ããã«ãŠã§ã¢ã䜿çšããŸãã äžéå±€ã¯ãã¢ã¯ã·ã§ã³ãéä¿¡ãããåŸããªãã¥ãŒãµãŒãåŒã³åºãããåã«å®è¡ãããã³ãŒãã§ãã
äžéå±€ã¯ãã¢ã¯ã·ã§ã³ïŒã¢ã¯ã·ã§ã³ïŒã®ããŸããŸãªåŠçã®åŒã³åºãã®ãã§ãŒã³ã§æ¥ç¶ã§ããŸãããåºåã¯åçŽãªãªããžã§ã¯ãïŒã¢ã¯ã·ã§ã³ïŒã§ãªããã°ãªããŸãã
éåææäœã®å ŽåãReduxã¯
redux-thunkããã«ãŠã§ã¢ã®äœ¿çšãæšå¥šããŸãã
Reduxãµã³ã¯
Reduxãµã³ã¯ã¯ãReduxã§éåææäœãå®è¡ããæšæºçãªæ¹æ³ã§ãã
ãã®ç®çã®ããã«ãredux-thunkã¯å¿
èŠã«å¿ããŠé
延å®è¡ãæäŸããé¢æ°ã§ãããµã³ã¯ã®æŠå¿µãå°å
¥ããŸãã
redux-thunkããã¥ã¡ã³ãã®äŸã
ã芧ãã ãã
let x = 1 + 2;
å€3ã¯ããã«å€æ°xã«å²ãåœãŠãããŸãã
ãã ãã次ã®ãããªåŒãããå Žå
let foo = () => 1 + 2;
ãã®å ç®ã¯ããã«ã¯å®è¡ãããŸããããfooïŒïŒé¢æ°ãåŒã³åºããããšãã«ã®ã¿å®è¡ãããŸãã ããã«ãããfooé¢æ°ããµã³ã¯ã«ãªããŸãã
Redux-thunkã䜿çšãããšãã¢ã¯ã·ã§ã³äœæè
ã¯ãªããžã§ã¯ãã«å ããŠé¢æ°ãéä¿¡ã§ãããããã¢ã¯ã·ã§ã³ãžã§ãã¬ãŒã¿ãŒãã³ã³ããŒã¿ãŒã«å€æã§ããŸãã
以äžã§ã¯ãredux-thunkã䜿çšããŠåã®äŸãæžãæããŸã
const {Provider, connect} = ReactRedux; const {createStore, applyMiddleware} = Redux; const thunk = ReduxThunk.default;
jsfiddle.net/eh3rrera/0s7b54n4äžèŠã以åã®ããŒãžã§ã³ãšå€§å·®ãããŸããã
redux-thunkãªã

redux-thunkã䜿çš

redux-thunkã䜿çšããå©ç¹ã¯ãéåæã¢ã¯ã·ã§ã³ãå®è¡ãããŠããããšãã³ã³ããŒãã³ããèªèããªãããšã§ãã
ãªããªã äžéå±€ã¯ããã£ã¹ãããé¢æ°ãã¢ã¯ã·ã§ã³ãžã§ãã¬ãŒã¿ãŒãè¿ãé¢æ°ã«èªåçã«æž¡ããŸãããã®åŸãã³ã³ããŒãã³ãã®å€éšã§ã¯ãåæã¢ã¯ã·ã§ã³ãšéåæã¢ã¯ã·ã§ã³ã®åŒã³åºãã«éãã¯ãããŸããïŒã³ã³ããŒãã³ãã¯ããã«ã€ããŠå¿é
ããå¿
èŠããªããªããŸãïŒ
ãããã£ãŠãäžéå±€ã®ã¡ã«ããºã ã䜿çšããŠãæé»å±€ïŒéæ¥å±€ïŒãè¿œå ããŸãããããã«ãããæè»æ§ãåäžããŸããã
redux-thunkã¯ãè¿ãããé¢æ°ã«ãã©ã¡ãŒã¿ãŒãšããŠã¹ãã¢ããdispatchããã³getStateã¡ãœãããæž¡ããããä»ã®ã¢ã¯ã·ã§ã³ãéä¿¡ããç¶æ
ã䜿çšããŠè¿œå ã®ããžãã¯ãšã¯ãŒã¯ãããŒãå®è£
ã§ããŸãã
ããããåå¿ã³ã³ããŒãã³ããå€æŽããã«ããµã³ã¯ã䜿çšããŠè¡šçŸããããè€éãªãã®ãããå Žåã¯ã©ãã§ãããã ãã®å Žåãå¥ã®ããã«ãŠã§ã¢ã©ã€ãã©ãªã䜿çšããŠãããå€ãã®å¶åŸ¡ãååŸããããšãã§ããŸãã
redux-thunkãã©ã€ãã©ãªã«çœ®ãæããæ¹æ³ãèŠãŠã¿ãŸããããããã«ãããããå€ãã®å¶åŸ¡ãå¯èœã«ãªããŸã-redux-sagaã
Redux-saga
Redux-sagaã¯ãsagaãæäœããããšã§å¯äœçšãããç°¡åã«æ¹åããããšãç®çãšããã©ã€ãã©ãªã§ãã
Sagasã¯ãåæ£ãã©ã³ã¶ã¯ã·ã§ã³ã®äžçããæ¥ãèšèšãã¿ãŒã³ã§ããããµã¬ã¯ãã©ã³ã¶ã¯ã·ã§ã³ã®æ¹æ³ã§å®è¡ããå¿
èŠãããããã»ã¹ã管çããå®è¡ç¶æ
ãç¶æãã倱æããããã»ã¹ãè£æ£ããŸãã
ãµã¬ã®è©³çŽ°ã«ã€ããŠ
ã¯ãSagaãã¿ãŒã³ã® Caitie McCaffrey Applicationã åç
§ããããšããå§ããããšãã§ããŸãããæ欲ãããå Žåã¯ãåæ£ã·ã¹ãã ã«é¢ãããµã¬ã«ã€ããŠæåã«èª¬æãã
èšäºã
åç
§ããŠ
ãã ãã ã
Reduxã®ã³ã³ããã¹ãã§ã¯ããµã¬ã¯äžéå±€ãšããŠå®è£
ããïŒãªãã¥ãŒãµãŒã¯çŽç²ãªé¢æ°ã§ãªããã°ãªããªãããããªãã¥ãŒãµãŒã䜿çšã§ããŸããïŒãéåæã¢ã¯ã·ã§ã³ïŒå¯äœçšïŒã調æŽããã³èªçºããŸãã
Redux-sagaã¯
ES6ãžã§ãã¬ãŒã¿ãŒã§ãããè¡ããŸã

ãžã§ãã¬ãŒã¿ãŒã¯ãåäžã®ãã¹ã§ãã¹ãŠã®åŒãå®è¡ãã代ããã«ãåæ¢ããã³ç¶ç¶ã§ããé¢æ°ã§ãã
ãžã§ãã¬ãŒã¿ãŒé¢æ°ãåŒã³åºããšãã€ãã¬ãŒã¿ãŒãªããžã§ã¯ããè¿ãããŸãã ãããŠãnextïŒïŒã€ãã¬ãŒã¿ã¡ãœãããåŒã³åºããã³ã«ããžã§ãã¬ãŒã¿é¢æ°ã®æ¬äœã¯æ¬¡ã®yieldåŒãŸã§å®è¡ããããã®åŸåæ¢ããŸãã

ããã«ãããéåæã³ãŒãã®èšè¿°ãšç解ã容æã«ãªããŸãã
ããšãã°ã次ã®åŒã®ä»£ããã«ïŒ

ãžã§ãã¬ãŒã¿ãŒã§ã¯ã次ã®ããã«èšè¿°ããŸãã

redux-sagaã«æ»ããšãäžè¬çã«èšãã°ããã£ã¹ããããããã¢ã¯ã·ã§ã³ãç£èŠããããšãç®çã®ãµã¬ããããŸãã

ãµã¬å
ã§å®è£
ããããžãã¯ã調æŽããããã«ãtakeEveryãã«ããŒé¢æ°ã䜿çšããŠãæäœãå®è¡ããæ°ãããµã¬ãäœæã§ããŸãã

è€æ°ã®ãªã¯ãšã¹ããããå ŽåãtakeEveryã¯worker sagaã®ããã€ãã®ã€ã³ã¹ã¿ã³ã¹ãéå§ããŸãã ã€ãŸãã䞊è¡æ§ãå®è£
ããŸãã
ãŠã©ããã£ãŒã®ç©èªã¯ãè€éãªããžãã¯ãå®è£
ããããã®æè»æ§ãæäŸããå¥ã®éæ¥å±€ã§ããããšã«æ³šæããå¿
èŠããããŸãïŒãã ããããã¯åçŽãªã¢ããªã±ãŒã·ã§ã³ã§ã¯äžèŠãªå ŽåããããŸãïŒã
ããã§fetchDogAsyncïŒïŒé¢æ°ãå®è£
ã§ããŸãïŒdispatchã¡ãœãããžã®ã¢ã¯ã»ã¹æš©ããããšä»®å®ããŸãïŒ

ããããredux-sagaã䜿çšãããšãæäœèªäœã®çµæã§ã¯ãªããæäœãå®è¡ããæå³ã宣èšãããªããžã§ã¯ããååŸã§ããŸãã ã€ãŸããäžã®äŸã¯redux-sagaã§æ¬¡ã®ããã«å®è£
ãããŠããŸãã
ïŒã¡ã¢ç¿»èš³è
ïŒèè
ã¯æåã®ãã£ã¹ãããåŒã³åºãã眮ãæããã®ãå¿ããŠããŸããïŒéåæã¡ãœãããçŽæ¥åŒã³åºã代ããã«ãcallã¡ãœããã¯ãã®æäœãèšè¿°ãããªããžã§ã¯ãã®ã¿ãè¿ããredux-sagaã¯åŒã³åºããåŠçããŠãžã§ãã¬ãŒã¿ãŒé¢æ°ã«çµæãè¿ããŸãã
åãããšãputã¡ãœããã«ãåœãŠã¯ãŸããŸãã ãžã§ãã¬ãŒã¿ãŒé¢æ°å
ã§ã¢ã¯ã·ã§ã³ããã£ã¹ããããã代ããã«ãputã¯ããã«ãŠã§ã¢ã®æ瀺ãå«ããªããžã§ã¯ããè¿ããã¢ã¯ã·ã§ã³ãéä¿¡ããŸãã
ãããã®æ»ããªããžã§ã¯ãã¯ããšãã§ã¯ããšåŒã°ããŸãã 以äžã¯ãåŒã³åºãã¡ãœããã«ãã£ãŠè¿ãããå¹æã®äŸã§ãã

ãšãã§ã¯ãã䜿çšããå Žåãredux-sagaã¯sagasã
åœä»€åããã
å®£èš åã«ããŸãã
宣èšåããã°ã©ãã³ã°ã¯ãããã°ã©ã ã®å®è¡
æ¹æ³ãèšè¿°
ããã®ã§ã¯ãªã
ãããã°ã©ã ãå®è¡ãã¹ãããšãèšè¿°ãã
ããšã«ãããå¯äœçšãæå°éã«æããããæé€ããããšããããã°ã©ãã³ã°ã¹ã¿ã€ã«ã§ãã
ãããããããå©ç¹ãããã³ã»ãšãã©ã®äººã話ãããšã¯ãåçŽãªãªããžã§ã¯ããè¿ãé¢æ°ã¯ãéåæåŒã³åºããè¡ãé¢æ°ããããã¹ããã¯ããã«ç°¡åã§ããããšã§ãã ãã¹ãã§ã¯ãå®éã®IPAã䜿çšããããåœç©ãäœã£ãããæ¿¡ãããããå¿
èŠã¯ãããŸããã
ãã¹ãã§ã¯ãã¢ãµãŒããè¡ã£ãŠçµæã®å€ãæ¯èŒããããšã«ããããžã§ãã¬ãŒã¿ãŒé¢æ°ãç¹°ãè¿ããŸãã

å¥ã®è¿œå ã®å©ç¹ã¯ãããŸããŸãªå¹æãç°¡åã«çµã¿åãããŠè€éãªã¯ãŒã¯ãããŒãäœæã§ããããšã§ãã
takeEvery ã
call ã
put ãredux-sagaã«å ããŠã
é
延 ïŒ çŸåšã®ç¶æ
ã®ååŸã 䞊åã¿ã¹ã¯ã®éå§ ã
ã¿ã¹ã¯ã®ãã£ã³ã»ã« ïŒãè¡ã
ãšãã§ã¯ãïŒãšãã§ã¯ãã¯ãªãšãŒã¿ãŒïŒã
äœæããããã®å€ãã®
ã¡ãœãããæäŸããŸãã ã»ãã®ããã€ãã®å¯èœæ§ã
ç°¡åãªäŸã«æ»ãã以äžã¯redux-sagaã®å®å
šãªå®è£
ã§ãã
const {Provider, connect} = ReactRedux; const {createStore, applyMiddleware} = Redux; const createSagaMiddleware = ReduxSaga.default; const {takeEvery} = ReduxSaga; const {put, call} = ReduxSaga.effects;
jsfiddle.net/eh3rrera/qu42h5eeãã¿ã³ãã¯ãªãã¯ãããšã次ã®ããã«ãªããŸãã
1.ã¢ã¯ã·ã§ã³FETCHED_DOGãéä¿¡ãããŸã
2.ãŠã©ãããµãŒã¬watchFetchDogã¯ãã®ã¢ã¯ã·ã§ã³ãåãåããã¯ãŒã«ãŒãµãŒã¬fetchDogAsyncãåŒã³åºããŸãã
3.ããŒãã€ã³ãžã±ãŒã¿ã衚瀺ããã¢ã¯ã·ã§ã³ãéä¿¡ãããŸãã
4.ã¡ãœããAPIåŒã³åºããè¡ãããŸãã
5.ã¹ããŒã¿ã¹æŽæ°ã¢ã¯ã·ã§ã³ãéä¿¡ãããŸãïŒæåãŸãã¯å€±æïŒ
ããã€ãã®æé»çãªã¬ã€ã€ãŒãšå°ãäœåãªäœæ¥ã䟡å€ããããšæãå Žåãredux-sagaã¯æ©èœçãªæ¹æ³ã§å¯äœçšãåŠçããããã®ããå€ãã®å¶åŸ¡ãæäŸã§ããŸãã
ãããã«
ãã®èšäºã§ã¯ãã¢ã¯ã·ã§ã³äœæè
ããµã³ã¯ãããã³ãµã¬ã䜿çšããŠReduxã«éåææäœãå®è£
ããæ¹æ³ã瀺ããåçŽãªã¢ãããŒãããããè€éãªã¢ãããŒãã«ç§»è¡ããŸããã
Reduxã¯ãå¯äœçšãåŠçããããã®ãœãªã¥ãŒã·ã§ã³ãèŠå®ããŠããŸããã ã©ã®ã¢ãããŒãã«åŸããã決å®ãããšãã¯ãã¢ããªã±ãŒã·ã§ã³ã®è€éããèæ
®ããå¿
èŠããããŸãã ç§ã®æšå¥šäºé
ã¯ãç°¡åãªãœãªã¥ãŒã·ã§ã³ããå§ããããšã§ãã
è©ŠããŠã¿ã䟡å€ã®ããredux-sagaã®ä»£æ¿ããããŸãã æã人æ°ã®ãã2ã€ã¯ã
redux-observable ïŒ
RxJSã«åºã¥ãïŒãš
redux-logic ïŒRxJSãªãã¶ãŒããŒã«ãåºã¥ããã
ä»ã®ã¹ã¿ã€ã«ã§ããžãã¯ãèªç±ã«èšè¿°ã§ããïŒã§ãã