Upgrade to Pro — share decks privately, control downloads, hide ads and more …

次はたぶん挫折しないredux(react-redux社内勉強会資料)

sadnessOjisan
February 25, 2019

 次はたぶん挫折しないredux(react-redux社内勉強会資料)

react-reduxの社内勉強資料のうち、公開できる箇所を公開します。

スライド上では、課題の解説はあまりしていません。
課題の回答・解説は以下のレポジトリをご参照ください。

https://github.com/sadnessOjisan/todo_react
https://github.com/sadnessOjisan/react-brother-bothering-update-example
https://github.com/sadnessOjisan/redux-count-handson
https://github.com/sadnessOjisan/react-redux-count-handson
https://github.com/sadnessOjisan/react-redux-todo

sadnessOjisan

February 25, 2019
Tweet

More Decks by sadnessOjisan

Other Decks in Technology

Transcript

  1. ͜ͷߨ࠲ͷҐஔ෇͚ • 3FBDUߨ࠲ • ͳͥɺ3FBDU͕ඞཁʹͳͬͨͷ͔Λղઆ͢Δճ • ඇಉظॲཧߨ࠲ • $BMMCBDL 1SPNJTF

    "TZOD "XBJUͰ"1*ͷ'FUDIΛؤுΔճ • ؀ڥߏஙߨ࠲ • /1. #BCFM XFCQBDLͷઃఆΛղઆ͢Δճ • 3FEVYߨ࠲ • 3FBDUΛར༻ͨ͠େن໛։ൃߨ࠲ • 3FEVDFSͷ෼ׂ΍NJEEMFXBSFͷ࢖͍ํΛֶͿɻ 3
  2. 5BCMFPG$POUFOUT  ͸͡Ίʹ  ࠲ֶ3FEVYΛֶͿϞνϕʔγϣϯʹ͍ͭͯ B ͳͥ"JS͸3FBDUΛ࠾༻ͨ͠ͷ͔ͳͥࢲͨͪ͸3FBDU3FEVYΛֶͿͷ͔ C ͳͥ3FEVYΛֶͿͷ͔3FBDU୯ମͰར༻͢ΔͱԿ͕ਏ͘ͳΔͷ͔ D

    3FEVYͰঢ়ଶΛ؅ཧ͢ΔͨΊʹ஌Δ΂͖֓೦  ϋϯζΦϯ3FEVYͰΧ΢ϯτػೳΛ࡞Δ  ϥϯν  ࠲ֶ3FBDU͔Β3FEVYΛར༻͢Δʹ͸Ͳ͏͢Ε͹͍͍͔ B SFBDUSFEVYͰొ৔͢Δ֓೦  ϋϯζΦϯ3FBDU3FEVYͰΧ΢ϯτΞϓϦΛ࡞Δ  ϋϯζΦϯ3FBDU3FEVYͰ5PEPΞϓϦΛ࡞Δ 5
  3. ར༻͢Διʔείʔυ 8 "QQ໊ 63- આ໌ UPEP@SFBDU IUUQTHJUIVCDPNTBEOFTT0KJTBOUPEP@ SFBDU લճͷϋϯζΦϯͰ։ൃͨ͠UPEPΞϓϦͷճ ౴Ͱ͢ɻࠓ೔͸͜ΕΛSFEVYԽ͢Δ͜ͱ͕࠷

    ऴ໨ඪͰ͢ɻ SFBDUCSPUIFSCPUIFSJOHVQEBUFFYBNQMF IUUQTHJUIVCDPNTBEOFTT0KJTBOSFBDU CSPUIFSCPUIFSJOHVQEBUFFYBNQMF ܑఋίϯϙʔωϯτΛSFEVYͳ͠Ͱߋ৽͢Δ ͱΊΜͲ͍͘͞ྫ SFEVYDPVOUIBOETPO IUUQTHJUIVCDPNTBEOFTT0KJTBOSFEVY DPVOUIBOETPO SFEVYͰ؆୯ͳঢ়ଶ؅ཧΛ͠·͢ʢΧ΢ϯ τʣ SFBDUSFEVYDPVOUIBOETPO IUUQTHJUIVCDPNTBEOFTT0KJTBOSFBDU SFEVYDPVOUIBOETPO SFEVYͰ؅ཧ͍ͯ͠ΔΧ΢ϯτTUBUFΛSFBDU ͔ΒΞΫηεɾߋ৽Ͱ͖ΔΑ͏ʹ͠·͢ɻ SFBDUSFEVYUPEP IUUQTHJUIVCDPNTBEOFTT0KJTBOSFBDU SFEVYUPEP UPEPϦετΛSFEVYԽͨ͠΋ͷ ͦΕͧΕɺ׬੒ܗ΍಺෦࢓༷ &4%PD Λ/FUMJGZʹσϓϩΠ͍ͯ͠·͢ɻ ϦϯΫ͸ɺ֤ϨϙδτϦͷ3&"%.&ʹॻ͍ͯ͋Γ·͢ɻ
  4. SFBDUSFEVYͷͭ·͖ͮϙΠϯτ u ొ৔ਓ෺͕ଟ͍ u SFBDUSFEVY΍SFEVY͕ཁٻ͢Δؔ਺͕ɺͳͥඞཁʹͳΔ͔Θ͔Γʹ ͍͘ Ø FY ఆٛࣗମ͸SFEVYͱؔ܎͕ͳ͍ͨͩͷؔ਺ͱͳΔ΋ͷ͕ଟ͍ u

    最小限を動かすフェイズに至れなく、検証しながら壊しながら学ぶというこ とが難しい Ø "Λ࡞ΔͨΊʹ͸#͕ඞཁ͕ͩɺ#Λಈ͔ͨ͢Ίʹ͸"ͷϝιου͕ඞཁͩ 11
  5. SFBDUSFEVY͸Ͳ͏ֶ΂͹͍͍͔ u SFEVYͱSFBDUSFEVY͸ઈରʹ෼ֶ͚ͯͿ Ø SFEVYͱSFBDUSFEVY͸ผͩΑʂ Ø SFEVY୯ମ͸SFBDU͕ແͯ͘΋ಈ͘Αʂ u ·ͣ͸֓೦ͱ࢖͍͔͚֮ͨͩ͑ͯ͠·͓͏ʂ u

    ಈ͘͜ͱ͕֬໿͞Ε͍ͯΔαϯϓϧʢެࣜͳͲʣʹܕΛॻ͍ͯΈΔ Ø Ͳͷؔ਺͕ɺͲΜͳҾ਺Λཁٻ͠ɺͲΜͳฦΓ஋Λฦ͢΂ֶ͖͔͕΂Δ 12
  6. ܕͷಡΈํ 15 u ܕ͸ม਺΍Ҿ਺͕ॴଐ͢Δάϧʔϓͷ͜ͱ Ͱ͢ɻ u IPHF ͰIPHFܕΛม਺΍Ҿ਺ʹએݴ͢Δ ͜ͱ͕Ͱ͖·͢ɻ u

    DPOTU G BSHOVNCFS TUSJOH\^ ͸ɺOVNCFSܕΛҾ਺ʹɺTUSJOHܕͷฦΓ ஋GΛఆ͍ٛͯ͠·͢ɻ u ܕ͕͋Ε͹ɺͲΜͳؔ਺ʹͲΜͳม਺Λ౉ ͤ͹͍͍͔͕Θ͔ΔͷͰɺίʔυΛཧղ͠ ΍͘͢ͳΓ·͢ɻ カーソルを合わせると、型 の定義が表示されます。 型の上で「コマンドキー + クリック」すると 型の定義元にジャンプできます。
  7. 5BCMFPG$POUFOUT  ͸͡Ίʹ  ࠲ֶ3FEVYΛֶͿϞνϕʔγϣϯʹ͍ͭͯ B ͳͥ"JS͸3FBDUΛ࠾༻ͨ͠ͷ͔ͳͥࢲͨͪ͸3FBDU3FEVYΛֶͿͷ͔ C ͳͥ3FEVYΛֶͿͷ͔3FBDU୯ମͰར༻͢ΔͱԿ͕ਏ͘ͳΔͷ͔ D

    3FEVYͰঢ়ଶΛ؅ཧ͢ΔͨΊʹ஌Δ΂͖֓೦  ϋϯζΦϯ3FEVYͰΧ΢ϯτػೳΛ࡞Δ  ϥϯν  ࠲ֶ3FBDU͔Β3FEVYΛར༻͢Δʹ͸Ͳ͏͢Ε͹͍͍͔ B SFBDUSFEVYͰొ৔͢Δ֓೦  ϋϯζΦϯ3FBDU3FEVYͰΧ΢ϯτΞϓϦΛ࡞Δ  ϋϯζΦϯ3FBDU3FEVYͰ5PEPΞϓϦΛ࡞Δ 16
  8. ฐࣾΛऔΓר͘"QQ։ൃ؀ڥ 18 ػೳɾॊೈੑɾ։ൃ଎౓ʹର͢Δ ཁٻ΍೉қ౓͕ߴ͘ͳ͍ͬͯΔ ͜Ε·Ͱͷ։ൃ ϝσΟΞ։ൃ اը΍ಛू୯ҐͰͷػೳཁ݅ ʹ஧࣮ͳ։ൃ ίϯςϯπΛૌٻ͢ΔͨΊͷ ੩తͳ8FCϖʔδ

    ࠷ۙ૿͑ͭͭ͋Δ։ൃ 4BB4։ൃ ࢖͍΍͢͞Λߟྀ͠ɺܭଌ͠ͳ͕ ΒΤϯϋϯεΛ܁Γฦ͢։ൃ ಈతͰߴػೳͰͨ͘͞Μͷঢ়ଶ΍ ෼ذΛ࣋ͬͨෳࡶͳ"QQ
  9. ͦ͜Ͱ3FBDUΛ࢖ͬͨϑϩϯτΤϯυ։ൃ u 3FBDUͬͯͲΜͳϥΠϒϥϦʁ u 6*Λએݴతʹॻ͚Δʢ%FDMBUJWFʣ u UIを宣言すれば、状態やデータを勝手にレンダリングしてくれるよ! (React will efficiently

    update and render just the right components when your data changes.) u 6*Λύʔπ͝ͱʹ࡞͍ͬͯ͘ $PNQPOFOU#BTFE u UIのパーツを作って、それを組み合わせてページを作るよ! (Build encapsulated components that manage their own state, then compose them to make complex UIs.) 20 G TUBUF 6*ͱͳΔੈքͰɺύʔπΛ૊Έ߹Θͤͯ։ൃʂ
  10. TUBUF΍ϋϯυϥͷόέπϦϨʔ 28 Root ίϯϙʔωϯτ AB2 ABB3 A1 D1 E1 DA2

    DB2 TUBUF ABB3のstateを、ABB3がクリックされ た時に、 E1のstateに応じて更新した い
  11. TUBUF΍ϋϯυϥͷόέπϦϨʔ 29 Root ίϯϙʔωϯτ AB2 ABB3 A1 D1 E1 DA2

    DB2 TUBUF  &ͷTUBUFΛड͚औΔͨΊͷؔ਺'Λఆٛ
  12. TUBUF΍ϋϯυϥͷόέπϦϨʔ 30 Root ίϯϙʔωϯτ AB2 ABB3 A1 D1 E1 DA2

    DB2 TUBUF  &ͷTUBUFΛड͚औΔͨΊͷؔ਺'Λఆٛ  'Λ࣮ߦ͠ɺ&ͷ TUBUFΛϧʔτʹ఻͑Δ E1
  13. TUBUF΍ϋϯυϥͷόέπϦϨʔ 31 Root ίϯϙʔωϯτ AB2 ABB3 A1 D1 E1 DA2

    DB2 TUBUF  &ͷTUBUFΛड͚औΔͨΊͷؔ਺'Λఆٛ  'Λ࣮ߦ͠ɺ&ͷ TUBUFΛϧʔτʹ఻͑Δ E1 E1 E1 E1
  14. TUBUF΍ϋϯυϥͷόέπϦϨʔ 33 Root ίϯϙʔωϯτ AB2 ABB3 A1 D1 E1 DA2

    DB2 TUBUF  &ͷTUBUFΛड͚औΔͨΊͷؔ਺'Λఆٛ  'Λ࣮ߦ͠ɺ&ͷ TUBUFΛϧʔτʹ఻͑Δ E1 E1 E1 E1 なかなかめんどくさい
  15. ղܾࡦ u TUBUFΛSPPUίϯϙʔωϯτ͚͕ͩ࣋ͪɺTUBUFͱͦΕΛߋ৽͢Δϋ ϯυϥΛࢠڙίϯϙʔωϯτʹ౉͢ 38 ϝϦοτ • ࢠ͔Β਌ʹ஋΍ϋϯυϥΛ౉͢൥Θ͠͞ Λ׬શʹͳͤ͘Δ σϝϦοτ

    • ਌ίϯϙʔωϯτ͕ΊͪΌͪ͘Όେ͖͘ ͳͬͯ͠·͍ɺ؅ཧ͕େมͦ͏ • όέπϦϨʔͷํ޲͸౷ҰͰ͖Δ͕ɺό έπϦϨʔࣗମ͸ͳ͘ͳ͍ͬͯͳ͍ • ίϯϙʔωϯτͷπϦʔࣗମ͕มΘΔͱɺ मਖ਼͕ࠔ೉
  16. SFEVYͰঢ়ଶΛߋ৽͢Δྫ 44 const redux = require("redux"); const initialState = {

    count: 0 }; const reducer = (state = initialState, action) => { switch (action.type) { case "COUNT_UP": return { ...state, count: state.count + 1 }; default: return; } }; const store = redux.createStore(reducer); store.dispatch({ type: "COUNT_UP" });
  17. SFEVYͰঢ়ଶΛߋ৽͢Δྫ 45 const redux = require("redux"); const initialState = {

    count: 0 }; const reducer = (state = initialState, action) => { switch (action.type) { case "COUNT_UP": return { ...state, count: state.count + 1 }; default: return; } }; const store = redux.createStore(reducer); store.dispatch({ type: "COUNT_UP" }); Count数を状態として扱うことを宣言する
  18. SFEVYͰঢ়ଶΛߋ৽͢Δྫ 46 const redux = require("redux"); const initialState = {

    count: 0 }; const reducer = (state = initialState, action) => { switch (action.type) { case "COUNT_UP": return { ...state, count: state.count + 1 }; default: return; } }; const store = redux.createStore(reducer); store.dispatch({ type: "COUNT_UP" }); どういうときに、どういう風に状態を更新 するかを定義する。
  19. SFEVYͰঢ়ଶΛߋ৽͢Δྫ 47 const redux = require("redux"); const initialState = {

    count: 0 }; const reducer = (state = initialState, action) => { switch (action.type) { case "COUNT_UP": return { ...state, count: state.count + 1 }; default: return; } }; const store = redux.createStore(reducer); store.dispatch({ type: "COUNT_UP" }); COUNT_UP という命令が来たら、カウント をアップすることを定義する
  20. SFEVYͰঢ়ଶΛߋ৽͢Δྫ 48 const redux = require("redux"); const initialState = {

    count: 0 }; const reducer = (state = initialState, action) => { switch (action.type) { case "COUNT_UP": return { ...state, count: state.count + 1 }; default: return; } }; const store = redux.createStore(reducer); store.dispatch({ type: "COUNT_UP" }); 上で作った状態と状態更新ルールを持っ た状態管理オブジェクトを作る
  21. SFEVYͰঢ়ଶΛߋ৽͢Δྫ 49 const redux = require("redux"); const initialState = {

    count: 0 }; const reducer = (state = initialState, action) => { switch (action.type) { case "COUNT_UP": return { ...state, count: state.count + 1 }; default: return; } }; const store = redux.createStore(reducer); store.dispatch({ type: "COUNT_UP" }); 状態を保つオブジェクトに対して、状態更 新の命令を送る
  22. SFEVDFSTUPSFΛߋ৽͢Δؔ਺ 53 const reducer = (state = initialState, action) =>

    { switch (action.type) { case ”HOGE": return { ...state, message: ‘パンケーキ’ }; case ”FUGA": return { ...state, message: ‘シフォンケーキ’ }; case "RESET": return initialState; default: return; } }; {type: “HOGE”}を受け取ると、新しいstate として{message: ‘パンケーキを返す’}
  23. SFEVDFSTUPSFΛߋ৽͢Δؔ਺ 54 const reducer = (state = initialState, action) =>

    { switch (action.type) { case ”HOGE": return { ...state, message: ‘パンケーキ’ }; case ”FUGA": return { ...state, message: ‘シフォンケーキ’ }; case "RESET": return initialState; default: return; } }; {type: “FUGA”}を受け取ると、新しいstate として{message: ‘シフォンケーキ’}を返す
  24. BDUJPOߋ৽಺༰ʹ͍ͭͯͷϝοηʔδ u TUPSFʹରͯ͠ɺͲͷΑ͏ͳมߋΛͯ͠΄͍͔͠ॻ͔Εͨϝοηʔδ u \UZQFTUSJOH QBZMPBE NJYFE^ܗࣜͷͨͩͷΦϒδΣΫτ u UZQF͸༷ʑͳΞΫγϣϯͷࣝผࢠɺQBZMPBE͸ߋ৽ͯ͠΄͍͠σʔ λɻUZQF͸ඞਢ͕ͩɺQBZMPBE͸ͳͯ͘΋ྑ͍ɻ

    UZQF΍QBZMPBEͱ ͍͏Ωʔ໊͸׳श u store.dispatch(action) ΛݺͿͱɺSFEVDFS͕࣮ߦ͞ΕΔ ʮBDUJPOΛEJTQBUDI͢Δʯͱදݱ͞ΕΔ ɻͦͷ݁ՌɺBDUJPOΛݩʹ TUPSFΛߋ৽͢Δ͜ͱ͕Ͱ͖Δɻ 55
  25. 5BCMFPG$POUFOUT  ͸͡Ίʹ  ࠲ֶ3FEVYΛֶͿϞνϕʔγϣϯʹ͍ͭͯ B ͳͥ"JS͸3FBDUΛ࠾༻ͨ͠ͷ͔ͳͥࢲͨͪ͸3FBDU3FEVYΛֶͿͷ͔ C ͳͥ3FEVYΛֶͿͷ͔3FBDU୯ମͰར༻͢ΔͱԿ͕ਏ͘ͳΔͷ͔ D

    3FEVYͰঢ়ଶΛ؅ཧ͢ΔͨΊʹ஌Δ΂͖֓೦  ϋϯζΦϯ3FEVYͰΧ΢ϯτػೳΛ࡞Δ  ϥϯν  ࠲ֶ3FBDU͔Β3FEVYΛར༻͢Δʹ͸Ͳ͏͢Ε͹͍͍͔ B SFBDUSFEVYͰొ৔͢Δ֓೦  ϋϯζΦϯ3FBDU3FEVYͰΧ΢ϯτΞϓϦΛ࡞Δ  ϋϯζΦϯ3FBDU3FEVYͰ5PEPΞϓϦΛ࡞Δ 56
  26. ౴͑ • SFEVDFSʹ$06/5@%08/ͱ 3&4&5Λఆٛ • ͦΕͧΕɺͨ͋͠ͱͷTUBUF  JOJUJBM4UBUFΛฦͯ͋͛͠Δ • $06/5@%08/ͱ3&4&5Λ

    TUPSFEJTQBUDIͯ͋͛͠Δ 61 const redux = require("redux"); const initialState = { count: 0 }; const reducer = (state = initialState, action) => { switch (action.type) { case "COUNT_UP": return { ...state, count: state.count + 1 }; case "COUNT_DOWN": return { ...state, count: state.count - 1 }; case "RESET": return initialState; default: return; } }; const store = redux.createStore(reducer); store.dispatch({ type: "COUNT_UP" }); console.log("1回COUNT_UPしてみた結果: ", store.getState()); store.dispatch({ type: "COUNT_DOWN" }); store.dispatch({ type: "COUNT_DOWN" }); console.log("2回COUNT_DOWNしてみた結果: ", store.getState()); store.dispatch({ type: "RESET" }); console.log("RESETしてみた結果: ", store.getState()); 回答URL) https://github.com/sadnessOjisan/redux-count-handson
  27. ղ౴ 62 "QQ໊ 63- આ໌ UPEP@SFBDU IUUQTHJUIVCDPNTBEOFTT0KJTBOUPEP@ SFBDU લճͷϋϯζΦϯͰ։ൃͨ͠UPEPΞϓϦͷճ ౴Ͱ͢ɻࠓ೔͸͜ΕΛSFEVYԽ͢Δ͜ͱ͕࠷

    ऴ໨ඪͰ͢ɻ SFBDUCSPUIFSCPUIFSJOHVQEBUFFYBNQMF IUUQTHJUIVCDPNTBEOFTT0KJTBOSFBDU CSPUIFSCPUIFSJOHVQEBUFFYBNQMF ܑఋίϯϙʔωϯτΛSFEVYͳ͠Ͱߋ৽͢Δ ͱΊΜͲ͍͘͞ྫ SFEVYDPVOUIBOETPO IUUQTHJUIVCDPNTBEOFTT0KJTBOSFEVY DPVOUIBOETPO SFEVYͰ؆୯ͳঢ়ଶ؅ཧΛ͠·͢ʢΧ΢ϯ τʣ SFBDUSFEVYDPVOUIBOETPO IUUQTHJUIVCDPNTBEOFTT0KJTBOSFBDU SFEVYDPVOUIBOETPO SFEVYͰ؅ཧ͍ͯ͠ΔΧ΢ϯτTUBUFΛSFBDU ͔ΒΞΫηεɾߋ৽Ͱ͖ΔΑ͏ʹ͠·͢ɻ SFBDUSFEVYUPEP IUUQTHJUIVCDPNTBEOFTT0KJTBOSFBDU SFEVYUPEP UPEPϦετΛSFEVYԽͨ͠΋ͷ ͦΕͧΕɺ׬੒ܗ΍಺෦࢓༷ &4%PD Λ/FUMJGZʹσϓϩΠ͍ͯ͠·͢ɻ ϦϯΫ͸ɺ֤ϨϙδτϦͷ3&"%.&ʹॻ͍ͯ͋Γ·͢ɻ
  28. 5BCMFPG$POUFOUT  ͸͡Ίʹ  ࠲ֶ3FEVYΛֶͿϞνϕʔγϣϯʹ͍ͭͯ B ͳͥ"JS͸3FBDUΛ࠾༻ͨ͠ͷ͔ͳͥࢲͨͪ͸3FBDU3FEVYΛֶͿͷ͔ C ͳͥ3FEVYΛֶͿͷ͔3FBDU୯ମͰར༻͢ΔͱԿ͕ਏ͘ͳΔͷ͔ D

    3FEVYͰঢ়ଶΛ؅ཧ͢ΔͨΊʹ஌Δ΂͖֓೦  ϋϯζΦϯ3FEVYͰΧ΢ϯτػೳΛ࡞Δ  ϥϯν  ࠲ֶ3FBDU͔Β3FEVYΛར༻͢Δʹ͸Ͳ͏͢Ε͹͍͍͔ B SFBDUSFEVYͰొ৔͢Δ֓೦  ϋϯζΦϯ3FBDU3FEVYͰΧ΢ϯτΞϓϦΛ࡞Δ  ϋϯζΦϯ3FBDU3FEVYͰ5PEPΞϓϦΛ࡞Δ 64
  29. SFBDUSFEVY u Official React bindings for Redux. (https://react-redux.js.org/introduction/quick-start) u コンポーネントから

    redux の store を参照したり、action を dispatch するこ とを可能にするライブラリ u react + redux を実現するために必要なライブラリ 66
  30. SFBDUSFEVY͕ʂਓʑΛ࠳ંͤ͞Δʂʂʂ 70 人 畜 無 害 そ う な 顔

    を し て い る が 数 え 切 れ な い ほ ど の 人 間 を 挫 折 さ せ て い る
  31. SFBDUSFEVYͷ೉͠͞ u Reactとreduxの接続方法が少なくとも4通りある。特にdispatcherのつなぎ こみが混乱しやすい。 u そもそも、登場人物が多い! u provider, connect, mapStateToProps,

    mapDispatchToProps, dispatch, … u しかし、react-reduxが提供している関数は、providerとconnectのみである 71 えっ、残りの登場人物はどこから登場してきたの?
  32. SFBDUSFEVYͷ೉͠͞ u 登場人物が多い! u provider, connect, mapStateToProps, mapDispatchToProps, dispatch, bindActionCreators,

    … u しかし、react-reduxが提供している関数は、providerとconnectのみである 72 えっ、残りの登場人物はどこから登場してきたの? ͋ͳ͕ͨ࡞ΔͷͰ͢
  33. DPOOFDU u 任意のReactコンポーネントをreduxのstoreと接続するために利用する関数 80 class Component extends React.Component { }

    // Component -> Reactコンポーネント const ConnectedComponent = connect()(Component) // ConnectedComponent -> redux storeと接続されたコンポーネント
  34. DPOOFDU u connect関数は4つの引数を取ることができる • mapStateToProps?: Function • mapDispatchToProps?: Function |

    Object • mergeProps?: Function • options?: Object u connect関数は、コンポーネントを引数に取る関数を返す u connect()が返した関数はコンポーネントを引数に取り、storeにアクセスできるコンポー ネントを作って返してくれるよ! 81 「?」はなくても良いという意味. Maybe Types. Ex) function f1(name:string, age? number) は、 関数f1はstring型 のnameが必要で、number型のageは必要というわけではない あまり使うことはないです。 すくなくとも今は考えなくても良いですー。
  35. NBQ4UBUF5P1SPQT u DPOOFDUͷୈҰҾ਺ NBQ4UBUF5P1SPQTͱݺ͹Ε͍ͯΔɻ u ͜Ε͸ɺҰൠతʹɺ const mapStateToProps = state

    => ({ hoge: state.fuga, … }) ͱ͍͏ܗͷؔ਺ u ίϯϙʔωϯτ಺ͰɺTUPSFͷͲͷ஋ΛಡΈऔΓ͍͔ͨΛબ୒͢Δػ ೳʢTFMFDUPSͱݺ͹ΕΔ͜ͱ΋ʣɻTUBUFΛTUPSFͱߟ͑Δͱཧղ͠ ΍͍͢ 84
  36. NBQ%JTQBUDI5P1SPQT u connectの第二引数。mapDispatchToPropsと呼ばれている u 一般的には、 const mapDispatchToProps = dispatch =>

    { return {hoge: dispatch(hogeActionCreator())} } と定義される u action creatorを渡すことで、どのactionをdispatchさせるかを定義する 85 dispatchは、ただの引数の名前
  37. DPOOFDUΛਂ۷Δ  TUPSFͱͷ઀ଓΛઃఆ͢Δؔ਺ʢલ൒ʣͱɺ࣮ࡍʹTUPSFͱ઀ଓ ͯ͘͠ΕΔؔ਺ʢޙ൒ʣʹ෼͚ͯߟ͑Δͱཧղ͠΍͍͢Αʂ DPOOFDU NBQ4UBUF5P1SPQT NBQ%JTQBUDI5P1SPQT $PNQPOFOU 4UPSFͷͲͷ෦෼Λ࢖͏͔ɺͲΜͳΞΫγϣϯΛ ࢖͍͍͔ͨઃఆ͢Δ

    3FEVYͱͷ઀ଓͷઃఆΛɺίϯϙʔωϯτ ʹ൓өͤ͞Δॲཧ f()() という書き方は、なにかの設定をしてあげ、 その設定を反映させるみたいなことをしたいとき に、よくあるテクニックです。なんか変な呼び出し 方だよね。
  38. ΫΠζ 87 class Component extends React.Component{ constructor(){ console.log(this.props); } }

    const mapStateToProps = state => { return { hoge: state.hoge, fuga: state.fuga } } const mapDispatchToProps = dispatch => { return { foo: dispatch(foo()) } } export default connect(mapStateToProps)(Component) このコンポーネントはどんな propsが入っているでしょう!
  39. ΫΠζ 88 class Component extends React.Component{ constructor(){ console.log(this.props); } }

    const mapStateToProps = state => { return { hoge: state.hoge, fuga: state.fuga } } const mapDispatchToProps = dispatch => { return { foo: dispatch(foo()) } } export default connect(mapStateToProps,mapDispatchToProps)(Component) このコンポーネントはどんな propsが入っているでしょう!
  40. ΫΠζ 89 class Component extends React.Component{ constructor(){ console.log(this.props); } }

    const mapStateToProps = state => { return { hoge: state.hoge, fuga: state.fuga } } const mapDispatchToProps = dispatch => { return { foo: dispatch(foo()) } } export default connect(null,mapDispatchToProps)(Component) このコンポーネントはどんな propsが入っているでしょう!
  41. ೉͍͠ΫΠζ̐ 90 class Component extends React.Component{ constructor(){ console.log(this.props); } }

    const mapStateToProps = state => { return { hoge: state.hoge, fuga: state.fuga } } const mapDispatchToProps = dispatch => { return { foo: dispatch(foo()) } } export default connect()(Component) このコンポーネントはどんな propsが入っているでしょう!
  42. SFBDUSFEVY͕ʂਓʑΛ࠳ંͤ͞Δʂʂʂ 92 人 畜 無 害 そ う な 顔

    を し て い る が 数 え 切 れ な い ほ ど の 人 間 を 挫 折 さ せ て い る
  43. SFBDUSFEVY͕ʂਓʑΛ࠳ંͤ͞Δʂʂʂ 93 人 畜 無 害 そ う な 顔

    を し て い る が 数 え 切 れ な い ほ ど の 人 間 を 挫 折 さ せ て い る
  44. 5BCMFPG$POUFOUT  ͸͡Ίʹ  ࠲ֶ3FEVYΛֶͿϞνϕʔγϣϯʹ͍ͭͯ B ͳͥ"JS͸3FBDUΛ࠾༻ͨ͠ͷ͔ͳͥࢲͨͪ͸3FBDU3FEVYΛֶͿͷ͔ C ͳͥ3FEVYΛֶͿͷ͔3FBDU୯ମͰར༻͢ΔͱԿ͕ਏ͘ͳΔͷ͔ D

    3FEVYͰঢ়ଶΛ؅ཧ͢ΔͨΊʹ஌Δ΂͖֓೦  ϋϯζΦϯ3FEVYͰΧ΢ϯτػೳΛ࡞Δ  ϥϯν  ࠲ֶ3FBDU͔Β3FEVYΛར༻͢Δʹ͸Ͳ͏͢Ε͹͍͍͔ B SFBDUSFEVYͰొ৔͢Δ֓೦  ϋϯζΦϯ3FBDU3FEVYͰΧ΢ϯτΞϓϦΛ࡞Δ  ϋϯζΦϯ3FBDU3FEVYͰ5PEPΞϓϦΛ࡞Δ 94
  45. ౴͑ • DPVOUΛTUPSFʹఆٛ • SFEVDFSʹCOUNT_UPͱ COUNT_DOWNのcaseΛఆٛ • ͦΕͧΕʹରԠͨ͠ BDUJPO$SFBUPSΛFYQPSU͢Δ 99

    回答URL) https://github.com/sadnessOjisan/react-redux-count-handson const countUp = (): TCountUpAction => { return { type: COUNT_UP }; }; const countDown = (): TCountDownAction => { return { type: COUNT_DOWN}; }; export const actionCreators = { countUp, countDown }; const initialState = { count: 0 }; // reducer const reducer = (state: TState = initialState, action: TAction) => { switch (action.type) { case COUNT_UP: return { ...state, count: state.count + 1 }; case COUNT_DOWN: return { ...state, count: state.count - 1 }; default: return initialState; } };
  46. ౴͑ • TUPSFͷΧ΢ϯτΛಡΈࠐΉͨΊͷؔ਺ NBQ4UBUF5P1SPQTΛఆٛ • DPVOUͷૢ࡞ΛQSPQT͔ΒͰ͖ΔΑ͏ʹ ͢Δؔ਺NBQ%JTQBUDI5P1SPQTΛఆٛ • DPOOFDUʹNBQ4UBUF5P1SPQTͱ NBQ%JTQBUDI5P1SPQTΛ౉ͯ͠ɺίϯ

    ϙʔωϯτͷத͔ΒTUBUFͱEJTQBUDIFS ʹΞΫηεͰ͖ΔΑ͏ʹͯ͋͛͠Δ 100 回答URL) https://github.com/sadnessOjisan/react-redux-count-handson const mapStateToProps = (state: TStore) => { return { count: state.count }; }; const mapDispatchToProps = (dispatch: Dispatch<*>) => { return { countUp: ()=>dispatch(countUp()), countDown: ()=>dispatch(countDown()) }; }; export default connect( mapStateToProps, mapDispatchToProps )(Counter);
  47. ղ౴ 101 "QQ໊ 63- આ໌ UPEP@SFBDU IUUQTHJUIVCDPNTBEOFTT0KJTBOUPEP@ SFBDU લճͷϋϯζΦϯͰ։ൃͨ͠UPEPΞϓϦͷճ ౴Ͱ͢ɻࠓ೔͸͜ΕΛSFEVYԽ͢Δ͜ͱ͕࠷

    ऴ໨ඪͰ͢ɻ SFBDUCSPUIFSCPUIFSJOHVQEBUFFYBNQMF IUUQTHJUIVCDPNTBEOFTT0KJTBOSFBDU CSPUIFSCPUIFSJOHVQEBUFFYBNQMF ܑఋίϯϙʔωϯτΛSFEVYͳ͠Ͱߋ৽͢Δ ͱΊΜͲ͍͘͞ྫ SFEVYDPVOUIBOETPO IUUQTHJUIVCDPNTBEOFTT0KJTBOSFEVY DPVOUIBOETPO SFEVYͰ؆୯ͳঢ়ଶ؅ཧΛ͠·͢ʢΧ΢ϯ τʣ SFBDUSFEVYDPVOUIBOETPO IUUQTHJUIVCDPNTBEOFTT0KJTBOSFBDU SFEVYDPVOUIBOETPO SFEVYͰ؅ཧ͍ͯ͠ΔΧ΢ϯτTUBUFΛSFBDU ͔ΒΞΫηεɾߋ৽Ͱ͖ΔΑ͏ʹ͠·͢ɻ SFBDUSFEVYUPEP IUUQTHJUIVCDPNTBEOFTT0KJTBOSFBDU SFEVYUPEP UPEPϦετΛSFEVYԽͨ͠΋ͷ ͦΕͧΕɺ׬੒ܗ΍಺෦࢓༷ &4%PD Λ/FUMJGZʹσϓϩΠ͍ͯ͠·͢ɻ ϦϯΫ͸ɺ֤ϨϙδτϦͷ3&"%.&ʹॻ͍ͯ͋Γ·͢ɻ
  48. 5BCMFPGDPOUFOUT  ͸͡Ίʹ  ࠲ֶSFEVYΛֶͿϞνϕʔγϣϯʹ͍ͭͯ B ͳͥBJS͸SFBDUΛ࠾༻ͨ͠ͷ͔ͳͥࢲͨͪ͸SFBDUSFEVYΛֶͿͷ͔ C ͳͥSFEVYΛֶͿͷ͔SFBDU୯ମͰར༻͢ΔͱԿ͕ਏ͘ͳΔͷ͔ D

    SFEVYͰঢ়ଶΛ؅ཧ͢ΔͨΊʹ஌Δ΂͖֓೦  ϋϯζΦϯSFEVYͰΧ΢ϯτػೳΛ࡞Δ  ϥϯν  ࠲ֶSFBDU͔ΒSFEVYΛར༻͢Δʹ͸Ͳ͏͢Ε͹͍͍͔ B SFBDUSFEVYͰొ৔͢Δ֓೦  ϋϯζΦϯSFBDUSFEVYͰΧ΢ϯτΞϓϦΛ࡞Δ  ϋϯζΦϯSFBDUSFEVYͰUPEPΞϓϦΛ࡞Δ 102
  49. ղ౴ 108 "QQ໊ 63- આ໌ UPEP@SFBDU IUUQTHJUIVCDPNTBEOFTT0KJTBOUPEP@ SFBDU લճͷϋϯζΦϯͰ։ൃͨ͠UPEPΞϓϦͷճ ౴Ͱ͢ɻࠓ೔͸͜ΕΛSFEVYԽ͢Δ͜ͱ͕࠷

    ऴ໨ඪͰ͢ɻ SFBDUCSPUIFSCPUIFSJOHVQEBUFFYBNQMF IUUQTHJUIVCDPNTBEOFTT0KJTBOSFBDU CSPUIFSCPUIFSJOHVQEBUFFYBNQMF ܑఋίϯϙʔωϯτΛSFEVYͳ͠Ͱߋ৽͢Δ ͱΊΜͲ͍͘͞ྫ SFEVYDPVOUIBOETPO IUUQTHJUIVCDPNTBEOFTT0KJTBOSFEVY DPVOUIBOETPO SFEVYͰ؆୯ͳঢ়ଶ؅ཧΛ͠·͢ʢΧ΢ϯ τʣ SFBDUSFEVYDPVOUIBOETPO IUUQTHJUIVCDPNTBEOFTT0KJTBOSFBDU SFEVYDPVOUIBOETPO SFEVYͰ؅ཧ͍ͯ͠ΔΧ΢ϯτTUBUFΛSFBDU ͔ΒΞΫηεɾߋ৽Ͱ͖ΔΑ͏ʹ͠·͢ɻ SFBDUSFEVYUPEP IUUQTHJUIVCDPNTBEOFTT0KJTBOSFBDU SFEVYUPEP UPEPϦετΛSFEVYԽͨ͠΋ͷ ͦΕͧΕɺ׬੒ܗ΍಺෦࢓༷ &4%PD Λ/FUMJGZʹσϓϩΠ͍ͯ͠·͢ɻ ϦϯΫ͸ɺ֤ϨϙδτϦͷ3&"%.&ʹॻ͍ͯ͋Γ·͢ɻ
  50. SFEVYSFBDUSFEVYΛ࢖͏خ͠͞ u TJOHMFTUPSFͰ͋ΔͨΊɺΞϓϦέʔγϣϯͷঢ়ଶΛҰՕॴͰ؅ཧ Ͱ͖Δ u ͭ·ΓɺG TUBUF 6*͕ G TUPSF

    6*ͱͳΔ u SFEVYʹ઀ଓͨ͠ DPNQPOFOU͸ɺͲ͔͜ΒͰ΋ BDUJPO$SFBUPS Λ ݺͿ͜ͱͰ TUPSFΛߋ৽͢Δ͜ͱ͕Ͱ͖Δ 114