ã¬ãã¥ãŒãµãŒã®ããã¥ã¡ã³ãã§ã¯ã次ã®ããã«è¿°ã¹ãŠããŸãã
Sometimes state fields depend on one another and more consideration is required, but in our case we can easily split updating todos into a separate function..
ãã®ç¹å®ã®ãŠãŒã¹ã±ãŒã¹ãåŠçããæ¹æ³ãç¥ãããã®ã§ããã äŸãæãããšãè€æ°ã®ããŒã¿ãã£ãŒã«ããæã€ãã©ãŒã ããããšããŸãã ãã©ãŒã ã®å€æŽã«å¯Ÿå¿ããå¿ èŠã®ããå¥ã®ã³ã³ããŒãã³ããä»ã«ãããŸããããšãã°ããã©ãŒã ããŒã¿ãæå¹ãã©ããã«åºã¥ããŠç¶æ ãå€æŽãããããã©ãŒã ãžã®ããŸããŸãªå ¥åããå€ãèšç®ããŠè¡šç€ºãããããŸãã
ããŸããŸãªã¬ãã¥ãŒãµãŒïŒç¶æ ããªãŒã®ããŸããŸãªã¹ã©ã€ã¹ãåŠçããïŒã«åãã¢ã¯ã·ã§ã³ããªãã¹ã³ãããŠæŽæ°ãããããšãã§ãããšæããŸãããããªã¢ã¯ãã£ããç¶æ ã¯ãç¶æ ããªãŒã®ä»ã®ãã©ã³ãã«ã¢ã¯ã»ã¹ã§ããŸãããèªåèªèº«ãèšç®ããŸãã
ç§ãèãã解決çã®1ã€ã¯ããµãã¹ã¯ã©ã€ãã䜿çšããŠç¶æ ããªãŒã®å€æŽããªãã¹ã³ããé¢é£ããå€æŽãè¡ããããã©ãããèšç®ããŠãããæ°ããã¢ã¯ã·ã§ã³ããã£ã¹ãããããŠäŸåãã£ãŒã«ããæŽæ°ããããšã«ããããåå¿ãããã»ã¹ãå®è¡ããããšã§ãã ãã ãããã®ãããªãã·ã³ã°ãã©ã¹ãã¯éåžžã«äžè¬çãªãã®ã«ããå¿ èŠãããå ŽåããããŸããããã«ããããããæ°ã«ãããã¹ãŠã®ã¬ãã¥ãŒãµãŒã¯ãä»å±ã®ãã€ããŒãã䜿çšã§ããããã«ãªããŸãã
ç§ã¯ReduxãåããŠäœ¿çšããã®ã§ããã®çš®ã®ãã¿ãŒã³ãæ¡çšãããŠãããã©ããã¯ããããŸããã æ£ããæ¹åãžã®ã¢ããã€ã¹ãã¢ããã€ã¹ãããã ããã°å¹žãã§ãã ããããšãã
ç³ãèš³ãããŸããããç§ãçºèŠããä»ã®ãªãã·ã§ã³ã¯ãã«ã¹ã¿ã rootReducerã䜿çšããããšã§ãã æè¡çã«ã¯ããã®ã¬ãã¥ãŒãµãŒã¯ã«ãŒãã«ããå¿ èŠã¯ãããŸããã ããã¯ãçžäºã«äŸåããŠããç¶æ ããªãŒã®éšåã®æãäœãå ±éç¥å ã§ããå¯èœæ§ããããŸãã
ããŒã¿ããããå°ãªããç¶æ ããèšç®ã§ããå Žåã¯ããã®ç¶æ ã«ä¿æããªãã§ãã ããã 掟çããŒã¿ã®èšç®ã§èª¬æãããŠããããã«ãã¡ã¢åãããã»ã¬ã¯ã¿ãŒã䜿çšããŸãã
å®éã«ãããã§ããªãå Žåã¯ãïŒå¿ èŠã«å¿ããŠïŒè¿œå ã®ãã©ã¡ãŒã¿ãŒãã¬ãã¥ãŒãµãŒã«æž¡ããããã®çµæã䜿çšã§ããåäžã®ã¬ãã¥ãŒãµãŒã䜿çšããŸãã
function a(state, action) { }
function b(state, action, a) { } // depends on a's state
function something(state = {}, action) {
let a = a(state.a, action);
let b = b(state.b, action, a); // note: b depends on a for computation
return { a, b };
}
ãã®ã¹ããããã@gaearonã«æè¬ããŸãã ãŠã£ãžã§ãããreduxã«ç§»æ€ããããšãããšãã«ãç§ã¯ããã«ãã®åé¡ã«ééããã³ãã¥ããã£ãèªå¯ãã解決çãèŠã€ããããã«ãã°ããæéãè²»ãããŸããã ããããããã¯ãäŸåç¶æ ãæã€ããšãããªãäžè¬çã§ãããšç§ãæ³åããã®ã§ãããã¥ã¡ã³ãå ã§ããç®ç«ã€å¯èœæ§ããããã®ã§ãã
ãŸãã combineReducers
é¢æ°ã®å
éšã§ãç¶æ
ããªãŒå
šäœããªãã·ã§ã³ã®3çªç®ã®ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãã®ã¯ç°¡åãªããã§ãã ããããããšã§ããã®åé¡ã容æã«ãªããŸãããreduxã®çµéšãååã§ãªãããããè¯ãã¢ã€ãã¢ãæªãã¢ã€ãã¢ããå€æããããšã¯ã§ããŸããã èãïŒ
ããã¥ã¡ã³ãã«ã¯ç¬èªã®ã»ã¯ã·ã§ã³ãããã®ã§ãå人çã«ã¯ããªãç®ç«ã€ãšæããŸãã ïŒã¹ãã€ã«ïŒ
䜿çšããããªãå Žåã¯ã combineReducers
ããå¿
èŠã¯ãããŸããã ããã¯äŸ¿å©ãªãŠãŒãã£ãªãã£ã§ãããå¿
é ã§ã¯ãããŸããã ããããã reduce-reducersãŸãã¯redux-actionsã®æ¹ãããªãã®ã¹ã¿ã€ã«ã§ããïŒ
ããŒã¿ããããå°ãªããç¶æ ããèšç®ã§ããå Žåã¯ããã®ç¶æ ã«ä¿æããªãã§ãã ããã
ããã¥ã¡ã³ãã«ã¯ç¬èªã®ã»ã¯ã·ã§ã³ãããã®ã§ãå人çã«ã¯ããªãç®ç«ã€ãšæããŸãã
ããããŸãããç§ã¯ãããæçµçã«ç§ã®ããã«ã¯ãªãã¯ãããšæããŸãã ããããšãïŒ
ãããŒã¿ããããå°ãªããç¶æ ããèšç®ã§ããå Žåã¯ããã®ç¶æ ã§ä¿æããªãã§ãã ãããã
ã¢ã¯ã·ã§ã³ã®ãã€ããŒããšçµã¿åããããããå°ãªããç¶æ ããã®ã¿ããŒã¿ãèšç®ã§ããå Žåã¯ã©ããªããŸããïŒ
åãã©ã³ãã§çžäºã«æä»çãªæ¹æ³ã§åŠçã§ããªãåäžã®ã¢ã¯ã·ã§ã³ã®åœ±é¿ã解決ããããã«ç¶æ
ããªãŒã®ããŸããŸãªéšåãå¿
èŠãªå Žåã¯ã reduce-reducers
ã䜿çšããŠã combineReducer
ã«ãã£ãŠçæãããã¬ãã¥ãŒãµãŒã暪æçãªã¬ãã¥ãŒãµãŒïŒ
export default reduceReducers(
combineReducers({
router: routerReducer,
customers,
stats,
dates,
filters,
ui
}),
// cross-cutting concerns because here `state` is the whole state tree
(state, action) => {
switch (action.type) {
case 'SOME_ACTION':
const customers = state.customers;
const filters = state.filters;
// ... do stuff
}
}
);
@neverfoxããããšãããããŸãïŒ ãŸãã«ç§ãæ¢ããŠãããã®ã çµåãããã¬ãã¥ãŒãµãŒããã«ãŒãç¶æ ã«ã¢ã¯ã»ã¹ããããäœããåæ§ç¯ããä»ã®æ¹æ³ãç¥ã£ãŠããŸããïŒ
@imton
ããªãã®ç¹å®ã®äŸã§ã¯ããªãç°ãªãã¬ãã¥ãŒãµãŒã«åãã¢ã¯ã·ã§ã³ãåŠçãããããªãã®ãããããŸããã ãããReduxã䜿çšãããã€ã³ãã§ãã https://gist.github.com/imton/cf6f40578524ddd085dd#gistcomment-1656424ãåç §ããŠ
ã暪æçãªãã¬ãã¥ãŒãµãŒã¯äžè¬çã«è¯ãèãã§ã¯ãªããšæããŸãã ãããã¯åã ã®ã¬ãã¥ãŒãµãŒã®ã«ãã»ã«åãç ŽããŸãã ã¬ãã¥ãŒãµãŒã®å€éšã«ããä»ã®ã³ãŒããããã«äŸåããŠããå¯èœæ§ããããããå éšç¶æ ã®åœ¢ç¶ãå€æŽããã®ã¯å°é£ã§ãã
å察ã«ãã¬ãã¥ãŒãµãŒèªäœãé€ããŠãç¶æ
ã®åœ¢ç¶ã«äŸåããªãããšããå§ãããŸãã ã¬ãã¥ãŒãµãŒãšåããã¡ã€ã«ãããã»ã¬ã¯ã¿ãŒãïŒç¶æ
ãç
§äŒããé¢æ°ïŒããšã¯ã¹ããŒããããšãã³ã³ããŒãã³ãã§ããç¶æ
ã®åœ¢ç¶ã«äŸåããããšãåé¿ã§ããŸãã ãã®ã¢ãããŒãã®ãªããžããªã®shopping-cart
äŸã確èªããŠãã ããã
æ確ã«ããããã«ãç§ã¯çžäºã«æä»çã§ã¯ãªãå Žåãã€ãŸããã¯ãã¹ã«ããã£ã³ã°ã¬ãã¥ãŒãµãŒã®ã¿ãææ¡ããŠããŸããã åãã¢ã¯ã·ã§ã³ã«å¿çããåå¥ã®ã¬ãã¥ãŒãµãŒã ãã§åŠçããããšã¯ã§ããŸããã ããšãã°ãã¢ã¯ã·ã§ã³ãçºçããããªãŒã®1ã€ã®ãã©ã³ãïŒéåžžã¯ã¬ãã¥ãŒãµãŒAã«ãã£ãŠåŠçãããïŒããããã€ãã®ããŒã¿ãååŸããå¥ã®ãã©ã³ãïŒéåžžã¯ã¬ãã¥ãŒãµãŒBã«ãã£ãŠåŠçãããïŒããããã€ãã®ããŒã¿ãååŸãããããã®çµã¿åããããããã€ãã®æ°ããç¶æ ããŒã¿ãå°åºããå¿ èŠããããŸããäž¡æ¹ïŒããããå¥ã®ç¶æ ãã©ã³ãCã«æ ŒçŽãããŸãïŒã ç¶æ ã®åœ¢ç¶ããªãã¡ã¯ã¿ãªã³ã°ããããããŒã¿ãè€è£œããããã以å€ã«ãããè¡ãæ¹æ³ãããå ŽåïŒããã¯åžžã«å®è¡å¯èœãŸãã¯æãŸãããšã¯éããŸããïŒãã¢ããªãæé·ããŠæ°ãããšãã«ãã®ãããªç¶æ³ãé »ç¹ã«çºçãããããç§ã¯ç¢ºãã«ææ¡ãåãå ¥ããŸãå ã®ç¶æ ã®èšèšã«ã¯åæ ãããªãã£ãæ©èœãä»å±ããŠããŸãã
掟çããŒã¿ãèšç®ããã«ã¯ãç¶æ ããªãŒã«æ ŒçŽããã®ã§ã¯ãªããã»ã¬ã¯ã¿ãŒã䜿çšããããšããå§ãããŸãã
ãããå·ã®äžéšã§ããå¿ èŠããããŸã§ãããã¯çŽ æŽããããŠäŸ¿å©ã§ãã
ãããŒãºããšã¯ã©ãããæå³ã§ããïŒ ããªããèšåããŠããç¹å®ã®ã·ããªãªã説æã§ããŸããïŒ
@gaearon ã次ã®ã·ããªãªã«ã€ããŠã®ããªãã®èããèããŠèå³ããããŸã...
ãã¹ã¯ãŒããã£ãŒã«ãã«charsãå
¥åãããšã password
ç¶æ
ããããã£ã«å¯ŸããŠæ¬¡ã®æ€èšŒã«ãŒã«ãå®è¡ãããŸãã
password
ã¹ããŒã¹ã¯ãããŸããïŒusername
ã¯password
ã§ããïŒäžèšã®ããããã«è©²åœããå Žåã¯ã察å¿ããç¹å®ã®ããŒãžã¬ãã«ã®ãšã©ãŒã¡ãã»ãŒãžãšãšãã«ããŒãžã¬ãã«ã®ãšã©ãŒã衚瀺ããããšã©ãŒã«ãã£ãŠã¯ããã£ãŒã«ãã¬ãã«ã®ãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããå ŽåããããŸãã
ç§ã¯ã®ããã«3ã€ã®ã¬ãã¥ãŒãµãŒãå1ãæã£ãŠããŸãã®ã§ã username
ãšpassword
ãåçŽã«æååå€ãä¿æããããã«ããããŠ1ã®ããã®notification
ãããŒãžã¬ãã«ã®ãšã©ãŒéç¥åŠçããmessage
ããã³type
ïŒ
// reducers/notifcation.js
import { ENTER_PASSWORD } from "../../actions/CreateAccount/types";
import strings from "../../../../example/CreateAccount/strings_EN";
const DEFAULT_STATE = {
type: '',
message: ''
};
export default (state = DEFAULT_STATE, action) => {
const { value: password, type } = action;
if (type === ENTER_PASSWORD) {
const errors = strings.errors.password;
let message;
if (password.length <= 3) {
message = errors.tooShort;
} else if (password.indexOf(username) !== -1) {
message = errors.containsUsername;
} else if (password.indexOf(' ') !== -1) {
message = errors.containsSpace;
}
if (message) {
return {
message,
type: 'error'
};
}
}
return DEFAULT_STATE;
};
ãããã£ãŠããã®å Žåã notification
ã¬ãã¥ãŒãµãŒã¯username
ãšpassword
ã«ã€ããŠç¥ãå¿
èŠããããŸãã password
ã¢ã¯ã»ã¹ã§ããã®ã¯ããããå«ãENTER_PASSWORD
ã¢ã¯ã·ã§ã³ã¿ã€ãã«é¢ä¿ããŠããããã§ãããçŸåšæŽçãããŠããããã username
ãšpassword
ååŸã§ããŸãããäžç·ã«ENTER_USERNAME
ã¢ã¯ã·ã§ã³ã¿ã€ãããã§ãã¯ããŠããã§ã«password
ãå
¥åããŠããããšã確èªããŠããããŠãŒã¶ãŒåãã£ãŒã«ãã«æ»ã£ãŠusername
ãå€æŽããå¿
èŠããããŸãã ã次ã«ã password
ã«æŽæ°ãããusername
ãå«ãŸããŠããªãããšã確èªããŸã...ããããä»ã¯ãããã¹ãããã§ããŸãã
èãïŒ
1ã€ã®è§£æ±ºçã¯ã username
ãšpassword
ãcredentials
ãšããŠã°ã«ãŒãåãã ENTER_PASSWORD
ãšENTER_USERNAME
ã¢ã¯ã·ã§ã³ã¿ã€ãã1ã€ã®ENTER_CREDENTIALS
ããŒãžããããšã§ãã
redux-formãšããããã®ãããªã·ããªãªãã©ã®ããã«åŠçããããèŠãŠãã ããã äžè¬çã«ããããããStackOverflowã§è³ªåããæ¹ãè¯ãã§ãããã å¿ããã®ã§ãä»ã¯é·ãçããåºããŸããã
ç§ã¯combineSectionReducersãäœæã
combineReducers
'ã®ããã«ããã解決ããŸãã
å€åããã«ã€ããŠäœãç¥ã£ãŠããŸããïŒ @gaearon https://github.com/omnidan/redux-undo/issues/102
ããããšãïŒ
@gaearon @neverfoxãšã®è©±ãåãã¯çªç¶åæ¢ããŸãããã圌ã®æå³ã¯ããã£ãŠãããšæããŸããåãåé¡ã«ééããŸããã
combineReducers
ãšç¶æ
ãã©ã³ãchat
ããã³ui
ã䜿çšããŠæ§æãããã«ãŒãã¬ãã¥ãŒãµãŒããããšããŸãã chat
åºæã®ã¬ãã¥ãŒãµãŒã®å
éšã§ã¯ãã¢ã¯ã·ã§ã³ã«åå¿ããå¿
èŠããããŸã_ïŒããšãã°ããµãŒããŒããæ°ããã¡ãã»ãŒãžãåä¿¡ããŸããïŒ_ ui
éšåããã®ç¶æ
ã«å¿ããæ¹æ³ã§_ïŒããšãã°ãæ°ããã¡ãã»ãŒãžãè¿œå ããŸãïŒ msgsãªã¹ãã®æåŸããã¥ãŒããŒãã«ããå Žåã«ã®ã¿msgs-ãã®æ
å ±ã¯ui
éšåã«ä¿æãããŸãïŒ_ã ç§ãã¡ã¯ãããç¶æ
ãã¢ã¯ã»ã¹ãã§ããŸããui
å
éšã®ãã©ã³ãchat
æ-ãããã£ãŠãããã¯ãã»ã¬ã¯ã¿ã䜿çšããããšã¯äžå¯èœã§ãã
ç§ã®é ã«æµ®ããã æåã®è§£æ±ºçã¯ãå°çšã®ãµã³ã¯ã§æ¡ä»¶ä»ãã®éšåãå®è¡ãããã®å Žæãã2ã€ã®å°çšã®ã¢ã¯ã·ã§ã³ã®ããããããã£ã¹ãããããããšã§ããã ãã ããããã«ããããã€ãã®è¿œå ã®äœæãå°å ¥ããããããäœãèµ·ãã£ãŠããã®ããããªããããã«ãããªããŸãã
ãã®ããã @ neverfoxã®ãœãªã¥ãŒã·ã§ã³ãæãã¯ãªãŒã³ãªãœãªã¥ãŒã·ã§ã³ã ãšæããŸãããããªããèšã£ãããã«ãã«ãã»ã«åã¯ç ŽãããŸãã ç§ãäžã§ããããã«åé¡ãè¿°ã¹ãåŸãããªãã¯ãã®åé¡ã«ã€ããŠä»ã®æèŠ/解決çãæã£ãŠããŸããïŒ
@jalooc ïŒRedux FAQã¯ã httpïŒ //redux.js.org/docs/FAQ.html#reducers-share-stateã§ãã®åé¡ã«ã€ããŠèª¬æããŠããŸãã
åºæ¬çã«ãäž»ãªãªãã·ã§ã³ã¯ãã¢ã¯ã·ã§ã³ã§ããå€ãã®ããŒã¿ãæž¡ãããŸãã¯ãAããååŸããŠBã«æž¡ãããšãèªèããŠããã¬ãã¥ãŒãµãŒããžãã¯ãäœæãããã§ãã ã¬ãã¥ãŒãµãŒäžå¿ã®ã¢ãããŒããéžæããå Žåã @ neverfoxã®ã¢ãããŒãããããåŠçããããã®æè¯ã®æ¹æ³ã§ãããš
ç§ã¯ãŸããïŒ1784ã§ãã¬ãã¥ãŒãµãŒã®æ§é åã«é¢ããæ°ããããã¥ã¡ã³ãã®ã»ãããäœæããŠããæäžã§ãã æ°ããããŒãžã®1ã€ã¯ããã®æŠå¿µã«å
·äœçã«åãçµãã§ããŸã- ã combineReducers"
è¶
ããŠã ã
ãã©ããããã¥ã¡ã³ãããŒãžãšãã®ãããã¯å šè¬ã«ã€ããŠãããã«ãã£ãŒãããã¯ããå¯ããã ããã
ããã§äººã
ãèšãããšã¯äœã§ãã ç§ã¯ã人ã
ãéåžžçŽé¢ããåé¡ã¯ã圌ããçæ³çã§ã¯ãªãæ¹æ³ã§åœŒãã®ç¶æ
ãèšèšãããšãã ãã§ãããšåŒ·ãçã£ãŠããŸãã ç¶æ
ããªãŒã®ãã©ã³ãéã«å€ãã®äŸåé¢ä¿ãããå Žåãããèªäœãéè€ããŒã¿ã瀺ããŠããå¯èœæ§ãããããlesserã/ãleanerãç¶æ
ã䜿çšã§ããŸãã React + Reduxãã©ãããã©ãŒã ã¯ãããªãã®æã«èšãç¥ããªããã¯ãŒãšéåžžã«æ±ºå®è«çãªUIã¢ããããŒããæäŸããŸãã å¥åŠãªUIã®æŽæ°ã2ãŠã§ã€ãã€ã³ãã£ã³ã°ã®ã«ãŒãã®åé¡ã«æ©ãŸãããŠããªã人ã¯ããããããããç解ããªãã§ãããã æã«åã匷ããšãæ¬è³ªçã«è¶³ãæã¡ããããªããæªå€¢ã«ãªããã¿ããªã®çã¿ãæããŸãã ç¶æ
ã¢ãŒããã¯ãã£ã®éšåãæ£ããç解ãããšãä»ã®ãã¹ãŠãç°¡åã«ãªããŸãã ãããã£ãŠãåºæ¬çã«ã¯å·ã®å»ºç¯ã«ãã£ãšæéãè²»ããå¿
èŠããããŸããããã®åŸã¯ãã£ãšå©çãåŸãããšãã§ããŸãã
ãŸãããªãŒã³ç¶æ
ãšéåžžã®åèšç®ã䜿çšããŠãããã©ãŒãã³ã¹ã®åé¡ããããã©ãããæåã«ç¢ºèªããããšã匷ããå§ãããŸãã éåžžã«éèŠã§ãã åèšç®ã«ããããã©ãŒãã³ã¹ã®åé¡ãçºçããå Žåã«ã®ã¿ãåéžæã¢ãããŒãã䜿çšããŠãã ããïŒã¯ããåéžæã¯æ®µéçã«é©çšã§ããŸããå³@gaearon ïŒïŒã ç§ã¯ã¢ãããŒããåããåèšç®ããŸã£ãã圱é¿ãåãŒããªãããšã«æ°ã¥ããŸããã確ãã«èµ·ããã®ã§ã¯ãªãããšå¿é
ããŠããŸããããå®éã«ã¯åœ±é¿ããŸããã§ãããäžæ¹ãããŒãæŒããã³ã«ã¢ã€ãã ã䞊ã¹æ¿ããããšãã§ããã¢ããªã¯äœ¿çšããªããŠãéãçããããã«æããŸããåéžæããŸãã å€ãã®å Žåãåèšç®ã®æé ã«ã€ããŠèããããåŸåããããŸãããä»æ¥ã®å¹³åçãªããã»ããµã¯ãã»ãã®äžç¬ã§æ°çŸãæ°åã®çš®é¡ãå®è¡ã§ããããšãå¿ããªãã§ãã ããã å®è©±ã
誰ãããã®ã¢ãããŒããæ€èšããŸãããïŒ èœãšãç©Žã¯äœã§ããïŒ
const combinedReducers = combineReducers({
dog: dogReducer,
cat: catReducer
})
const stateInjectedReducers = (state, action) => {
return {
...state,
frog : frogReducer(state.frog, action, state) // frogReducer depends on cat state
}
}
export default reduceReducers(combinedReducers, stateInjectedReducers)
å®ããŠç°¡åã§ãããä»ã®å Žæããç¶æ
ã泚å
¥ããå¿
èŠãããæ°ããã¬ãã¥ãŒãµãŒã®ããã«stateInjectedReducers
ãæžãçŽãå¿
èŠããªãã®ã§ãç§ã«ã¯é
åçã§ãã
@funwithtriangles ïŒhttp://redux.js.org/docs/recipes/reducers/BeyondCombineReducers.htmlã§è©±ããç§ã®ããã°æçš¿ã¯http://blog.isquaredsoftware.com/2017/01/practical-reduxã«ãããŸãã -part-7-forms-editing-reducers / ã
@markeriksonã¯ãç§ãããŸãã¯ã¬ã€ãžãŒãªããšãããŠããªãããšãç¥ã£ãŠããããã§ãïŒ :)ç®èãªããšã«ããã®ã¢ãããŒããæãã€ããåŸã dog
ã cat
ãããã³frog
ç¶æ
ã¹ã©ã€ã¹ã絡ã¿ãããŠãåå¥ã®ã¬ãã¥ãŒãµãŒã«ã§ããªããšå€æãããããã1ã€ã«ããŒãžããŸããã ïŒïŒ ð
è€æ°ã®ã¬ãã¥ãŒãµãŒã«åãã¢ã¯ã·ã§ã³ãå°éãããŠãããããããã®ç¶æ ããªãŒã§ããããã®å€æŽãããªã¬ãŒããã®ã¯æªãç¿æ £ã§ããïŒ ãããè¡ãå¿ èŠãããå Žåãå¯èœã ãšæããŸããããã¯ãç¶æ ããªãŒã誀ã£ãŠæ§é åããããšã瀺ããŠããå¯èœæ§ããããŸãããç®çã®ããã«ã2ã€ã®ç°ãªãç¶æ ããããšããŸãã
const combinedReducers = combineReducers({
a: aReducer,
b: bReducer
})
ãããŠã1åã®ãã£ã¹ãããããäž¡æ¹ã®ç¶æ
ããªãŒã§ç¶æ
å€æŽãããªã¬ãŒããããšããŸããã äž¡æ¹ã®ã¬ãã¥ãŒãµãŒã§åãã¢ã¯ã·ã§ã³ãå°éããã®ã¯æªãç¿æ
£ã§ããïŒ å¿
ç¶çã«ããã£ã¹ãããã¯ãšã«ããcombinedReducers
å
šäœãééããæçµçã«äž¡æ¹ã®ããªãŒã§ç¶æ
ãå€åããŸãã å¯äžã®åé¡ã¯ãç¹å®ã®ã¢ã¯ã·ã§ã³ãããŸããŸãªç¶æ
ããªãŒã®ããªã¬ãŒå€æŽã§ãããã©ããã調ã¹ãŠç¢ºèªããå¿
èŠãããããšã§ãïŒãã ããåœåèŠåã䜿çšããŠãããåŠçã§ããŸãïŒã
@augbogããã¯ãŸã£ããåé¡ãªããReduxã§è¡ãã®ãäžè¬çãªããšã§ãããäžèšã®èª¬æãšã¯å®éã«ã¯é¢ä¿ãããŸããã ãã®åé¡ã¯ãç¶æ ããªãŒã®ä»ã®ãã©ã³ãããç¶æ ã«ã¢ã¯ã»ã¹ã§ããã¬ãã¥ãŒãµãŒã«é¢ãããã®ã§ãã
@augbog ïŒããã¯Reduxã®äœ¿çšç®çã§ãã 詳现ã«ã€ããŠã¯ãç§ã®ããã°æçš¿The Tao of ReduxãPart 1-Implementation andIntentãåç §ããŠãã ããã
å¥ã®è§åºŠ-ç¶æ ããªãŒã®ã«ãŒãã«ããã»ã¬ã¯ã¿ãŒã䜿çšããŠãç¶æ ã®ãµããã©ã³ãããã»ã¬ã¯ã¿ãŒãåŒã³åºããŠå¿ èŠãªããŒã¿ãååŸããå¿ èŠãªããŒã¿åœ¢ç¶ãè¿ãããšã§ãå¿ èŠãªç¹å®ã®ããŒã¿ãååŸããŸãã
const selector = state => {
const x = someSelectorForA(state.a);
const y = someSelectorForB(state.b);
return compute(x,y);
}
ã¬ãã¥ãŒãµãŒã¯ã«ãã»ã«åããããŸãŸã§ã競åç¶æ ã¯ãªããã»ã¬ã¯ã¿ãŒã¯ããªã声ãäžããŠããŸãã ããã€ãã®çŽ æŽãããååž°ãã¿ãŒã³ã«ã€ãªããå¯èœæ§ããããŸãã
ç¶æ ããªãŒã®ãã©ã³ããè¶ããŠå°éããããšãã¯ãã€ã§ããéåžžã¯ã»ã¬ã¯ã¿ãŒã䜿çšããå¿ èŠããããŸãã ç§ã¯ãããã®ååã«åŸãããã«äžçæžåœåªåããŠããŸãã
ãã©ãŒã ã«é¢ããéããç§ã«ã¯ã¹ãã¢ã«å±ãããã®ã2ã€ãããŸãã
次ã«ãã»ã¬ã¯ã¿ãŒã䜿çšããŠã2ã1ã§å®çŸ©ãããã«ãŒã«ã«åŸããã©ãããèšç®ããŸããã¬ãã¥ãŒãµãŒã®ç¶æ ããªãŒå šäœã«å°éããçç±ã¯ãããŸããã
ããã©ãŒã ãæå¹ãã©ãããç³è«ç¶æ ã«åæ ãããã¹ãã§ã¯ãªãããšæãããšããããŸãããããã¯éèŠãªããšã®ããã«æããŸããã ããããããã§ããããã¯åœå®¶ãå¯äžã®æ£ããæ å ±æºã§ããã¹ãã§ãããšããååã«éåããŠããŸãã æå¹æ§ãæ£ããèšç®ãããªããã°ãããå Žåãç¶æ ã¯å éšçã«ççŸããŸãã ããã¯äžå¯èœãªã¯ãã§ãã
ã»ã¬ã¯ã¿ãŒã¯ãçµæãäž»èŠãªå Žåã§ãã掟çããŒã¿ãæ ŒçŽããã®ã«æé©ãªå Žæã§ãã èšç®ãããç¶æ ã«ã¯å€ãã®é¢å¿ã®ãããµãã¹ã¯ã©ã€ããŒãããå¯èœæ§ãããããã @ gaearonãææ¡ããããã«ã¡ã¢åãããã»ã¬ã¯ã¿ãŒã䜿çšããŠãã ããã
ãŸããã¬ãã¥ãŒãµãŒãã¢ã¯ã·ã§ã³ãæ£ãã解éããããã«æŽŸçããŒã¿ã®ã³ã³ããã¹ãæ å ±ãå¿ èŠãšããå Žåã¯ãããããã£ã¹ããããããšãã«ã¢ã¯ã·ã§ã³ã«å«ããããšãã§ããŸãã
ãã®åé¡ã®ä»£ããã«ãredux-thunkã䜿çšããããšãã§ããŸãã 解決çã¯ãäžéã¢ã¯ã·ã§ã³ã䜿çšããŠãçŸåšã®ç¶æ ã«åºã¥ããŠããå€ãã®ã³ã³ããã¹ãèªèã¢ã¯ã·ã§ã³ãå®è¡ããããšã§ãã
function incrementIfOdd() {
return (dispatch, getState) => {
const { counter } = getState();
if (counter % 2 === 0) {
return;
}
dispatch(increment());
};
}
ãã®ãœãªã¥ãŒã·ã§ã³ã䜿çšãããšãã¢ã¯ã·ã§ã³ãšã¬ãã¥ãŒãµãŒã®äž¡æ¹ããã ã®ãŸãŸã«ãªããããžãã¯ã¯äžéã¬ã€ã€ãŒã«ç§»åãããŠãŒã¶ãŒã®æäœãšçŸåšã®ç¶æ ã«åºã¥ããŠè¿œå ã®ãã§ãã¯ãšæšè«ãè¡ããŸãã
ããã¥ã¡ã³ãã«ã¯ç¬èªã®ã»ã¯ã·ã§ã³ãããã®ã§ãå人çã«ã¯ããªãç®ç«ã€ãšæããŸãã
ãã®åŒçšãšã®ãªã³ã¯ã¯å£ããŠããŸãããç§ã¯ããããããåç §ããŠãããšä¿¡ããŠããŸãïŒ https ïŒ
ãã ããèŠçŽããšããã®ã»ã¯ã·ã§ã³ã¯ããã以äžã§ã¯ãªãã«ããŠããé¢é£æ§ãããããã«èŠããŸãïŒ //redux.js.org/docs/recipes/reducers/BeyondCombineReducers.html
ãããããã«ç§»åããŸãã
æãåèã«ãªãã³ã¡ã³ã
åãã©ã³ãã§çžäºã«æä»çãªæ¹æ³ã§åŠçã§ããªãåäžã®ã¢ã¯ã·ã§ã³ã®åœ±é¿ã解決ããããã«ç¶æ ããªãŒã®ããŸããŸãªéšåãå¿ èŠãªå Žåã¯ã
reduce-reducers
ã䜿çšããŠãcombineReducer
ã«ãã£ãŠçæãããã¬ãã¥ãŒãµãŒã暪æçãªã¬ãã¥ãŒãµãŒïŒ