ã¢ã¯ã·ã§ã³ã¿ã€ãã®åå空éã®é©åãªå®è£ ãèŠã€ããããã«çŽ1é±éãè²»ãããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒããªãã¥ãŒãµãŒãããã³ãã®åãã©ã³ãžã·ã§ã³ã®ãªã¹ãã®å®çŸ©ãä¿æãããã©ã³ãžã·ã§ã³ã¯ã©ã¹ã«åºã¥ããç¬èªã®å®è£ ãäœæããŸãããããã®ã¢ãããŒãã«ã¯æ¹æ³ãå¿ èŠã§ããã€ã©ãŒãã¬ãŒãã³ãŒããå€ããããšãéåžžã«åçŽãªã¢ã¯ã·ã§ã³ãããããããå Žåã«åé¡ãçºçããŸãã
ãã®ã¬ããä»ã®å€ãã®äŸã§èŠã€ããããšãã§ãããã¹ãŠã®äŸã§ã¯ããã®åé¡ã¯äœããã®çç±ã§åžžã«ç¡èŠãããŸãããããã¯ç§ãReduxã調ã¹å§ãããšãã«æåã«èŠã€ããåé¡ã§ããã
ããã§äœãã足ããŸãããïŒ è¡çªãåœåããã¢ã¯ã·ã§ã³ã¿ã€ãã¯ãããŸãããïŒ
誰ããäŸãæŽæ°ããŠããã®åé¡ã«ã©ã®ããã«å¯ŸåŠããããæããŠãããŸããããããšãæ£ããæ¹åã«åããŠãããŸããïŒ
ç§ã®ç¹å®ã®ã±ãŒã¹ã¯ãããã³ããšã³ãã«2ã€ã®å¥ã ã®ç®¡çããã«ãããããšã«é¢é£ããŠããŸãã 1ã€ã¯ãã¹ã¿ãŒçšã§ããã1ã€ã¯ã¹ãã¢ã®å¥ã ã®ã»ã¯ã·ã§ã³ïŒ "testerAccount"ã "customerAccount"ïŒã«ç¶æ ãä¿åããã顧客çšã§ãããã©ã¡ããADD_VIDEO_UPLOADãADD_COMMENTãªã©ã®åæ§ã®ããšãå®è¡ã§ããŸãã
ç§ã¯ããã§ããªãã®å©ããæ¬åœã«æè¬ããŸã:)
accountTypeãã¢ã¯ã·ã§ã³ã«å
¥ããŸããïŒ ã¬ãã¥ãŒãµãŒãã¡ã¯ããªãèšè¿°ããåãã³ãŒããäœåºŠã䜿çšããŠãããŸããŸãªã¢ã¯ã·ã§ã³ã«å¿çããã¬ãã¥ãŒãµãŒãçæããæ¹æ³ã«ã€ããŠã¯ã examples/real-world/reducers
ãåç
§ããŠãã ããã
åæ§ã«ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯åãªãé¢æ°ã§ãããä»ã®é¢æ°ã®æãè¿ãé¢æ°ãäœæã§ããããšãå¿ããªãã§ãã ããã
æ¢åã®äŸã§ã¯ç¡èŠãããŠãããšèšãåé¡ã®ç¹å®ã®å°ããªäŸãæäŸããŠããã ããã°ãæ¬åœã«åœ¹ç«ã€ãšæããŸãã
ãã®åŸããã®ç¹å®ã®äŸãåçŽåããæ¹æ³ãèŠã€ãããæäŒããããŸãã ã³ãŒããªãã§è³ªåã«çããŠç¹å®ã®äœããææ¡ããããšã¯éåžžã«é£ããã§ãã
@gaearonç§ã¯ããªããããã§ã©ãã«åãã£ãŠããã®ãç¥ã£ãŠããŸãããç§ã¯åå©çšå¯èœãªã¬ãã¥ãŒãµãŒãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒããŸãã¯DRYã®ãã®ãäœæããããšã¯ããŠããŸããããŸã£ããéã§ãã
ã¢ã¯ã·ã§ã³ã®ã°ã«ãŒããäºãã«åé¢ããããšããŠããã®ã§ã2人ã§ã·ã¹ãã ã®2ã€ã®ç°ãªãã»ã¯ã·ã§ã³ã§äœæ¥ããã¢ã¯ã·ã§ã³ã¿ã€ãåã«åå空éããªãããã«ã誀ã£ãŠäºãã®ã¬ãã¥ãŒãµãŒãããªã¬ãŒãå§ããªãããã«ããããšãã§ããŸãã
ããããããããæ確ã«ããããšãé¡ã£ãŠããŸãã
https://www.npmjs.com/package/flux-constantãcreateActionTypes
ãšããéåžžã«åçŽãªãã«ããŒé¢æ°ãšçµã¿åãããŠäœ¿çšââããããšã§ããããžã§ã¯ãã§ãã®åé¡ã解決ããŸããã
åºæ¬çã«ãç§ã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
// create-action-types.js
var fluxConstant = require('flux-constant');
module.exports = function (types) {
return fluxConstant.set(types);
};
// in foo-action-types.js
module.exports = createAtionTypes([
'ADD_FOO',
'REMOVE_FOO'
]);
// in some-store.js
var fooActionTypes = require('foo-action-types');
function (state, action) {
switch(action.type) {
case fooActionTypes.ADD_FOO:
case fooActionTypes.REMOVE_FOO:
}
}
ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã¿ã€ããå®æ°ãšããŠ1ãæã«ä¿æããŠã¿ãŸãããïŒ
次ã«ãåãååã2åãšã¯ã¹ããŒãã§ããªããããè¡çªããããšã¯ãããŸããã
ãããããããèŠèŠåããããã«ããããã¹ãã¢ã®åæç¶æ ã§ãããšããŸãããã
let initialState = {
"testerAccount": {
"videoUploads": [],
"messages": []
},
"customerAccount": {
"videoUploads": [],
"messages": []
},
"systemUserAccount": {
"videoUploads": [],
"messages": []
}
};
ãããã®ã»ã¯ã·ã§ã³ããšã«ãããªãŸãã¯ã¡ãã»ãŒãžãè¿œå ããããã®åå¥ã®ã¬ãã¥ãŒãµãŒãå®è£ ãããšãã«ãã¢ã¯ã·ã§ã³ã¿ã€ãåã®è¡çªãã©ã®ããã«åé¿ããŸããïŒ
@gaearonãææ¡ããŠããããšã¯ãåé¡ã®æ žå¿ã解決ãããã®ã§ã¯ãããŸãããæéã®çµéãšãšãã«ãå€ãã®åé¡ãåŒãèµ·ãã巚倧ãªã¿ã€ãã®ãã¡ã€ã«ã«ãªã£ãŠããŸãããããã¯ãããŒãã«ããã¢ãããŒãã«ãªããŸãã
ã³ãŒãã®ããŒãžäžã«ããã«åé¡ãçºçããŸãããåŸã§ååã®ããã¯ã§è§£æ±ºããå¿ èŠããããŸããäŸïŒ
ADD_VIDEO_UPLOADãADD_TESTER_VIDEO_UPLOADãADD_VIDEO_UPLOAD_IN_SOME_SECTIONãªã©ã
ããããŸã倧ããªé çã®çš®ã§ãã
@koulmomoããã¯ãŸãã«ç§ãæ¢ããŠãããã®ã§ããããããšãïŒïŒïŒ+ 1ïŒã·ã³ãã«ã§ãã¯ãã«ã§ãã
@gaearonãã®ããã±ãŒãžãŸãã¯redux-constantãšããååã®æ°ããããã±ãŒãžã®ããããã䜿çšããäŸãå°ãªããšã1ã€ããã¯ãã ãšæããŸããïŒ
ç§ã®æèŠã§ã¯ãåå空éã®åé¡ã解決ããããã¥ã¡ã³ã/äŸã®ã¢ãããŒããä¿é²ããããšãæ°ããããã©ã«ãã«ãªãã¯ãã§ãã
ããã§ããªãã®å©ããããããšã:)
ããªãã®äŸã§ã¯ã1ã»ããã®ã¿ã€ãã1ã»ããã®ã¬ãã¥ãŒãµãŒãžã§ãã¬ãŒã¿ãŒã1ã»ããã®ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒããªãçç±ãããããŸããã ã¢ã¯ã·ã§ã³ã«ã¯ãããããåºå¥ããããã®accountType
ããããã£ãå«ãŸããŸãã ã¢ã¯ã·ã§ã³ã®äœæè
ã¯ãããããã©ã¡ãŒã¿ãŒãšããŠåãå
¥ããŸãã ã¬ãã¥ãŒãµãŒãã¡ã¯ããªã¯accountType
ãåãå
¥ãããã®ã¢ã«ãŠã³ãã¿ã€ãã®ã¢ã¯ã·ã§ã³ã®ã¿ãåŠçããã¬ãã¥ãŒãµãŒãè¿ããŸãã
ããã§ã¯flux-constant
ãåªãããœãªã¥ãŒã·ã§ã³ã ãšã¯æããŸããã instanceof
ãã§ãã¯ã«äŸåããŠããããã§ãã ã€ãŸããã¢ã¯ã·ã§ã³ãã·ãªã¢ã«åããŠåŸã§åçããããšã¯ã§ããŸãããããã¯ãéã·ãªã¢ã«åãããã¿ã€ããçæãããã¿ã€ããšäžèŽããªãããã§ãã
人ã ã¯ãã°ãã°ãFluxã®æ¬è³ªçãªæ©èœãå£ããŠããããšã«æ°ä»ããã«ãFluxããããã·ã³ãã«ãã«ããããšã
ããªãã®äŸã§ã¯ã1ã»ããã®ã¿ã€ãã1ã»ããã®ã¬ãã¥ãŒãµãŒãžã§ãã¬ãŒã¿ãŒã1ã»ããã®ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒããªãçç±ãããããŸããã ã¢ã¯ã·ã§ã³ã«ã¯ãããããåºå¥ããããã®accountTypeããããã£ãå«ãŸããŸãã ã¢ã¯ã·ã§ã³ã®äœæè ã¯ãããããã©ã¡ãŒã¿ãŒãšããŠåãå ¥ããŸãã ã¬ãã¥ãŒãµãŒãã¡ã¯ããªã¯accountTypeãåãå ¥ãããã®ã¢ã«ãŠã³ãã¿ã€ãã®ã¢ã¯ã·ã§ã³ã®ã¿ãåŠçããã¬ãã¥ãŒãµãŒãè¿ããŸãã
ç§ã¯ããªãã®äŸã®æãããªå¯Ÿç§°æ§ã«èª€è§£ãããŸããã ããã«DRYããªãããšãæå³ããŠããããšãç解ããŸãããæ©èœã®å¯Ÿç§°æ§ã¯ã httpsïŒ //github.com/rackt/redux/issues/786#issuecomment-142649749ã§è¿°ã¹ãããã«ã®ã¿æããã§ãã
ããã«å³æžé€šã¯å¿
èŠãªããšæããŸãã 倧äŒãèšç«ãããïŒ ããšãã°ããµããããžã§ã¯ããŸãã¯æ©èœãéåžžã«åé¢ããŠããå Žåã¯ãã¢ã¯ã·ã§ã³ã¿ã€ãfeature/ACTION_TYPE
ãåŒã³åºãããšãã«ãŒã«ã«ããŸãïŒäŸïŒ testers/UPLOAD_VIDEO
ãŸãã¯customers/UPLOAD_VIDEO
ã ãããã®ãã°ã«ãŒãããå®éã«ãã£ã¹ã¯äžã®å®éã®ãã©ã«ãïŒãŸãã¯ããé©åãªããã±ãŒãžïŒã«å¯Ÿå¿ããŠããå Žåãããã¯ç¹ã«äŸ¿å©ã§ãã
éåã¯ã³ãŒãã¬ãã¥ãŒã§ç°¡åã«èŠã€ããããŸãã _æ¬åœã«_ãããå Žåã¯ããããèªååã§ããŸãããæåã®åå空éãäœãããããã®ãããããŸããã åã¢ãžã¥ãŒã«å ã§ãæ©èœãç°¡åã«å¶åŸ¡ããäœæ¥ã®å¶çºçãªéè€ãé²ããããã¥ã¡ã³ããšããŠããã¹ãŠã®å®æ°ã1ã€ã®ãã¡ã€ã«ã§å®£èšããå¿ èŠããããŸãã
ã³ãŒãåââå²ãåå空éåãããã¢ã¯ã·ã§ã³ã¿ã€ããªã©ã䜿çšããhuge-apps
äŸãè¿œå ããããšã«ããŸããããã ããããã¯å¥ã®åé¡ã«ãªããŸãã
æååã¯ãåå空éã«ãšã£ãŠæ¬è³ªçã«æªããã®ã§ã¯ãããŸããã URLã¯æååã§ãããæ£åžžã«æ©èœããŠããããã§ãã
@gaearonããã§ããflux-constantã«åºã¥ããœãªã¥ãŒã·ã§ã³ã§ã®ã·ãªã¢ã«åã®åé¡ãå¿ããŸããã
ååå ã®ã¢ãžã¥ãŒã«/åå空éãç°¡åã«åºå¥ã§ããéããæååããŒã¹ã®åå空éã«åé¡ã¯ãããŸããã
åœåèŠåããŒã¹ã®ãœãªã¥ãŒã·ã§ã³ã¯ãç§ã以åã«èŠããã®ã§ãã
https://github.com/erikras/ducks-modular-redux
ããããç§ã¯ããªãã®çµéšã«åºã¥ããŠããããè¡ãããã®ããè¯ããŸãã¯ãæ£ãããæ¹æ³ããããããããªãããšãæã¿ãŸããã
ãã©ãã¯ã¹å®æ°ã¢ãããŒãããå®éã«äœããã®æ¹æ³ã§ã·ãªã¢ã«åã§ãããã®ã«å€æããããšæããŸãã
ãã®ããã®æéãããã°ãã巚倧ãªã¢ããªãã®äŸãè¿œå ããŠãã ãããããã«ãããä»ã®äººã®æéãå€§å¹ ã«ç¯çŽã§ããåŸã§ç°¡åã«ãã©ããŒã§ããäœããã®èŠåã確ç«ã§ããå¯èœæ§ããããŸãã
ããããšãããããŸãã ïŒïŒ
ãããç³ãèš³ãããŸããããæ®å¿µãªããç§ã¯ãã°ããã®é倧ããªã¢ããªã«åãçµãã§ããŸããã§ããããããŠç§ãåãçµãã ãšãã§ãããäœãèµ·ãããã«ã€ããŠã®è¯ãæŠèŠãæäŸããã®ã§ãå®æ°ãã»ã¯ã·ã§ã³ã«ã°ã«ãŒãåãããåäžã®å·šå€§ãªãã¡ã€ã«ãããã®ãå®éã«å¥œãã§ããã¢ããªã§ã
@pbcãã§ãã¯ã¢ãŠãhttps://gist.github.com/jhewlett/acceb0e84bf043c17b66
ãã®ãåé¡ããããã¥ã¡ã³ãã§ãã詳现ã«èª¬æãããŠããã®ãèŠãŠã¿ãããšæããŸãã @pbcã®ãããªåã質åããããŸãã ããã¹ãŠã®ã¢ã¯ã·ã§ã³ã¿ã€ããå®æ°ãšããŠ1ãæã«ãŸãšããŠã¿ãŸãããïŒããšã¯æããŸããã ãããžã§ã¯ãéã§è€æ°ã®ã¢ãžã¥ãŒã«ãåå©çšãããèŠåã確ç«ããããšããæšå¥šäºé ãããå Žåã«æ©èœããŸãã CSSã©ã³ãã®BEMã®ãããªãã®ã«éåžžã«ãã䌌ãŠããŸãã ãã ããBEMããCSSã¢ãžã¥ãŒã«ã«ç§»è¡ãã倧ããªãããžã§ã¯ãã®ã¢ã¯ã·ã§ã³ã¿ã€ãã«ãããã·ã¥ã¯ã©ã¹åãå¿ èŠãªCSSã¢ãžã¥ãŒã«ã«äŒŒããã®ãæšæž¬ããŸãã
ç§ã®ç¥ãéããã·ãªã¢ã«åãšç«¶åã®æ¬ åŠã®äž¡æ¹ãéæããæ¹æ³ã¯ãããŸããã
åå©çšå¯èœãªã¢ãžã¥ãŒã«ã®é©åãªèŠåã§ã¯ããªããŒã¹ãã¡ã€ã³åãgithubã®ãŠãŒã¶ãŒå/ãªããžããªãnpmã®ç»é²æžã¿ã¢ãžã¥ãŒã«åãªã©ãæ¢åã®ãäžææ§ãããã€ããŒãã䜿çšã§ããŸãã
ç·šéïŒCSSã¢ãžã¥ãŒã«ã¯ãCSSã®äžã«ã«ã¹ã¿ã èšèªãå®çŸ©ããååŠçäžã«ã¯ã©ã¹åã®åã«ä»ããããšã«ãã£ãŠãããè¡ããŸãïŒãšã«ããæ £äŸã«èŠçŽãããŸãããçæããããã®ã§ãïŒã
質åãšãã£ã¹ã«ãã·ã§ã³ã¯+1ã ç§ã¯ãŸãã @ pbcãšããŠãã®æ£ç¢ºãªåé¡ã«å€ãã®èŠåŽãã
ã·ãªã¢ã«åå¯èœãªæååã¢ã¯ã·ã§ã³ã¿ã€ãã®è§£æ±ºçãèŠã€ãããšæããŸãã ããã¯ç§ãã¡ã®ç²Ÿç¥ãäœãã«äººçºçãªå¶éã課ãç¶æ³ã®1ã€ã ãšæããŸãã
åºæ¬çãªèãæ¹ã¯ãåå®æ°ãæååå€ã«é¢é£ä»ããå¿ èŠããªããšããããšã§ãã ãããã£ãŠãã©ã³ãã ã«çæãããå€ãããã·ã¥ããããã¡ã€ã«ãã¹ããŸãã¯åå®æ°æååå€ã«åºæã®ãã®ä»ã®ãã®ã䜿çšã§ããŸãã ã¬ãã¥ãŒãµãŒã§ã¯ãåå®æ°ãååã§ã€ã³ããŒãããååã§æ¯èŒããŸãã ãã®ååã¯ä»ã®ã¢ã¯ã·ã§ã³ãä»ã®ã¬ãã¥ãŒãµãŒã§äœ¿çšãããå¯èœæ§ããããŸãããå€ã¯åãã§ã¯ãªããããåé¡ã§ã¯ãããŸããã
ããã§ã®äŸïŒ https ïŒ
ããã¯è³¢æã§ãã ã¢ã¯ã·ã§ã³åã«äººéãèªããéšåãæ®ãããå Žåã§ããäžæã®ãã¬ãã£ãã¯ã¹ãçæããããšã¯å®å šã«æ©èœããŸãã
ãã¡ããããããããŠããŒã¯ã§ããããšã蚌æã§ããã°ã
æåã®æ¹æ³ã¯ãæ¢åã®äžææ§ãããã€ããŒïŒéãã¡ã€ã³åãŸãã¯npmã¢ãžã¥ãŒã«åïŒã䜿çšããããšã§ãã
æ £äŸã«ããåå空éã¯ãã¢ãžã¥ãŒã«ãäœæãããšãã«ãå¶åŸ¡ã§ããªãããŸããŸãªå Žæã§äœ¿çšã§ããå±éºããããŸãã
ActionTypeããAreaãã®ã¢ãžã¥ãŒã«ãGeometryãããããšããŸãã ãã®ã¢ãžã¥ãŒã«ã¯2ã€ã®å Žæã§äœ¿çšãããŸãã
ããã§ãã¢ãžã¥ãŒã«ã䜿çšãããå Žæã«å¿ããŠã2ã€ã®ç«¶åããåå空éãã§ããŸããã
ç§ã¯æ¬¡ã®ãã¿ãŒã³ã§å®éšããŠããŸãïŒ
以äžãå«ãã³ã¬ã¯ã·ã§ã³ã®ã¿ã€ãããšã«ãã£ã¬ã¯ããªãäœæããŸãã
次ã®åœ¢åŒã§constãäœæããŸãã
// song-store/song-store-consts.js
export const ADD = 'SONG_STORE.ADD'
export const REMOVE = 'SONG_STORE.REMOVE'
ã¬ãã¥ãŒãµãŒãäœè³ã®å®æ°ãŸãã¯ã¢ã¯ã·ã§ã³ã䜿çšããå Žåã¯import
ããããæã€ãã¹ãŠã®*
ïŒ
// song-store/song-store-actions.js
import * as SONG_STORE from './song-store-consts'
export function addSongStore(name) {
return {
type: SONG_STORE.ADD,
name
}
}
export function removeSongStore(songStoreId) {
return {
type: SONG_STORE.REMOVE,
songStoreId
}
}
æ²ããããšã«ãæšã®æºãã«ã¯åããŠããŸããã ES6ãèš±å¯ãããŠããã°ããã§ãããïŒ
import { ADD, REMOVE } as SONG_STORE from './song-store-actions'
Webpack2ãimport *
ãã€ã³ããªãžã§ã³ãã«ããªãŒã·ã§ã€ã¯ã§ãããã©ããã¯èª°ã§ãç¥ã£ãŠããã®ã§ã *
ã€ã³ããŒãããããšããŠã䜿çšãããªããšã¯ã¹ããŒãã®ã³ãŒãã¯ãã³ãã«ãããŸããã
ããã¯éåžžã«äžè¬çãªåé¡ã®ããã§ããã次ã®ããããã®å Žåã«é »ç¹ã«çºçããŸãã
ç§ãã¡ã¯ããã€ãã®ç°ãªã解決çãè©ŠããŸããããäœãåºå·ããŠããªãããã§ããïŒ
éå»æ°ãæéå®éšããåŸããã£ã¬ã¯ããªæ§é ã䜿çšããŠã¢ã¯ã·ã§ã³ã¿ã€ãã«åå空éãä»ããããšã«ããŸããã ããããæåã§å
¥åãããšå€ããªãã®ã§ã __filename
äœããããããšããŸããããã³ãŒãã®ãã³ãã«ãªã©ãåå ã§æ©èœããŸããã次ã«ãããŒã¯ãŒã__filenamespace
ãå€æããæåã®Babelãã©ã°ã€ã³ãäœæããŸããã __filenamespace
ãéçæååã«å€æããŸããããã¯ããŸãæ©èœããŠããããã§ãã
App/testerAccount/index.js
ïŒ
// Something like this
const ADD_VIDEO_UPLOAD = `${__filenamespace}/ADD_VIDEO_UPLOAD`;
const ADD_COMMENT = `${__filenamespace}/ADD_COMMENT`;
// Will be transformed into something like this
const ADD_VIDEO_UPLOAD = 'App/testerAccount/ADD_VIDEO_UPLOAD';
const ADD_COMMENT = 'App/testerAccount/ADD_COMMENT';
ãæ°è»œã«ãè©Šããã ãããã圹ã«ç«ãŠã°å¹žãã§ãã ç¹ã«ãåé¡ã®äœæè ããã³ã©ã€ãã©ãªã®äœæè ãšããŠ@pbcãŸãã¯@gaearonãããã£ãŒãããã¯ãåŸãã®ã¯çŽ æŽãããããšã§ãã
ç§ã¯èª°ãããæšæºããæäŸããããšãæ¬åœã«æãã§ããŸããã ãã®ããã«ã·ã³ãã«ããªããžã§ã¯ãã¯å¿ èŠãããŸãããå¿ èŠãªã®ã¯èŠåã ãã§ãã
"featureName$actionType"
ãŸãã¯"fileName/ACTION_TYPE"
ãŸãã¯"PROJECT.FEATURE.ACTION"
ãŸããïŒ ç§ãã¡å
šå¡ãäœãã«åæã§ããã°ãã¬ãã¥ãŒãµãŒãå
±æããã®ã¯ç°¡åã«ãªããŸãã
ä»ã®å©çšå¯èœãªèŠåãäžè¶³ããŠãããããã¢ãã«ã¯äºå®äžã®æšæºã«ãªã£ãŠãããšæããŸãã
const ACTION = 'app/feature/ACTION';
ã§ååã§ãã
@gaearonã¯åžžã«ãã¢ã¯ã·ã§ã³ãšã¬ãã¥ãŒãµãŒã®1ïŒ1ã®é¢ä¿ã¯ããããæªãèãã§ãããšè¿°ã¹ãŠãããç§ã¯æ¬åœã«åæããŸãã ãããã2ã€ã®ç°ãªããã¥ãŒãå®éã«åãã¬ãã¥ãŒãµãŒãåŒã³åºãããå Žåã¯ã©ãã§ããããã
äŸãã°ã åçŽãªèšå®åãæ¿ãã¯ã2ã€ã®ç°ãªãå Žæããæå¹ãŸãã¯ç¡å¹ã«ã§ããŸãã
/ myaccount / toggleNotification
/ dashboard / toggleNotification
ãããã£ãŠãåãå
容ã§2ã€ã®ã¬ãã¥ãŒãµãŒãäœæããå¿
èŠããããŸã
ã¬ãã¥ãŒãµãŒ/notifications.js
ccïŒ @ samit4me ã philholden
å¥ã®èãã§ã¯ãããã¯ããã¡ã€ã«å
ã«2ã€ä»¥äžã®ã¬ãã¥ãŒãµãŒãç°ãªãã¢ã¯ã·ã§ã³åã§åããžã§ããå®è¡ãããšããè¯ãèãã ãšæããŸãã ããã¯ãã¬ãã¥ãŒãµãŒãèŠãã ãã§ãç¹å®ã®ç¶æ
ãããã€ã®ç°ãªãå Žæããå€æŽãããŠããããç解ã§ããæ¹æ³ã§ãã
ãšã«ãããå°é家ããèããŠã¿ããã§ãã ããããšãã
@ivks ïŒããã«ããã€ãã®èãããããŸãã
ãŸããã¢ããªã±ãŒã·ã§ã³å ã®è€æ°ã®å Žæããåãã¢ã¯ã·ã§ã³ããã£ã¹ãããã§ããŸãã
次ã«ãåãã¬ãã¥ãŒãµãŒã§è€æ°ã®ã¢ã¯ã·ã§ã³ã¿ã€ãããªãã¹ã³ããããããåãæ¹æ³ã§åŠçããããšãã§ããŸãã
第3ã«ãã1ïŒ1é¢ä¿ãã®åŽé¢ã¯ãè€æ°ã®ã¹ã©ã€ã¹ã¬ãã¥ãŒãµãŒãåãã¢ã¯ã·ã§ã³ããªãã¹ã³ãããããããç¶æ ã®ããããåå¥ã«æŽæ°ã§ããããã«ããããšã§ãã ã¯ããã»ãšãã©ã®å Žåãç¹å®ã®ã¢ã¯ã·ã§ã³ãæ°ã«ããã¬ãã¥ãŒãµãŒã¯1ã€ãããªãå ŽåããããŸãããè€æ°ã®ã¬ãã¥ãŒãµãŒãå¿çãããããšã¯ãReduxã®æå³ããããŠãŒã¹ã±ãŒã¹ã§ãã
@markerikson
次ã«ãåãã¬ãã¥ãŒãµãŒã§è€æ°ã®ã¢ã¯ã·ã§ã³ã¿ã€ãããªãã¹ã³ããããããåãæ¹æ³ã§åŠçããããšãã§ããŸãã
ç§ã¯å®éã«redux-actionsã䜿çšããŠããŸããããã¿ã¹ã¯ãå®è¡ãããŠãŒãã£ãªãã£ã¡ãœããcombineActionãããããšãç¥ããŸããã§ããã ã¡ããã©ãããèŠã€ããŠãããªãã®äžèšã®å£°æã¯ã¡ããã©åãããšãè¿°ã¹ãŠããŸãã ïŒãã£ãšæ確ã«ãã¹ãã ã£ããããããªããïŒ
è¿ä¿¡ããããšãããããŸãã
DucksãActionTypesã§æ£ããå®çŸ©ãããŠãããšã¯æããŸããã
npm-module-or-app / reducer / ACTION_TYPEã®åœ¢åŒã®ã¢ã¯ã·ã§ã³ã¿ã€ããå¿ èŠã§ã
ãã®çç±ã¯ã1ã€ã®ã¢ã¯ã·ã§ã³ãè€æ°ã®ã¬ãã¥ãŒãµãŒã«ãã£ãŠãµãã¹ã¯ã©ã€ããããå¯èœæ§ãããããã§ãã @mherodevãèšã£ãããã«ã const ACTION = 'app/feature/ACTION';
æ¹ãçã«ããªã£ãŠããŸããããã«ãã¢ã¯ã·ã§ã³ã®ã¹ããŒãconst ACTION = 'action://app/feature/ACTION';
ãè¿œå ããããšæã
ã¢ã¯ã·ã§ã³ã¿ã€ããèå¥ããããã«ãã°ããŒãã«ã«èªå·±å¢åããæŽæ°ã䜿çšããªãã®ã¯ãªãã§ããïŒ äŸãã°
let id = 0
function generateActionType (label /* for readability */) {
id++
return `app/feature/${id}/${label}`
}
ããã«ã€ããŠå°ãèããŠãä»ã®éçºè ãšè¡çªããªãããã«ããããã«ããã£ã¬ã¯ããªã調ã¹ãlintã«ãŒã«ãäœæããŠããŸãïŒãã¹ãŠã®ã¬ãã¥ãŒãµãŒããããåã¬ãã¥ãŒãµãŒã«ã¯å®æ°ãšããŠç¬èªã®ã¢ã¯ã·ã§ã³ã¿ã€ãããããŸãïŒ
åãå€ã®å®æ°ã2ã€ããå Žåã«éåãå ±åããããã«ããªã³ãã£ã³ã°ãèšç»ããŠããŸãã
äœãææ¡ãããã°ãç§ã«ç¥ãããŠãã ãã:)
æãåèã«ãªãã³ã¡ã³ã
æååã¯ãåå空éã«ãšã£ãŠæ¬è³ªçã«æªããã®ã§ã¯ãããŸããã URLã¯æååã§ãããæ£åžžã«æ©èœããŠããããã§ãã