ã¯ããã« ããã«ã¡ã¯ãã¹ã¿ã¡ã³ã§ãšã³ãžãã¢ãããŠããããã¢ãã§ãã ã¹ã¿ã¡ã³ã§ã¯ãWeb ã¢ããªã®ã¯ã©ã€ã¢ã³ãåŽã®ç¶æ
管çã« Redux ãšããã©ã€ãã©ãªãæ¡çšããŠããŸãã Redux ã«ãã£ãŠ API ã®ã¬ã¹ãã³ã¹ãããŒã«ã«ã§æ±ãå€ãèªç±ã«ç¶æ
管çã§ããŸããããã£ã¬ã¯ããªæ§æã»åŠçã®å®çŸ©å Žæãªã©ãå
šäœã®èšèšã¯å®è£
è
ã«å§ããããŸãã ããã€ãã®ãããžã§ã¯ãã§ Redux ãæ¡çšããäžã§ãå®è£
äžã®åé·ãªéšåãæ¡åŒµæ§ã®äœãéšåããããããã«ãªããæå±ããããã³ããšã³ãGå
ã§èšèšã«ã€ããŠè©±ãããã«ãªããŸããããããããã¹ããã©ã¯ãã£ã¹ãåŠãŒããšããæµãã«ãªãããRedux Style Guideãã瀟å
ã®ããã³ããšã³ãå匷äŒã§åãäžãããããžã§ã¯ããžã®å°å
¥ãè¡ããŸããã ä»åã¯ããã«ã€ããŠç޹ä»ããŸãã Redux Style Guide ã«ããåŠã³ å
¬åŒã¯ ãã¡ã Redux Style Guide ã®ã«ãŒã«ã¯ãå¿
é ã»åŒ·ãæšå¥šã»æšå¥šã®ïŒã€ã®ã«ããŽãªã«åããããŠããŸãã äŸãã°å¿
é ã ãšãã state ã«çŽæ¥å€æŽãå ããªãããã Reducer ã§éåæåŠçãè¡ããªãããªã©ãæããããŸããã¹ã¿ã¡ã³ã§ãå¿
é ã®ã«ãŒã«ã¯å®ããŠããŸããããåŒ·ãæšå¥šã»æšå¥šã®ã«ãŒã«ã§å®ããŠããªãéšåãããã€ããããŸããã以äžããã®äŸã§ãã Redux Toolkit ã®æ¡çš Redux Toolkit ã¯å¹ççã« Redux ã§éçºããããã«ãå
¬åŒãåºããŠããã©ã€ãã©ãªã«ãªããŸããRedux DevToolsã«ã察å¿ããŠããããã¹ããã©ã¯ãã£ã¹ãçµã¿èŸŒãŸãã颿°ãå©çšã§ããŸãã ã¹ã¿ã¡ã³ã§ã¯ãããŸã§ActionãReducerãåããŠå®è£
ããŠããŸããããRedux Toolkit ãæ¡çšããããšã§ãActionãReducer ã slice ãšããŠãŸãšããããšãã§ããçµæãšããŠã³ãŒãã£ã³ã°éãæžããããšãåºæ¥ãŸããã詳ããã¯åŸè¿°ã®ããããžã§ã¯ããžã®å°å
¥ãã§è§ŠããŸãã æ©èœå¥ãŸãã¯Ducks ãã¿ãŒã³ã«ãããã¡ã€ã«æ§æ Reduxã§ã¯ãã£ã¬ã¯ããªã»ãã¡ã€ã«ãèªç±ã«æ§æã§ããŸããããèŠãã®ã¯srcé
äžãReduxãæäŸããæ©èœãRedux-Sagaãªã©ã®ããã«ãŠã§ã¢ã§åããã¿ã€ãå¥ã®ãã¿ãŒã³ã§ãã /src /actions /containers /sagas /reducers ã¹ã¿ã¡ã³ã§ããã®ãã¿ãŒã³ãæ¡çšããŠããŸããããè€æ°ã®ãã¡ã€ã³ïŒæ©èœïŒãæ±ãããã«ãªããšãåãã£ã¬ã¯ããªãè€éã«ãªããŸããStyle Guideã§ã¯ãæ©èœå¥ãŸã㯠Ducks ãã¿ãŒã³ã§ãã£ã¬ã¯ããªãåããããšãåŒ·ãæšå¥šããŠããŸããæ©èœå¥ã ãšãsrcé
äžã«æ©èœåäœã§ Component ãš Redux ã®åŠçãæ ŒçŽãããŸãã /src /commonïŒå
±éã®Component ã Hooks ãªã©ïŒ /features /todos todosSlice.ts todoSagas.ts Todos.tsx /posts postsSlice.ts postSagas.ts Posts.tsx Ducks ãã¿ãŒã³ã ãš Redux ã®åŠçã modules é
äžã§æ©èœããšã«ãŸãšããããŸãã /src /components /commonïŒå
±éã®Component ã Hooks ãªã©ïŒ /modules todos.ts posts.ts ããããåèã«ãã¹ã¿ã¡ã³ã§ããã¡ã€ã³åäœã§ Redux ã®åŠçããŸãšããããã«ããŸããããã¡ãã詳现ã¯ããããžã§ã¯ããžã®å°å
¥ãã§è§ŠããŸãã åºæ¥ãéã Reducer ã«ããžãã¯ã眮ã Action ã dispatch ããéãComponent ã®é¢æ°å
ã«ããžãã¯ãæžãã®ã§ã¯ãªããReducer å
ã«ç¶æ
æŽæ°ã®ããžãã¯ãæžãããšã§ããã¹ããããããªããŸãããŸããReducer ã«èšè¿°ããããšã§ Redux DevTools ã«ããã¿ã€ã ãã©ãã«ãããã°ãè¡ãããšãã§ããäºæããªãç¶æ
å€åã®åå ãæ©ãç¹å®ã§ããŸãã Style Guide ã ãšä»¥äžã®ããã«äŸãæããããŠããŸãã Componentå
ã«ããžãã¯ãããå Žå // Component - Click handler: const onTodoClicked = id => { const newTodos = todos.map(todo => { if (todo.id !== id) return todo return { ...todo, id } } ) dispatch( { type: 'todos/toggleTodo' , payload: { todos: newTodos } } ) } // Reducer: case "todos/toggleTodo" : return action.payload.todos; Reducerå
ã«ããžãã¯ãããå Žå // Component - Click handler: const onTodoClicked = (id) => { dispatch( { type: "todos/toggleTodo" , payload: { id }} ) } // Reducer: case "todos/toggleTodo" : { return state.map(todo => { if (todo.id !== action.payload.id) return todo; return { ...todo, id: action.payload.id } ; } ) } ããžãã¯ã Component ã«äŸåããªãããšã§ã Presentational Component ãšããŠèŠéãããããªããæç»ã«é¢ããåŠçã«éäžã§ããŸãããŸããComponent ãšããŠã®åå©çšæ§ãé«ãŸããŸãã ãã¹ã/ãªã¬ãŒã·ã§ãã«ã«ããè€éãªç¶æ
ã®æ£èŠå state ã®æ§é ã¯èªç±ã«èšå®ã§ãããããAPI ã®ã¬ã¹ãã³ã¹ããã¹ãããŠããå Žåãªã©ãè€éãªããŒã¿ããã®ãŸãŸ state ã«ä¿åããããšãã§ããŸããããããã¹ãããŠããããŒã¿ã¯æŽæ°ãã¥ãããç¹å®ã®ããŒã¿ãæœåºããåŠçãæ¯åå¿
èŠã«ãªããŸããStyle Guide ã§ã¯ããŒã¿ãæ£èŠåããç¶æ
ã§ä¿åããïŒãã¹ãããããšã³ãã£ãã£ããšã«ç¶æ
ãæã€ïŒããšãåŒ·ãæšå¥šããŠããŸãã 以äžãå
¬åŒã§æããããŠããäŸã§ãã ãã¹ãããŠããå Žå state: { posts: [ { id: 'post1' , author: { username: 'user1' , name: 'User 1' } , body: '......' , comments: [ { id: 'comment1' , author: { username: 'user2' , name: 'User 2' } , comment: '.....' } , { id: 'comment2' , author: { username: 'user1' , name: 'User 1' } , comment: '.....' } ] } ] } æ£èŠåããŠããå Žå state: { posts : { byId : { "post1" : { id : "post1" , author : "user1" , body : "......" , comments : [ "comment1" , "comment2" ] } , } , allIds : [ "post1" ] } , comments : { byId : { "comment1" : { id : "comment1" , author : "user2" , comment : "....." , } , "comment2" : { id : "comment2" , author : "user3" , comment : "....." , } , } , allIds : [ "comment1" , "comment2" ] } , users : { byId : { "user1" : { username : "user1" , name : "User 1" , } , "user2" : { username : "user2" , name : "User 2" , } , } , allIds : [ "user1" , "user2" , "user3" ] } } ãã®ããã«æ£èŠåããããšã§ç¹å®ã®ããŒã¿ãæœåºãããããªããããã©ãŒãã³ã¹ãšããŠãè¯ããªããŸãã ãããžã§ã¯ããžã®å°å
¥ Style GuideãåŠã³ãçŽè¿ã®ãããžã§ã¯ãã§æã广ããã£ãã®ã¯ã Redux Toolkitã®å°å
¥ ãš ãã¡ã€ã«ã»ãã£ã¬ã¯ããªæ§æã®æé©å ã§ãã Redux Toolkit ã®å°å
¥ã«ãããAction ãš Reducer ã slice ãšããŠãŸãšããããšãã§ããAction ãå®çŸ©ããã slice ã§å®çŸ©ãã颿°ã dispatch ã§ããŸãã å°å
¥å // Action export const FETCH_DATA = 'FETCH_DATA' export const fetchData = () => { type: FETCH_DATA, } // Reducer const Reducer = (state, action) => { switch (action.type) { case FETCH_DATA: { const { payload } = action return { ...state, data: payload } } } } å°å
¥åŸ // Slice const Slice = createSlice( { name: data, initialState, reducers: { fetchData: (state) => { return { ...state, data: payload } } } } ) ïŒã€ïŒã€ã® Action ã§èŠããšå€§ããªå·®ã¯ãããŸããããã¢ããªã±ãŒã·ã§ã³ã®èŠæš¡ã倧ãããªããš Action æ°ãå¢ãããããããããå®çŸ©ããæéãç¡ããªãã®ã¯å¬ããã§ããstate ã®æŽæ°åŠçã远å ããæã¯ slice ãš sagas ã®ã¿ãè§Šãã°è¯ããããæ©èœã远å ãããããªããŸããã ãã¡ã€ã«ã»ãã£ã¬ã¯ããªæ§æã¯ Style Guide ãåèã«ãã€ã€ã以äžã®ãããªæ§æã«ããŸããã /src /modules /domain1 /slice /sagas /domain2 /slice /sagas /commonïŒãã¡ã€ã³éã§å
±éã®åŠçïŒ /pages /components /domain1 /domain2 /commonïŒãã¡ã€ã³éã§å
±éã®ComponentïŒ /containers /utilsïŒå
±éã®Hooksãªã©ïŒ Redux ã®åŠçã modules é
äžã®åãã¡ã€ã³ã§åããããã« slice ã sagas ã®åŠçã§åããŸããstate ãåãåã Component 㯠pages ãšãããã£ã¬ã¯ããªã«åãããŠãããæç»ãš Redux ã®ããžãã¯ãåãé¢ãããšã§è²¬ä»»ãåé¢ããŠããŸãããã®ãããªæ§æã«ããããšã§ãæ¢åã®åŠçãä¿®æ£ããæã¯è©²åœéšåãèŠã€ãããããªããæ©èœè¿œå ãè¡ãæãè¿·ããæ°ãããã¡ã€ã³ãå®çŸ©ããŠå®è£
ã§ããããã«ãªããŸããã ãŸãšã Redux Style Guide ãåŠã¶ããšã§ãããè¯ã Redux ã®èšèšãç¥ãããšãã§ããŸããæ¯ãè¿ããšãèªåãã¡ã®èšèšã»å®è£
ã«çåãæã¡ãããã³ããšã³ãå匷äŒã§åãäžããã¡ã³ããŒã§è°è«ããããšãå®è·µãžã®è¿éã ã£ãããã«æããŸããä»åŸãæ®æ®µè§Šããæè¡ã«çåãæã¡ãªãããå¿
èŠã§ããã°å匷äŒã§åãäžããããšãç¶ããŠãããããšæããŸãã ã¹ã¿ã¡ã³ã§ã¯äžç·ã«ãããã¯ãéçºãé²ããŠããã仲éãåéããŠããŸãïŒ èå³ãæã£ãŠãããæ¹ã¯ããã²äžèšã®åéããŒãžãã芧ãã ããã ããã³ããšã³ããšã³ãžãã¢åéããŒãž