13. Thinking in React - accgetter/React GitHub Wiki
ç§ãã¡ã®èãã§ã¯ãReactã¯JavaScriptã䜿ã£ãŠå€§èŠæš¡ã§é«éãªWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®æãåªããæ¹æ³ã§ãã
ããã¯FacebookãšInstagramã§ãšãŠãã«ããŸãã¹ã±ãŒãªã³ã°ãããŠããŸãã
Reactã®ããããããçŽ æŽãããããŒãã®1ã€ã¯ãã¢ããªã®æ§ç¯ã«ã€ããŠèããããŠãããŸãã
ãã®ããã¥ã¡ã³ãã§ã¯ã
Reactã䜿çšããŠæ€çŽ¢å¯èœãªè£œåããŒã¿ããŒãã«ãæ§ç¯ãããšããèãæ¹ãéããŠèª¬æãããŠãããŸãã
ãã§ã«JSON APIãšãã¶ã€ããŒãäœæããã¢ãã¯ãæã£ãŠãããšããŸããã¢ãã¯ã¯æ¬¡ã®ããã«ãªããŸãïŒ
JSON APIã¯ã次ã®ãããªããŒã¿ãè¿ããŸã:
[
{category: "Sporting Goods", price: "$49.99", stocked: true, name: "Football"},
{category: "Sporting Goods", price: "$9.99", stocked: true, name: "Baseball"},
{category: "Sporting Goods", price: "$29.99", stocked: false, name: "Basketball"},
{category: "Electronics", price: "$99.99", stocked: true, name: "iPod Touch"},
{category: "Electronics", price: "$399.99", stocked: false, name: "iPhone 5"},
{category: "Electronics", price: "$199.99", stocked: true, name: "Nexus 7"}
];
æåã«ããããããšã¯ãã¢ãã¯å
ã®ãã¹ãŠã®ã³ã³ããŒãã³ãïŒããã³ãµãã³ã³ããŒãã³ãïŒã®åšãã«ããã¯ã¹ãæãã
ãã¹ãŠã®ååãä»ããããšã§ãããã¶ã€ããŒããããªã圌ãã«çžè«ããŸããããŒã
圌ãã®Photoshopã¬ã€ã€ãŒåã¯ããªãã®Reactã³ã³ããŒãã³ãã®ååãšåãã«ããã»ãããããããããŸããã
ããããã©ã®ããã«ããŠã³ã³ããŒãã³ããçµã¿ç«ãŠãŠããã¹ããïŒ
æ°ããæ©èœããªããžã§ã¯ããäœæããå¿
èŠããããã©ããã倿ããããã«ã
æè¡ãçµ±äžããŸãããããã®ææ³ã®1ã€ãåäžè²¬ä»»åçã§ãã
ã€ãŸããã³ã³ããŒãã³ãã¯çæ³çã«ã¯å®è¡ããããšã¯1ã€ã§ããå¿
èŠããããŸãã
ãããã§ããããããå°ããªãµãã³ã³ããŒãã³ãã«åè§£ãããã¹ãã§ãã
JSONããŒã¿ã¢ãã«ããŠãŒã¶ãŒã«è¡šç€ºããããšãå€ããããã¢ãã«ãæ£ããæ§ç¯ãããŠããã°ã
UIïŒã€ãŸãã³ã³ããŒãã³ãã®æ§é ïŒãããŸããããã³ã°ãããŸãã
ããã¯ãUIãšããŒã¿ã¢ãã«ãåãæ
å ±ã¢ãŒããã¯ãã£ãè³æºãšããå¿
èŠãããããã§ãã
ã€ãŸããUIãã³ã³ããŒãã³ãã«åå²ããäœæ¥ã¯çµæ§ç°¡åã§ãã
ããŒã¿ã¢ãã«ã®1ããŒã¹ããšã«ã³ã³ããŒãã³ãã«åè§£ããŠãã ããã
ã¢ããªã±ãŒã·ã§ã³ã«5ã€ã®ã³ã³ããŒãã³ããããããšãããããŸãã
åã³ã³ããŒãã³ãã衚ãããŒã¿ãã€ã¿ãªãã¯äœã«ããŸãã
-
FilterableProductTable
(ãªã¬ã³ãž): å šäœãå«ãã§ãã -
SearchBar
(é): ãŠãŒã¶ã®å ¥åãåãã -
ProductTable
(ç·): ãŠãŒã¶ãŒå ¥åã«åºã¥ããŠããŒã¿ã衚瀺ããã£ã«ã¿ãªã³ã°ããŸã -
ProductCategoryRow
(ã¿ãŒã³ã€ãº): åã«ããŽãªã®èŠåºãã衚瀺ãã -
ProductRow
(èµ€): ããããã®è£œåã®è¡ã衚瀺ãã
ProductTable
ãèŠããšãããŒãã«ãããïŒ" Name "ãš" Price "ã©ãã«ãå«ãïŒã
ç¬èªã®ã³ã³ããŒãã³ãã§ã¯ãªãããšãããããŸããããã¯å¥œã¿ã®åé¡ã§ããã
ã©ã¡ããã®æ¹æ³ã§è¡ãããè°è«ããããŸãããã®äŸã§ã¯ã ProductTable
ã®è²¬ä»»ã§ãã* ããŒã¿ *ã®ã¬ã³ããªã³ã°ã®äžéšã§ããããã
ããã ProductTable
ã®äžéšãšããŠæ®ããŸããã
ãã ãããã®ããããŒãè€éã«ãªããšïŒäŸãã°ããœãŒãçšã®æ
å ±ã远å ããå ŽåïŒã
ãããç¬èªã®ãProductTableHeaderãã³ã³ããŒãã³ãã«ãã¹ãã§ãã
ã¢ãã¯ã®äžã®ã³ã³ããŒãã³ããç¹å®ããã®ã§ãããããéå±€ã«é
眮ããŸãããã
ããã¯ç°¡åã§ããã¢ãã¯å
ã®å¥ã®ã³ã³ããŒãã³ãå
ã«è¡šç€ºãããã³ã³ããŒãã³ãã¯ãéå±€å
ã®åãšããŠè¡šç€ºãããŸãã
-
FilterableProductTable
SearchBar
-
ProductTable
ProductCategoryRow
ProductRow
See the Pen Thinking In React: Step 2 on CodePen.
ããã§ã³ã³ããŒãã³ãéå±€ã宿ããŸããã®ã§ãä»åºŠã¯ã¢ããªãå®è£
ããŸãããã
äžçªç°¡åãªæ¹æ³ã¯ãããŒã¿ã¢ãã«ãåã蟌ãã§UIãã¬ã³ããªã³ã°ãã€ã€ã
ã€ã³ã¿ã©ã¯ãã£ãæ§ãæããªãããŒãžã§ã³ãäœæããããšã§ãã
éçããŒãžã§ã³ãæ§ç¯ããã«ã¯æèã¯äžèŠã§å€ãã®ã¿ã€ããå¿
èŠã§ããã
ã€ã³ã¿ã©ã¯ãã£ãæ§ã远å ããã«ã¯å€ãã®æèãå¿
èŠã§ããã
å€ãã®ã¿ã€ãã³ã°ãå¿
èŠãšããªãããã
ãããã®ããã»ã¹ãåãé¢ãã®ãæåã§ããçç±ã¯ããã§ãã
ããŒã¿ã¢ãã«ãã¬ã³ããªã³ã°ããã¢ããªã±ãŒã·ã§ã³ã®éçããŒãžã§ã³ãæ§ç¯ããã«ã¯ã
ä»ã®ã³ã³ããŒãã³ããåå©çšãã* props ã䜿çšããŠããŒã¿ãæž¡ãã³ã³ããŒãã³ããæ§ç¯ããããšæãã§ãããã
propã¯ã芪ããåãžããŒã¿ãæž¡ãæ¹æ³ãªã®ã§ã state *ã®æŠå¿µã«ç²ŸéããŠããå Žåã
éçãªããŒãžã§ã³ãæ§ç¯ããããã«ãããã§ãstateã¯äœ¿çšããŠã¯ãããŸããã
stateã¯ãã€ã³ã¿ã©ã¯ãã£ãæ©èœãã€ãŸãæéã®çµéãšå
±ã«å€åããããŒã¿ã«å¯ŸããŠã®ã¿ãšéå®ãããŠããŸãã
ããã¯ã¢ããªã®éçãªããŒãžã§ã³ãªã®ã§ãããªãã¯stateã䜿ã£ãŠã¯ãããŸããã
ãããããŠã³ãŸãã¯ããã ã¢ããã§æ§ç¯ã§ããŸããã€ãŸããã³ã³ããŒãã³ããéå±€ã®äžäœã«æ§ç¯ããããšããå§ããŸã
ïŒã€ãŸãããFilterableProductTableãã§å§ãŸãïŒã
ãããã¯ãããããäžäœã®ã³ã³ããŒãã³ãïŒãProductRowãïŒã䜿çšããŠã³ã³ããŒãã³ããæ§ç¯ããããšãã§ããŸãã
ç°¡åãªäŸã§ã¯ãéåžžããããããŠã³ã®ã»ããæ¥œã§ãã
å€§èŠæš¡ãªãããžã§ã¯ãã§ã¯ããã«ãæã«ããã ã¢ããããŠãã¹ããæžãæ¹ãç°¡åã§ãã
ãã®ã¹ãããã®æåŸã«ããŒã¿ã¢ãã«ãã¬ã³ããªã³ã°ããåå©çšå¯èœãªã³ã³ããŒãã³ãã®ã©ã€ãã©ãªãçšæãããŠããŸãã
ããã¯ã¢ããªã±ãŒã·ã§ã³ã®éçãªããŒãžã§ã³ãªã®ã§ãã³ã³ããŒãã³ã㯠renderïŒïŒ
ã¡ãœããããæã¡ãŸããã
éå±€ã®æäžäœã«ããã³ã³ããŒãã³ãïŒ FilterableProductTable
ïŒã¯ãããŒã¿ã¢ãã«ãpropãšããŠåããŸãã
åºç€ãšãªãããŒã¿ã¢ãã«ã倿Žãã ReactDOM.renderïŒïŒ
ãããäžåºŠåŒã³åºããšãUIãæŽæ°ãããŸãã
UIãã©ã®ããã«æŽæ°ãããã©ã®éšåãå€ãããã¯ç°¡åã«ããããŸããè€éãªããšã¯äœããªãããã§ãã
Reactã®çæ¹åããŒã¿ãããŒïŒçæ¹åãã€ã³ãã£ã³ã°ãšãåŒã°ããŸãïŒã¯ããã¹ãŠã®ã¢ãžã¥ãŒã«åãšé«éåãå®çŸããŸãã
ãã®æé ãå®è¡ããéã«ãã«ããå¿ èŠãªå Žåã¯ãReact docs ãåç §ããŠãã ããã
Reactã«ã¯2çš®é¡ã® "ã¢ãã«" ããŒã¿ããããŸã: propãšstateã§ããäž¡è
ã®éããçè§£ããããšã¯éèŠã§ãã
ãã®éããããããªãå Žåã¯ããã£ãš[the official React docs]ïŒhttps://facebook.github.io/react/docs/interactivity-and-dynamic-uis.htmlïŒãèªãã§ãã
ã€ã³ã¿ã©ã¯ãã£ããªUIãäœæããã«ã¯ãåºç€ãšãªãããŒã¿ã¢ãã«ã®å€æŽãããªã¬ã§ããå¿
èŠããããŸãã
Reactã¯** state **ã§ãããç°¡åã«ããŸãã
ã¢ããªã±ãŒã·ã§ã³ãæ£ããæ§ç¯ããã«ã¯ããŸãã¢ããªã±ãŒã·ã§ã³ã«å¿
èŠãªäžé£ã®å€æŽãæå°éã§èããå¿
èŠããããŸãã
ãã®éµã¯DRYååã§ã: Don't Repeat Yourselfã
ã¢ããªã±ãŒã·ã§ã³ãå¿
èŠãšããstateã絶察æå°éã«è¡šçŸãã
ãªã³ããã³ãã§å¿
èŠãªãã®ä»¥å€ã¯ãã¹ãŠèšç®ããŸãã
ããšãã°ãTODOãªã¹ããäœæããå Žåã¯ãTODOã¢ã€ãã ã®é
åãä¿æããŠãã ããã
ã«ãŠã³ãã®ããã«å¥ã®stateã®å€æ°ãä¿æããªãã§ãã ããã
代ããã«ãTODOæ°ã衚瀺ããå Žåã¯ãåã«TODOé
ç®é
åã®lengthãåã£ãŠãã ããã
ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã®ããŒã¿å ã®äžã€äžã€ãèããŠã¿ããšã以äžãæã£ãŠããŸãã:
- 補åã®ãªã¹ã
- ãŠãŒã¶ãå ¥åããæ€çŽ¢ã¯ãŒã
- ãã§ãã¯ããã¯ã¹ã®å€
- ãã£ã«ã¿ããã補åã®ãªã¹ã
ã©ããstateãããŠãŠã¿ãããç°¡åãª3ã€ã®ãã§ãã¯ã§ããããŸã:
- ããã¯èŠªããpropsãšããŠæž¡ãããïŒ ããã ãšãããstateã§ã¯ãªã
- åŸã ã«å€åããªãïŒ ããã ãšãããstateã§ã¯ãªã
- ã³ã³ããŒãã³ãã®äžã§ä»ã®stateããpropsã«åºã¥ããŠèšç®ãã§ããïŒ ããã ãšãããstateã§ã¯ãªã
補åã®å
ã®ãªã¹ãã¯propãšããŠæž¡ãããã®ã§ãããã¯stateã§ã¯ãããŸããã
æ€çŽ¢ããã¹ããšãã§ãã¯ããã¯ã¹ã¯æéã®çµéãšãšãã«å€åããããããŸãäœãããèšç®ããããšã¯ã§ããªããããstateãšæãããŸãã
æåŸã«ããã£ã«ã¿ãªã³ã°ããã補åãªã¹ãã¯ãå
ã®è£œåãªã¹ããšæ€çŽ¢ããã¹ããšãã§ãã¯ããã¯ã¹ã®å€ãçµã¿åãããŠèšç®ã§ãããããstateã§ã¯ãããŸããã
ã€ãŸããstateã¯ä»¥äžã®ãã®ã§ã:
- ãŠãŒã¶ãå ¥åããæ€çŽ¢ã¯ãŒã
- ãã§ãã¯ããã¯ã¹ã®å€
See the Pen Thinking In React: Step 4 by Kevin Lacker (@lacker) on CodePen.
ããã§ãã¢ããªç¶æ ã®æå°éã®èšå®ãããããŸãããæ¬¡ã«ãã©ã®ã³ã³ããŒãã³ãããã®ç¶æ ãããããããŸãã¯ææããããç¹å®ããå¿ èŠããããŸãã
èŠããŠããã¹ãããš: Reactã¯ãã¹ãŠãã³ã³ããŒãã³ãéå±€ãéããŠããäžæ¹åã®ããŒã¿ãããŒã§ãã
ã©ã®ã³ã³ããŒãã³ããã©ã®ç¶æ
ãææãã¹ããã¯ããã«ã¯åãããŸããã ãããããã®ããŒããçè§£ããã®ã«äžçªå€§å€ãªéšåã£ã
çè§£ããããã«ã¯ä»¥äžã®æé ã«åŸã£ãŠãã ãã:
ã¢ããªã±ãŒã·ã§ã³ã®åstateã«ã€ããŠïŒ
- stateã«åºã¥ããŠãªã«ãããã衚瀺ããã³ã³ããŒãã³ãããã¹ãŠç¢ºèªãã
- å ±éã®ãªãŒããŒã³ã³ããŒãã³ã(éå±€ã®ãªãã§stateãå¿ èŠãšãããã¹ãŠã®ã³ã³ããŒãã³ãã®äžã«ãã)ãæ¢ããŠãã ãã
- å ±éã®ãªãŒããŒãŸãã¯äžäœéå±€ã®å¥ã®ã³ã³ããŒãã³ãã®ãããããstateãææããå¿ èŠããããŸã
- stateãææãã¹ãã³ã³ããŒãã³ããèŠã€ãããªãå Žåã¯ãåã«stateãä¿æããããã®æ°ããã³ã³ããŒãã³ããäœæããå ±éææè ã³ã³ããŒãã³ãã®äžã®éå±€ã®ã©ããã«è¿œå ããŸãã
ãã®æŠç¥ã§å®è¡ããŠã¿ã:
-
ProductTable
ã¯stateã«åºã¥ããŠååãªã¹ãããã£ã«ã¿ãªã³ã°ããå¿ èŠããããSearchBar
ã¯æ€çŽ¢ããã¹ããšãã§ãã¯stateã衚瀺ããå¿ èŠããããŸãã - å
±éã®ãªãŒããŒã³ã³ããŒãã³ãã¯
FilterableProductTable
ã§ã - æŠå¿µçã«ã¯ããã£ã«ã¿ããã¹ããšãã§ãã¯ãããå€ã
FilterableProductTable
ã®äžã«çåããŸã
ããæãã§ããstateã¯FilterableProductTable
ã®äžã«ãããšå€æããŸããã
æåã«ãã€ã³ã¹ã¿ã³ã¹ãããã㣠this.state = {filterTextïŒ ''ãinStockOnlyïŒfalse}
ã
FilterableProductTable
ã® constructor
ã«è¿œå ããŠãã¢ããªã±ãŒã·ã§ã³ã®åæç¶æ
ãåæ ãããŸãã
次ã«ãfilterText
ãšinStockOnly
ã ProductTable
ãš SearchBar
ã«propãšããŠæž¡ããŸãã
æåŸã«ããããã®propã䜿çšã㊠ProductTable
ã®è¡ããã£ã«ã¿ãªã³ã°ãã
SearchBar
ã®ãã©ãŒã ãã£ãŒã«ãã®å€ãèšå®ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®æ¯ãèããèŠãããšãã§ããŸã: filterText
ã"ball"
ã«ãŠã¢ããªããªãã¬ãã·ã¥ããŠãã ããã
ããŒã¿ããŒãã«ãæ£ããæŽæ°ãããŠããããšãããããŸãã
See the Pen Thinking In React: Step 5 on CodePen.
ãããŸã§ã¯ãpropã®é¢æ°ã®ãšããæ£ããã¬ã³ããªã³ã°ããã¢ããªãäœæããstateã¯éå±€ã®äžã«æµããŸããã
ä»åºŠã¯ãããŒã¿ãå¥ã®æ¹æ³ã§æµãããšããµããŒãããæéã§ã:
éå±€ã®æ·±ããã©ãŒã ã³ã³ããŒãã³ãã¯ã FilterableProductTable
ã®stateãæŽæ°ããå¿
èŠããããŸãã
Reactã¯ããã®ããŒã¿ãããŒãæç€ºçã«ããŠãããã°ã©ã ã®ä»çµã¿ãçè§£ããããããŸãããåŸæ¥ã®åæ¹åããŒã¿ãã€ã³ãã£ã³ã°ãããå°ãã¿ã€ãã³ã°ãå¿ èŠã§ãã
çŸåšã®ããŒãžã§ã³ã®äŸã§å
¥åãããããã§ãã¯ããã¯ã¹ããªã³ã«ãããšãReactãå
¥åãç¡èŠããããšãããããŸãã
ããã¯æå³çãªãã®ã§ã input
ã® value
prop㯠FilterableProductTable
ããæž¡ããã state
ãšåžžã«çãããªãããã«èšå®ããŠããŸãã
äœããããã®ãèããŠã¿ãŸãããã
ãŠãŒã¶ãŒããã©ãŒã ã倿Žãããã³ã«ããŠãŒã¶ãŒå
¥åãåæ ããããã«stateãæŽæ°ããå¿
èŠããããŸãã
ã³ã³ããŒãã³ãã¯èªåã®ç¶æ
ã ããæŽæ°ããå¿
èŠãããã®ã§ã FilterableProductTable
㯠SearchBar
ã«ã³ãŒã«ããã¯ãæž¡ããŸãã
ãã®ã³ãŒã«ããã¯ã¯stateãæŽæ°ããå¿
èŠããããšãã¯åžžã«èµ·åããŸãã
å
¥åã«å¯ŸããŠonChange
ã€ãã³ãã䜿çšããŠéç¥ããããšãã§ããŸãã
FilterableProductTable
ã«ãã£ãŠæž¡ãããã³ãŒã«ããã¯ã¯setStateïŒïŒ
ãåŒã³åºããã¢ããªã±ãŒã·ã§ã³ã¯æŽæ°ãããŸãã
ããã¯è€éã«æããŸãããã»ãã®æ°è¡ã®ã³ãŒãã§ãã
ãããŠãããŒã¿ãã¢ããªå
šäœã§ã©ã®ããã«æµããŠãããã¯å®ã«ã«æçœã§ãã
é¡ããã°ãReactã䜿ã£ãŠã³ã³ããŒãã³ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããæ¹æ³ãèããã¢ã€ãã¢ãšãªã£ãŠã»ããã§ãã
以åãããå°ãå€ãã¿ã€ãã³ã°ãããããããŸããããå®éã«æžãããã³ãŒããããã¯ããã«å€ããèªã¿èŸŒãŸããŠããããšãèŠããŠãããŠãã ããã
ãã®ã¢ãžã¥ã©ãšæç€ºçãªã³ãŒããèªãã®ã¯éåžžã«ç°¡åã§ããããªããã³ã³ããŒãã³ãã®å€§ããªã©ã€ãã©ãªãæ§ç¯ãå§ãããšã
ãã®æç¢ºããšã¢ãžã¥ãŒã«æ§ã«æè¬ããã³ãŒãã®åå©çšã«ãã£ãŠãã³ãŒãè¡ãçž®å°ãå§ããã§ããã:)