ã¬ãã¥ãŒãµãŒã§ïŒ
const todoBlog = combineReducers({
blogTypeVisibilityFilter,
blogs
})
blogTypeVisibilityFilterã®å ŽåïŒ
const blogTypeVisibilityFilter = (state, action)=>{
switch (action.type) {
case 'BLOG_TYPE_VISIBILITY_FILTER':
return action.filter
default:
return state
}
}
export default blogTypeVisibilityFilter;
ããã°ã§ïŒ
const blogs = (state,action)=>{
return state
}
createStoreã§ïŒ
const initialState = {
blogTypeVisibilityFilter:'SHOW_ALL_BLOG',
blogs:data.data,
}
const store = createStore(reducer,initialState,window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__());
ãããŠããã¯ééã£ãŠè¡šç€ºãããŸãïŒ
ã¬ãã¥ãŒãµãŒãblogTypeVisibilityFilterããåæåäžã«æªå®çŸ©ãè¿ããŸããã ã¬ãã¥ãŒãµãŒã«æž¡ãããç¶æ ãæªå®çŸ©ã®å Žåã¯ãåæç¶æ ãæ瀺çã«è¿ãå¿ èŠããããŸãã åæç¶æ ã¯æªå®çŸ©ã§ãã£ãŠã¯ãªããŸããã ãã®ã¬ãã¥ãŒãµãŒã«å€ãèšå®ããããªãå Žåã¯ãundefinedã®ä»£ããã«nullã䜿çšã§ããŸãã
ããããç§ããã å€ãããšã
const todoBlog = combineReducers({
blogTypeVisibilityFilter,
blogs
})
ã«
const todoBlog = (state={},action)=>{
return{
blogTypeVisibilityFilter:blogTypeVisibilityFilter(state.blogTypeVisibilityFilter,action),
blogs:blogs(state.blogs,action)
}
}
ã¬ãã¥ãŒãµãŒã§ã¯ããšã©ãŒãªãã§æ£åžžã«åäœããŸã
ãªãcombineReducersã䜿çšããã®ã§ããïŒ
ããã¯ãã°ãã©ãã«ãŒã§ããããµããŒãã·ã¹ãã ã§ã¯ãããŸããã 䜿çšæ³ã«é¢ãã質åã«ã€ããŠã¯ãStackOverflowãŸãã¯Reactifluxã䜿çšããŠãã ããã ããããšãïŒ
ç§ãåãåé¡ãæ±ããŠããŸãã
æé ïŒ
{ foo, bar }
ãsimpleReducer = state => state
ãããªåçŽãªã¬ãã¥ãŒãµãŒãäœæããŸããreducers = combineReducers({ foo: simpleReducer, bar: simpleReducer })
ã¬ãã¥ãŒãµãŒãçµã¿åãããŸããcreateState(reducers, { foo: Obj1, bar: Obj2 })
åæå€ã§ç¶æ
ãäœæããŸããReducer "foo" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state
çç±ã¯assertReducerShape
ãç¶æ
ãæªå®çŸ©ã®ãã¹ãŠã®ã¬ãã¥ãŒãµãŒãå®è¡ããŠåæç¶æ
ã®éšåãååŸããŸãã ç§ã®åçŽãªã¬ãã¥ãŒãµãŒã¯ããã®å Žåã¯æªå®çŸ©ã®åŒæ°ãè¿ããŸãã createState
åŒã³åºãããã®Obj1
ãfoo-partã®åæç¶æ
ãšèŠãªãããªãã®ã¯ãªãã§ããïŒ
@timdorråé¡ãåéã§ããŸããïŒ
åé¿çã¯simpleReducer = (state = null) => state
ãäœæããããšã§ãã ããããããã¯å€§äžå€«ã§ããïŒ
combineReducers
ãåã¹ã©ã€ã¹ã¬ãã¥ãŒãµãŒã¯ãã®ç¶æ
ã®ã¹ã©ã€ã¹ããææãããããšãæåŸ
ãããŸãã ããã¯ãçŸåšã®ã¹ã©ã€ã¹ãæªå®çŸ©ã®å Žåã«åæå€ãæäŸããããšãæå³ãããããè¡ããªãå Žåã¯combineReducers
ãææããŸãã
ãåæç¶æ ãã«ã¯è€æ°ã®æå³ããããŸãã ãããã¯ãreducerã®ããã©ã«ãã®æ»ãå€ã§ãããcreateStoreã®2çªç®ã®åŒæ°ã§ãã åé¡ããããšæããŸãã CombineReducersãinitialStateãšcreateStateã®ã¬ãã¥ãŒãµãŒããã§ãã¯ããªãçç±ã説æã§ããŸããïŒ
@Vittly ïŒ combineReducers
ã¯æå³çã«æèŠãè¿°ã¹ãããŠããŸããã createStore
ã¯ããã§ã¯ãããŸããã createStore
ã¯ãæå®ããã«ãŒãã¬ãã¥ãŒãµãŒé¢æ°ãåŒã³åºãã ãã§ãçµæãä¿åããŸãã combineReducers
ã¯ãããã䜿çšããŠããå Žåãç¶æ
ãã©ã®ããã«ç·šæããçµåãããã¬ãã¥ãŒãµãŒãã©ã®ããã«åäœãããã«ã€ããŠãç¹å®ã®äžé£ã®ä»®å®ã«åæããŠããããšãåæãšããŠããŸãã
ïŒ191ãšïŒ1189ãèªã¿éããŠãã ããããããã¯ã combineReducers
ãæèŠãè¿°ã¹ãããŠããçç±ãšããããã©ã®ãããªæèŠãæã£ãŠãããã«ã€ããŠã®æŽå²ãšè©³çŽ°ã説æããŠããŸãã
ãããã£ãŠãåé¡ã¯ïŒãŸããªãïŒãã¬ãã¥ãŒãµãŒãçµã¿åããããšãã¹ãã¢ããªãŒãåå²ãããäœããèŠéããããcreateStore 2nd argã®ã¹ãã¢ã®äžéšã®ã¿ãæå³çã«ããªããŒããããããå¯èœæ§ããããŸããã¹ãã¢ããªãŒã®äžè²«æ§ãé«ããã«ã¯ãassertReducerShapeã䜿çšããŠãã ãããã ããŠãrefsãããããšã
ããã§ãåãåé¡ããããŸãã
ãããã£ãŠã createStore
ã䜿çšããŠãåæç¶æ
ãæž¡ããŸãã ãããã reduct.js
ãã¡ã€ã«ã§ã¯ãé¢æ°assertReducerShape
reduxã¯ã undefined
ç¶æ
ãæž¡ããšãã«ã¬ãã¥ãŒãµãŒããã§ãã¯ããŸãã
ç§èŠããã¯ãã°ã§ãã
@JoseFMP ïŒç§ã¯ããªããèŠãŠãããã®ããã°ã§ã¯ãªãããšãå¹æçã«ä¿èšŒããŸãã ãã ããåé¡ã瀺ããªããžããªãŸãã¯CodeSandboxããŸãšããããšãã§ããã°ã調æ»ããããšãã§ããŸãã
ãã¡ããã Stackoverflowã§åé¡ãæèµ·ããŸããïŒ
https://stackoverflow.com/questions/53018766/why-redux-reducer-getting-undefined-instead-of-the-initial-state
åé¡ã¯éåžžã«ç°¡åã§ãã ããã§ãã¹ãã¢ãäœæãããšãã«åæç¶æ
ãèšå®ããå Žå...ãªãreduxã¯undefined
ç¶æ
ã§ã¬ãã¥ãŒãµãŒãè©äŸ¡ãããã®ã§ããïŒ ããã«ããããã¹ãŠã®ã¬ãã¥ãŒãµãŒãæ°ããç¶æ
undefined
ãè¿ãããã«ãªããŸãã
ããããåæç¶æ
ãæž¡ãã®ã§ããã³ã»ã³ã¹ã§ãã
ãããã£ãŠãããã¯å€±æããŠããŸãã
import { combineReducers, createStore } from 'redux';
const configReducer = (config: any, action: any): any =>{
return config;
}
const customData = (customData: any, action: any): any => {
return customData;
}
const reducers = combineReducers({config: configReducer, customData: customDataReducer})
const defaultConfig = "cool config";
const data = "yieaah some data";
var initialState = {config: defaultConfig, customData: data};
const store = createStore(reducers, initialState) // at this point redux calls all the reducers with 'undefined' state. Why?
@JoseFMP ïŒ
ãããç§ã¯åé¡ãäœã§ããããç¥ã£ãŠãããšæããŸãã ããã¯ã combineReducers()
ãã©ã®ããã«æ©èœãããã«åºæã§ãã
combineReducers
ã¯ãæå®ãããã¹ãŠã®ãã¹ã©ã€ã¹ã¬ãã¥ãŒãµãŒããããã€ãã®ã«ãŒã«ã«åŸãããšãæåŸ
ããŠããŸãã ç¹ã«ãã¬ãã¥ãŒãµãŒãstate === undefined
ã§åŒã³åºããããšãé©åãªããã©ã«ãå€ãè¿ãããŸãã ããã確èªããããã«ã combineReducers()
ã¯å®éã«(undefined, {type : "SOME_RANDOMIZED_ACTION_TYPE"})
ã䜿çšããŠã¬ãã¥ãŒãµãŒãåŒã³åºããæªå®çŸ©ã®å€ãŸãã¯ãå®éã®ãå€ãè¿ããã©ããã確èªããŸãã
çŸåšãã¬ãã¥ãŒãµãŒã¯æž¡ããããã®ãè¿ã以å€ã¯äœãããŸãããã€ãŸãã state
ãæªå®çŸ©ã®å Žåããããã¯_return_undefinedã«ãªããŸãã ã€ãŸãã combineReducers()
ã¯ãæåŸ
ã©ããã®çµæãåŸãããŠããªãããšã瀺ããŠããŸãã
宣èšãconfigReducer = (config = {}, action)
ãªã©ã«å€æŽããã ãã§ãèŠåãä¿®æ£ãããŸãã
ç¹°ãè¿ããŸãããæ確ã«ããããã«ãããã¯ãã°ã§ã¯ãããŸããã ããã¯åäœæ€èšŒã§ãã
Hej @ markeriksonã
ããã€ãã®ã³ã¡ã³ãïŒ
1ïŒãããã combineReducers
åºæã®ãã®ã§ã¯ãããŸããã combineReducers
ã䜿çšãããç¬èªã®ã«ãŒãã¬ãã¥ãŒãµãŒãå®è£
ããå Žåããåãããšãèµ·ãããŸãã
2ïŒããã§ã®ççŸã¯ãReduxã®ããã¥ã¡ã³ãã§ãã¬ãã¥ãŒãµãŒãäžæãŸãã¯äºæããªãã¹ããŒã¿ã¹ã§åŒã³åºãããå Žåãã¹ããŒã¿ã¹ãå€æŽããŠåŒæ°ãšããŠæ¥ãå€ãè¿ãã¹ãã§ã¯ãªããšè¿°ã¹ãããŠããããšã§ãã ã€ãŸã... undefined
ãåãåã£ãå Žåã¯ã undefined
è¿ãå¿
èŠããããŸãã ããããå¥ã®ã«ãŒã«ã§ã¯ãã¬ãã¥ãŒãµãŒã¯undefined
è¿ããªãããã«ããå¿
èŠããããããçŸåšreduxã®ããã¥ã¡ã³ãã«ããããã2ã€ã®ã«ãŒã«ã«ã¯äžè²«æ§ããããŸããã ãããŠãå®è£
ãšççŸããŠããŸãã
@JoseFMP ïŒåã«è¿°ã¹ãããã«ãåé¡ãå ·äœçã«ç€ºãCodeSandboxãæäŸããŠãäºæ³ãããããšãšå®éã«èµ·ãã£ãŠããããšãæ£ç¢ºã«ææããã³ã¡ã³ããæäŸã§ããã°ãç§ã¯ãããã調ã¹ãããšãã§ããŸãã ïŒãŸããäžè²«æ§ããªããšæããããã¥ã¡ã³ãã»ã¯ã·ã§ã³ãææããŠãã ãããïŒãããŸã§ã¯ãReduxãå éšã§ã©ã®ããã«æ©èœãããã«ã€ããŠã®èª€è§£ã«ããããããã§ãŒã¯ã§ããŸããã
ããããšã@markerikson ã
ããã¥ã¡ã³ãã«ã€ããŠïŒ
ãããã£ãŠãã¬ãã¥ãŒãµãŒãäžæãªã¢ã¯ã·ã§ã³ã§åŒã³åºãããå Žåãã¬ãã¥ãŒãµãŒã¯ãã®ã¬ãã¥ãŒãµãŒã§ã¢ã¯ã·ã§ã³ãäœããã¹ããããããªãã®ã§ãåãç¶æ ãè¿ãå¿ èŠããããŸãã
ã¹ãã¢ãäœæãããšããReduxã¯ã¬ãã¥ãŒãµãŒã«äžæãªã¢ã¯ã·ã§ã³ãšä»¥åã®ç¶æ
undefined
éä¿¡ããŠã¬ãã¥ãŒãµãŒããã§ãã¯ããŸãã ãããã£ãŠãåã®ç¶æ
ãundefined
ã ã£ãå Žåãããã¥ã¡ã³ãã«ãããšãã¬ãã¥ãŒãµãŒã¯undefined
ãè¿ãå¿
èŠããããŸãïŒã¬ãã¥ãŒãµãŒã¯ã¢ã¯ã·ã§ã³ãèªèããŠããªãããïŒã ãã ããã¬ãã¥ãŒãµãŒãundefined
è¿ãå Žåã¯ãReduxã¢ããªãæ©èœããªãããšãä¿èšŒããŸãã
ãµã³ãã«ã³ãŒãã®å ŽåïŒ
import { createStore } from 'redux';
const configReducer = (config: any, action: any): any =>{
return config;
}
const customReducer = (customData: any, action: any): any => {
return customData;
}
const reducers = (currentState: IAppState, action: any): IAppState => {
var appStateToEvaluate: any;
if (currentState) { //needs to add this to pass the `undefined` check of redux
appStateToEvaluate = currentState;
}
else{
//why redux is doing this ?!
appStateToEvaluate = {}
}
const newState: IAppState = {
cvConfig: configReducer(appStateToEvaluate.config, action),
personalData: customReducer(appStateToEvaluate.customData, action)
}
return newState;
}
const defaultConfig = "cool config";
const data = "yieaah some data";
var initialState = {config: defaultConfig, customData: data};
const store = createStore(reducers, initialState) // at this point redux calls all the reducers with 'undefined' state. Why?
@JoseFMP ïŒããã§èŠéããŠããäž»ãªéãã¯ããã®äŸã§ã¯ãES6ã®ããã©ã«ãã®åŒæ°æ§æã䜿çšããŠãã¬ãã¥ãŒãµãŒé¢æ°ãstate
ãundefined
ã®å Žåã_already_åŠçããŠããããšã§ãã
function todoApp(state = initialState, action) {
ãããã£ãŠããã¥ãŒããªã¢ã«ã®ã¢ããã€ã¹ã¯æ£ããã§ããã¬ãã¥ãŒãµãŒã¯ãæªå®çŸ©ã®ã±ãŒã¹ããã§ã«åŠçãããŠãããšä»®å®ããŠãåžžã«æ¢åã®ç¶æ ãè¿ãå¿ èŠããããŸãã
@markerikson
ãåçããããšãããããŸãã
ããã¯ç§ã«ã¯æããã§ãã ãã¥ãŒããªã¢ã«ã«ãããŸããã ãã¥ãŒããªã¢ã«ã§ã¯ãè¿ãããã±ãŒã¹ãã¬ãã¥ãŒãµãŒã®ããã©ã«ãã®ãã©ã¡ãŒã¿ãŒå€ãšããŠæå®ãããŠããã±ãŒã¹ã§ãããšã¯è¿°ã¹ãŠããŸããã ãããã£ãŠãæäœã«ããæã¯æ£ããã§ãã ããã¯ããã ç§ã®æžå¿µã¯ãããããã¥ãŒããªã¢ã«ã«æ¬ ããŠããããšã§ãã ãŸãã¯ãèŠã€ãããªãã£ããããããŸãã§ãã
ããŠããã¥ãŒããªã¢ã«ãããã¥ã¡ã³ããšã¯é¢ä¿ãªãããã®undefined
ãã§ãã¯ã¯ãåæç¶æ
ãæå®ãããŠããç¹å®ã®ã±ãŒã¹ã§ã¯å人çã«æå³ããªãããšãããããŸããã åæç¶æ
ãæå®ãããŠããªãå Žåã¯åé¡ãããŸããã ããŠãããã¯è°è«ã§ã¯ãªããç§ã®æèŠã§ããåæç¶æ
ãæå®ãããŠããå Žåããã®ãã§ãã¯ãè¡ãã®ã¯ç¡æå³ã ãšæããŸãã ããããç§ã¯ãšã«ãããããšäžç·ã«æ®ããããšãã§ããŸãïŒãããŠããããªããã°ãªããŸããïŒ;ïŒ
ããŒã¯ãããããããšãããããŸããã
確ãã«ããã倧ããªããã¥ã¡ã³ãã®å·æ°ïŒïŒ2590ïŒã®äžç°ãšããŠãèšãåãã®äžéšãèšãæããããšãã§ããŸãã
ãšã¯èšããã®ã®ãReduxã®èåŸã«ããå
ã
ã®ã¢ã€ãã¢ã®1ã€ã¯ãåãã¹ã©ã€ã¹ã¬ãã¥ãŒãµãŒããç¶æ
ã®äžéšããææããã責任ããããšãããã®ã§ãããããã«ã¯ãæŽæ°ãšåæå€ã®æäŸã®äž¡æ¹ãå«ãŸããŸãã ããªãã¯ããŸããç§ã¯createStore
åæå€ãæäŸããŠããããšããåŽé¢ã«åºå·ããŠããããã§ãããReduxã_ããã§ãªã_å Žåã§ããReduxãã©ã®ããã«åäœãããã«ã€ããŠã®æåŸ
ã軜èŠããŠããŸããå€ãåå¥ã«æäŸããŸãã
ããããŸã ãªã³ã¯ããŠããªãããšã«å°ãé©ããŠããŸãããããã¥ã¡ã³ãã®ãåæåç¶æ ãããŒãžãèªã¿ãããšæããããããŸããã
@markerikson
ã¯ããããã§åã£ãŠããŸãã ç§ã¯ãã§ã«åæç¶æ
ã«é¢ããããã¥ã¡ã³ããç¥ã£ãŠããŸãã ç§ãèšãããã®ã¯ïŒãããŠç§ã¯ãã®åé¡ãäœæãããçç±ã§ããã人ã
ããã®æ¹åãæå³ããŠãããšä¿¡ããŠããŸãïŒãã¹ãã¢ãäœæãããšãã«ãåæç¶æ
ããæäŸããããã§ããããã©ã«ãç¶æ
ããå®çŸ©ããã®ã¯çŽæã«åãããšããããšã§ãã¹ã©ã€ã¹ã¬ãã¥ãŒãµãŒïŒãŸãã¯ã«ãŒãã¬ãã¥ãŒãµãŒïŒã ã€ãŸããå¿
ããããããšã¯éããŸããããåãã§ããããéåžžã«é¢é£ããŠããããšãéåžžã«å€ãããã2åå®çŸ©ããå¿
èŠãããã®ã¯çŽæã«åããŸãã äŸãšããŠãç§ãšåãããã«æ··ä¹±ãã@ElonXunãŸãã¯@Vittlyã®æçš¿ãåç
§ããŠãã ããã ã€ãŸããç§ã®çºèšã¯Reduxã®APIã§ã¯ãªããçŽç²ã«äººéã®èŠ³ç¹ããããã®ç¹å®ã®ã·ããªãªã§Reduxã®APIã䜿çšããããšãã©ãã»ã©çŽæçã§ãããã«ã€ããŠã§ãã
æåŸã®æ®µèœã¯ãreduxã®APIã䜿çšãããšãã®äººéã®æèŠã«é¢ãããã®ã§ããããšã«æ³šæããŠãã ããã æ©æ¢°ã®å®è£ ãŸãã¯ãã®èåŸã«ããçç±ã¯å®å šã«åæ³ã§ããå¯èœæ§ããããŸãã ããããAPIã³ã³ã·ã¥ãŒããŒãšããŠã¯ãæ··ä¹±ãæããŸãã
ããšãã°ãç§ã«ãšã£ãŠãéçºäžã¯ãã¢ããªã±ãŒã·ã§ã³ã«åæç¶æ ãé »ç¹ã«ãããŸãã ãããã£ãŠãéåžžã¯2åå ¥åããå¿ èŠããããŸãã 1åã¯ã¹ãã¢ãäœæãããšãã«ãã©ã°ãå·®ã蟌ãã§ããã1åã¯ã¹ã©ã€ã¹ã¬ãã¥ãŒãµãŒã®ããã©ã«ãå€ãšããŠé åžããŸãã ãã¡ããããã®ããã®å€ãã®ãœãªã¥ãŒã·ã§ã³ã ãããã人éãšããŠã®ç§ã«ãšã£ãŠæ··ä¹±ãæããšããååã¯ãåããã®ã2åå ¥åããå¿ èŠããããšããããšã§ãã
ãã ããåæç¶æ ãèšå®ãããã¹ã©ã€ã¹ã¬ãã¥ãŒãµãŒãŸãã¯ã«ãŒãã¬ãã¥ãŒãµãŒããããã©ã«ãç¶æ ãã«ãªãããšã匷å¶ããªããšããç¹æ®ãªã±ãŒã¹ããããšããããå¿ é ã«ãããããåä»ãªããšããããšæããŸãã
ãããã£ãŠãããã§ã®å¯äžã®è²¢ç®ã¯ããããå°ãçŽæã«åããŠãããšæããããšãèšåããããšã§ãã ããããããã ãã§ãã
以åã®ããŒãžã§ã³ã§combineReducers
ãassertReducerShape
ãåŒã³åºããããšãæãåºããŸããã ç§ã®ã³ãŒãã§ã¯ã undefined
ã¯ç§ã®ã¬ãã¥ãŒãµãŒã®ç¡å¹ãªç¶æ
ã§ãã ããã確å®ã«ããããã«combineReducersã¯å¿
èŠãããŸããããã¬ãã¥ãŒãµãŒãçµåãããŠãäœããå€æŽãããå Žåã«ã«ãŒããªããžã§ã¯ããåäœæããå¿
èŠããããŸãã ããã¯ç§ãæåŸ
ããããšãå°ãè¶
ããŠããŸãã IMOãä»ã¯ããŸãã«ãæèŠãåãããŠããŸãã
確ãã«ãç§ãéçºããŠããã³ã¢ã¢ããªã±ãŒã·ã§ã³ã§ã¯å¿
èŠããªãã£ãããããã°ããã®éãcombineReducersã䜿çšããŠããŸããã ããããç§ã¯çŸåšãã®ã¢ããªã±ãŒã·ã§ã³ãã©ããããããšããŠããŸããcombineReducersã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãã¹ã©ã€ã¹ããã®ã¯åé¡ãªããšèããŸããã assertReducerShape
ã¯é©ãã¹ããã®ã§ãã
@lukescott ïŒãã®å°åæã¯2015幎9æãããããŸãïŒ
https://github.com/reduxjs/redux/commit/a1485f0e30ea0ea5e023a6d0f5947bd56edff7dd
ãããŠãã¯ãã combineReducers()
ã¯_æå³çã«_æèŠããããŸãã ãããã®èŠåãå¿
èŠãªãå Žåã¯ããããã®ãã§ãã¯ãªãã§ç¬èªã®åæ§ã®é¢æ°ãäœæããã®ã¯ç°¡åã§ãã
å ·äœçãªäŸãšããŠããã§ãã¯ãªãã®100è¡ã®Danã®èŠç¹
ããã£ãã å€ãããŒãžã§ã³ã¯åæç¶æ ãééããå®è¡ããšã«æªå®çŸ©ããªãããã§ãã¯ããŸããïŒæãåºããšïŒã é©ãã¹ãããšã¯ãæåã®å®è¡ã§åæç¶æ ãæž¡ãããªãããšã§ãã undefinedãæž¡ãããšã¯ãç§ã®ã¢ããªã®ãšã©ãŒã§ãã ç§ãèšã£ãããã«ãç§ã¯ãã®ãããžã§ã¯ãã«ãã°ããåãçµãã§ããŠããã°ããã®éãcombineReducersã䜿çšããŠããŸããã ã¢ããªã±ãŒã·ã§ã³ãã©ãããŒå ã«é 眮ããŠã䜿çšãåéããŸããã
ç§ããããæèŠãæã£ãŠãããšæããŸãã ãããããã®æèŠã¯ãã¬ãã¥ãŒãµãŒã¯æªå®çŸ©ãè¿ããŠã¯ãªããªãããšãããã®ã§ããããããç§ãåŸãã«ãŒã«ã§ãã ãæªå®çŸ©ãæž¡ãã®ã§ãäœããªããšããããèªåã§ç¶æ ãäœæããå¿ èŠããããŸããã«å€æŽãããŸããã CombineReducersã¯ããåžžã«åæç¶æ ããããŸããã§ã¯æ©èœããªããªããŸãããããã¯æ®å¿µãªããšã§ãã ããã«ããã3幎åã«å®æœãããŠããã«ãŒã«ãå€§å¹ ã«å€æŽãããŸãã
ããªããèšåããŠããè¡åã®å€åãäœã§ãããã¯æ¬åœã«ããããŸããã å ·äœçãªäŸãæããŠããã ããŸããïŒ
åæåç¶æ
ã®ããã¥ã¡ã³ãã®ããŒãžã¯éã®çžäºäœçšã¬ã€ã¢ãŠãpreloadedState
ã®åŒæ°createStore
ã state = initialState
æžéã®ããã«åãæ±ããããã³combineReducers()
ã ããã¯ãDanã2016幎ã®åãã«æžããStack Overflowã®åçã«åºã¥ããŠãããç§ãç¥ã£ãŠãããã®ç¹ã§æå³ã®ããããšã¯äœãå€ãã£ãŠããŸããã
@markeriksonãã®éãã§ãã 2.0ãŸã§æ¯ãè¿ã£ãŠã¿ããšããã€ãããããŠããããã§ãã ãããããç§ã®ã¢ããªã±ãŒã·ã§ã³ã®è€éãã¯ããããããæããã«ããã ãã§ãã
ç§ãæ±ããŠããåé¡ã¯ãç§ã®ã¬ãã¥ãŒãµãŒã次ã®ããã«å®çŸ©ãããŠããããšã§ãã
reducer(state: State, action: Action)
ã€ãŸããç¶æ ã¯æªå®çŸ©ã§ãã£ãŠã¯ãªããŸããã ã€ãŸããåæç¶æ ãå¿ èŠã§ãã ããããcombineReducersã¯reducerïŒundefinedãINITïŒãåŒã³åºããŠãã§ãã¯ãããããã³ãŒãã§ãšã©ãŒãçºçããŸãïŒæåããå Žåã¯ãåŸã§reducerïŒinitStateãINITïŒãåŒã³åºããŸã-INITã2ååŒã³åºããŸãïŒã
ã€ãŸããcombineReducersã§äœ¿çšãããã¬ãã¥ãŒãµãŒã¯ã次ã®ããã«å®çŸ©ããå¿ èŠããããŸãã
reducer(state: State | undefined, action: Action)
ãããã£ãŠã以åã¯ãããè¡ããªãã£ããšããç§ã®äž»åŒµã¯æ£ãããããŸããã ããããç§ãæ±ããŠããåé¡ãšOPãæ±ããŠããåé¡ã¯ãããããåãã§ããããã¯ããªãã·ã§ã³ã®ç¶æ ã§ã¬ãã¥ãŒãµãŒã宣èšããããšã匷å¶ããŸãã å®éã«ã¯èŠåã¯è¡šç€ºãããŸãããæªå®çŸ©ã®ç¶æ ãäºæ³ããããããã³ãŒããã¯ã©ãã·ã¥ããŸãã
ããªããããããã®ããã§ãªããã°ãªããªããšããªããèšããªããç§ã¯ãããèªåã§è»¢ããå¿ èŠããããŸããããã¯å€§äžå€«ã§ãã ã·ã§ã€ããã¢ãµãŒãããããšã«å ããŠãå®è¡æã«æªå®çŸ©ããã§ã«ãã§ãã¯ããŠãããããæ®å¿µã§ãã 圢ã䞻匵ããããšã¯å°ãããéãã§éå¹æã®ããã§ãã
ã¯ãã ãã®ããã¥ã¡ã³ãããŒãžã§èª¬æãããŠããããã«ã combineReducers
ã䜿çšããå Žåãå
·äœçã«ã¯ãåã¹ã©ã€ã¹ã¬ãã¥ãŒãµãŒãç¬èªã®åæç¶æ
ãè¿ã責任ãããã sliceReducer(undefined, action)
ã«å¿çããŠãããè¡ãå¿
èŠããããŸãã combineReducers
ã®æç¹ãããã³ãŒãã¯æåŸ
ãããå¥çŽã«æºæ ããŠããªãããããã°ããããã³ãŒããééã£ãŠããããšãããããŸãã
å®éã«åæç¶æ ãæäŸããŠããŸãããïŒ ã³ãŒãã¯å®éã«ã¯ã©ã®ããã«èŠããŸããïŒ
createStoreãä»ããŠåæç¶æ
ãæäŸããŠããŸãã ããããåæç¶æ
ãæž¡ããã«ãããããããassertReducerShapeãundefined
ã䜿çšããŠã¬ãã¥ãŒãµãŒãæ瀺çã«åŒã³åºããŠããããããã®åæç¶æ
ã¯ã¬ãã¥ãŒãµãŒã«æž¡ãããŠããŸããã
ç§ã®ã³ãŒãã¯ãã°ããããŸããã undefinedãæž¡ãããªãããšãå¿ èŠã§ãã åæç¶æ ãå¿ èŠã§ããããµãŒããŒããçæãããŸãã CombineReducersã¯ãã®å¥çŽãç Žãã ãã§ãå¿ èŠãªç¶æ ã§ã¬ãã¥ãŒãµãŒãå³å¯ã«å ¥åããããšã¯äžå¯èœã«ãªããŸãã ç§ã¯combineReducersãªãã§ãããè¡ãããšãã§ããããã¯ããŸãæ©èœããŸãã ãããç§ãããªããã°ãªããªãããšã ãšæããŸãããIMOã¯ãªãã·ã§ã³ã®ç¶æ ã匷å¶ããããšã¯æãŸãããªããç§ã®å Žåãå³å¯ã«åæå®ãããã¢ããªã±ãŒã·ã§ã³ãå£ããããcombineReducersã¯åœ¹ã«ç«ããªããªããŸãã
ç§ãç解ããŠããªãã®ã¯ãassertReducerShapeãå¿
èŠãªçç±ã§ãã å®è¡æã«ããã§ãã§ã«undefined
ãã§ãã¯ããŠããŸãã
assertReducerShapeã¯äžçš®ã®åé·ãªããã§ãã ããããç§ã®å Žåããã¬ãŒã¯ã¿ã€ãã®ä¿èšŒ...ããã䞻匵ããããšããŠããããšã§ããïŒ
ã§ã¯ãããã¯æ¬åœã«TypeScriptã®çžäºäœçšã®åé¡ã§ããïŒ
æ£çŽãªãšãããããã¯æçµçã«ã¯ã¢ãããŒãã®éãã®ããã§ãã
combineReducers()
ã¯JSã§èšè¿°ãããŠãããã©ã³ã¿ã€ã ãã§ãã¯ãå®è¡ããããšããŠããŸãã
TSã§éçãã§ãã¯ãå®è¡ããããšããŠããŸãããäœæãã宣èšãcombineReducers()
å®éã®åäœãšäžèŽããŠããŸããã ãããã£ãŠããã®æå³ã§ã¯ãã¹ã©ã€ã¹ã¬ãã¥ãŒãµãŒã®å宣èšã¯æ£ãããããŸãããããã¯ã combineReducers()
ãšãšãã«äœ¿çšãããšã_can_ããã³_will_ãundefined
ã§åŒã³åºãããããã§ãã
ããªããåŒã³åºãããå
·äœçãªã©ã€ã³ã¯ãããªãã®ã¹ã©ã€ã¹æžéã®æ»ãå€ããªãããšã確èªããŠundefined
ã«å¯ŸããïŒããããæå³ã®ïŒæ¢åã®ç¶æ
ã®ã¹ã©ã€ã¹å€ã§åŒã³åºããããšãã«ã assertReducerShape()
ãã®ããšã確èªãããŸããè¿ããªãundefined
åæç¶æ
å€ãäžãããããšãundefined
ïŒããªãã¡ãæžéæ©ã®ç¶æ
ãèªå·±åæåããŠããããšïŒãšãæªç¥ã®ã¢ã¯ã·ã§ã³ã¿ã€ãïŒããªãã¡ããã®æžéã§åŒã³åºããããšãã«ããã©ã«ãã§ã¯åžžã«æ¢åã®ç¶æ
ãè¿ããŸãïŒã
æªå®çŸ©ã«ãªã£ãŠããå Žåã¯ãããã眮ãæããŸã...ç§ã®å ŽåããµãŒããŒãäœããã®çç±ã§ããŒã¿ãªãã§å¿çãããšãããããã¢ã¯ãã£ããªã»ãã·ã§ã³ããªãããã«ããã®åé¡ãçºçããã®ã§ãã¬ãã¥ãŒãµãŒã§ãããè¡ããšãç§ã«ãšã£ãŠã®é åïŒ
export default function itemReducer(state = initialState.items | undefined, action){
switch(action.type)
{
case "LOAD_ITEMS_SUCCESS":
if(action.items==undefined) {
action.items=[];
}
return action.items
ã¬ãã¥ãŒãµãŒãæªå®çŸ©ã«ãªã£ãå Žåã¯ãundefinedã空ã®é åã«çœ®ãæããŠãã ãããããããã°ããã®ãšã©ãŒã¯çºçããªããªããŸãã
也æ¯ïŒ
æãåèã«ãªãã³ã¡ã³ã
ããã¯ãã°ãã©ãã«ãŒã§ããããµããŒãã·ã¹ãã ã§ã¯ãããŸããã 䜿çšæ³ã«é¢ãã質åã«ã€ããŠã¯ãStackOverflowãŸãã¯Reactifluxã䜿çšããŠãã ããã ããããšãïŒ