ç§ãã¡ã翻蚳ããŠããèšäºã®èè
ã¯ãæ®å¿µãªãããæ¢åã®Reactã¬ã€ãã®ã»ãšãã©ã¯ã䟡å€ããå®çšçãªéçºææ³ã«ååãªæ³šæãæã£ãŠããªããšèããŠããŸãã ãããã®ã¬ã€ãã¯ãReactãæäœããããã®ãæ£ããã¢ãããŒãããäœã§ããããåžžã«é¢ä¿è
ã«çè§£ããŠãããšã¯éããŸããã

ãã®ãã¥ãŒããªã¢ã«ã¯ãHTMLãJavaScriptãCSSã®ç¥èãæã€éçºè
ã察象ãšããŠããŸãããReactã®åºæ¬ãšããã®ã©ã€ãã©ãªã䜿çšããããã°ã©ããééããå¯èœæ§ã®ããæãäžè¬çãªééãã«ã€ããŠèª¬æããŸãã
Webéçºè
ãReactãéžæããçç±
ããžãã¹ã«åãæããåã«ãReactãWebã€ã³ã¿ãŒãã§ãŒã¹ãéçºããããã®ããŒã«ã®äžã§æè¯ã®éžæè¢ãšèããããçç±ã«ã€ããŠå°ã話ããŠã¿ãŸãããã å€ãã®UIãã¬ãŒã ã¯ãŒã¯ããããŸãã Reactãéžæããçç± ãã®è³ªåã«çããããã«ãæã人æ°ã®ãã2ã€ã®ã€ã³ã¿ãŒãã§ãŒã¹éçºããŒã«ã§ããReactãšAngularãæ¯èŒããŸãããã 人æ°ãé«ãŸã£ãŠããVue.jsãã¬ãŒã ã¯ãŒã¯ããã®æ¯èŒã«å«ããããšãã§ããŸãããReactãšAngularã«éå®ããããšã«æ³šæããŠãã ããã
interfacesã€ã³ã¿ãŒãã§ã€ã¹ã®èšè¿°ãžã®å®£èšçã¢ãããŒã
Reactéçºã§ã¯ãããŒãžã«è¡šç€ºããå¿
èŠã®ãããã®ãèšè¿°ããŸãïŒãããè¡ãæ¹æ³ã«ã€ããŠã¯ããã©ãŠã¶ãŒã®æç€ºãã³ã³ãã€ã«ããããšã§ã¯ãããŸããïŒã ããã¯ããšããããå®åã³ãŒãã®éã®å€§å¹
ãªåæžãæå³ããŸãã
äžæ¹ãAngularã«ã¯ãã³ã³ããŒãã³ãã®å®åã³ãŒããçæããã³ãã³ãã©ã€ã³ããŒã«ããããŸãã ããã¯ãææ°ã®ã€ã³ã¿ãŒãã§ãŒã¹éçºããŒã«ã«æåŸ
ã§ãããã®ãšã¯å°ãéãããã«èŠããŸããïŒ å®éãAngularã«ã¯ãã³ãã¬ãŒãã³ãŒããéåžžã«å€ãããããçæããããã«ç¹å¥ãªããŒã«ãäœæãããŠãããšããäºå®ã«ã€ããŠè©±ããŠããã
éçºãå§ããReactã§ã¯ã圌ãã¯ã³ãŒããæžãå§ãããšããã§ãã äœããã®æ¹æ³ã§çæããå¿
èŠã®ããå®åçãªã³ã³ããŒãã³ãã³ãŒãã¯ãããŸããã ãã¡ãããéçºã®åã«ããçšåºŠã®æºåãå¿
èŠã§ãããã³ã³ããŒãã³ãã«é¢ããŠã¯ãçŽç²ãªæ©èœãšããŠèª¬æã§ããŸãã
âæç¢ºãªæ§æ
è§åºŠã³ãŒãã¯ã
ng-model
ã
ngIf
ããã³
ngFor
ãªã©ã®
ngFor
ãŸãã ãã®ã³ãŒãã¯ããªãé¢åã§ãã äžæ¹ãReactã§ã¯ãéåžžã®HTMLãšããŠèªèãããJSXæ§æã䜿çšãããŸããã€ãŸããReact-developmentãéå§ããããã«ãæ ¹æ¬çã«æ°ããããšãåŠã¶å¿
èŠã¯ãããŸããã ããã¯æ¬¡ã®ãããªãã®ã§ãã
const Greetings = ({ firstName }) => ( <div>Hi, {firstName}</div> );
âæ£ããåŠç¿æ²ç·
åŠç¿æ²ç·ã¯ãUIãã¬ãŒã ã¯ãŒã¯ãéžæããéã«èæ
®ãã¹ãéèŠãªèŠçŽ ã§ãã ãã®ç¹ã§ãReactã§ã¯Angularãããæœè±¡åãå°ãªãããšã«æ³šæããŠãã ããã JavaScriptãç¥ã£ãŠããã°ãããããæåéã1æ¥ã§Reactã¢ããªã±ãŒã·ã§ã³ãäœæããæ¹æ³ãåŠã¶ããšãã§ããŸãã ãã¡ããããããæ£ããè¡ãæ¹æ³ãåŠã¶ã«ã¯æéãããããŸãããéåžžã«è¿
éã«ä»äºã«åããããããšãã§ããŸãã
Angularãåæããå Žåããã®ãã¬ãŒã ã¯ãŒã¯ããã¹ã¿ãŒããããšã«ããå ŽåãAngularã³ãã³ãã©ã€ã³ããŒã«ã®äœ¿ç𿹿³ãšãã£ã¬ã¯ãã£ãã®æäœã«æ
£ããã ãã§ãªããæ°ããèšèªãåŠã¶å¿
èŠããããŸãïŒAngularã¯TypeScriptã䜿çšããŸãïŒã
dataããŒã¿ãã€ã³ãã£ã³ã°ã¡ã«ããºã ã®æ©èœ
Angularã«ã¯åæ¹åã®ããŒã¿ãã€ã³ãã£ã³ã°ã·ã¹ãã ããããŸãã ããã¯ãããšãã°ãèŠçŽ ã®åœ¢ã§ã®å€æŽãã¢ããªã±ãŒã·ã§ã³ç¶æ
ã®èªåæŽæ°ã«ã€ãªãããšããäºå®ã§è¡šçŸãããŸãã ããã¯ãããã°ãè€éã«ãããã®ãã¬ãŒã ã¯ãŒã¯ã®å€§ããªæ¬ ç¹ã§ãã ãã®ã¢ãããŒãã§ã¯ãäœãåé¡ãçºçããå Žåãããã°ã©ããŒã¯ã¢ããªã±ãŒã·ã§ã³ãç¶æ
ã倿Žããåå ãæ£ç¢ºã«ç¥ãããšãã§ããŸããã
äžæ¹ãReactã¯äžæ¹åã®ããŒã¿ãã€ã³ãã£ã³ã°ã䜿çšããŸãã ããã¯ãããã°ã©ããŒãåžžã«ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã®å€åã«ã€ãªãã£ããã®ãæ£ç¢ºã«ç¥ã£ãŠãããšããäºå®ã«è¡šãããŠããããããã®ã©ã€ãã©ãªã®å€§ããªãã©ã¹ã§ãã ããŒã¿ãã€ã³ãã£ã³ã°ã«å¯Ÿãããã®ã¢ãããŒãã«ãããã¢ããªã±ãŒã·ã§ã³ã®ãããã°ã倧å¹
ã«ç°¡çŽ åãããŸãã
âæ©èœéçºã¢ãããŒã
Reactã®é·æã®1ã€ã¯ããã®ã©ã€ãã©ãªãéçºè
ã«ã¯ã©ã¹ã®äœ¿çšã匷å¶ããªããšããäºå®ã ãšæããŸãã Angularã§ã¯ããã¹ãŠã®ã³ã³ããŒãã³ããã¯ã©ã¹ãšããŠå®è£
ããå¿
èŠããããŸãã ããã¯ãå©ç¹ãäžããããšãªããé床ã®ã³ãŒãã®è€éãã«ã€ãªãããŸãã
Reactã§ã¯ããã¹ãŠã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã³ã³ããŒãã³ããçŽç²ãªé¢æ°ã®ã»ãããšããŠè¡šçŸã§ããŸãã çŽç²ãªé¢æ°ã䜿çšããŠUIã圢æããããšã¯ãæ¯ãå¹ããããããšãšæ¯èŒã§ããŸãã
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãéçºããããã®ããŒã«ãéžæãããšãã«ããã®ç¹å®ã®ã©ã€ãã©ãªã«åŸãå¯èœæ§ãéåžžã«é«ãReactã®äººæ°ã®çç±ãæ€èšããã®ã§ãå®è·µã«ç§»ããŸãããã
Reactã¢ããªã±ãŒã·ã§ã³éçºãã©ã¯ãã£ã¹
âNode.js
Node.jsã¯JavaScriptã³ãŒãã®å®è¡ããµããŒããããµãŒããŒãã©ãããã©ãŒã ã§ããããã®æ©èœã¯Reactéçºã«åœ¹ç«ã¡ãŸãã ãã®ãã©ãããã©ãŒã ããŸã ã€ã³ã¹ããŒã«ããŠããªãå Žåã¯ãããã§
ä¿®æ£ããŸãã
projectãããžã§ã¯ãã®æºå
ããã§ã¯ãFacebookã®
create-react-app
ããã±ãŒãžã䜿çšããŠãReactã¢ããªã±ãŒã·ã§ã³ã®ã³ã¢ãäœæããŸãã ããã¯ãããããéçºãéå§ã§ããäœæ¥ç°å¢ãã»ããã¢ããããããã®æãäžè¬çãªã¢ãããŒãã§ãã
create-react-app
ããã
create-react-app
ããã°ã©ããŒã¯å€ãã®å¿
èŠãªããŒã«ãèªç±ã«äœ¿çšã§ããã®ã§ãèªåã§ããããéžæããå¿
èŠããªããªããŸãã
create-react-app
ã«ã€ã³ã¹ããŒã«
create-react-app
ã«ã¯ã次ã®ã³ãã³ãã䜿çšããŸãã
npm i -g create-react-app
次ã«ãã¢ããªã±ãŒã·ã§ã³ãã³ãã¬ãŒããäœæããã«ã¯ã次ã®ã³ãã³ããå®è¡ããŸãã
create-react-app react-intro
ãã®æºåã¯å®äºã§ãã ã¢ããªã±ãŒã·ã§ã³ãèµ·åããã«ã¯ã次ã®ã³ãã³ããå®è¡ããŸãã
cd react-intro npm start
ããã§ããããžã§ã¯ããã©ã«ããŒã«ç§»åããŠéçºãµãŒããŒãèµ·åããŸããããã«ããã
httpïŒ// localhostïŒ3000 /ã®ãã©ãŠã¶ãŒã«ç§»åããŠãæ°ããReactã¢ããªã±ãŒã·ã§ã³ãéãããšãã§ããŸãã
âãããžã§ã¯ãã®æ§é
ããã§ãReactã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«é
眮ãããããçè§£ã§ããŸãã ãããè¡ãã«ã¯ãIDEã䜿çšããŠäœæãããããžã§ã¯ããéããŸãïŒ
Visual Studio Codeããå§ãããŸãïŒã
Index.htmlãã¡ã€ã«
ãããžã§ã¯ããã©ã«ããŒã§ã
public/index.html
ãããã¡ã€ã«ãéããŸãã ããã«ãããæ¬¡ã®ããšãããããŸãã
Index.htmlãã¡ã€ã«ããã§ã¯ãç¹ã«
<div id="root">
ãšããè¡ã«èå³ããããŸãã ããã¯ãReactã¢ããªã±ãŒã·ã§ã³ãé
眮ãããå Žæã§ãã ãã®èŠçŽ ã¯ãã¹ãŠã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«çœ®ãæãããããã®ä»ã¯ãã¹ãŠå€æŽãããŸããã
Index.jsãã¡ã€ã«
src/index.js
éã
src/index.js
ã Reactã¢ããªã±ãŒã·ã§ã³ããããã€ããã®ã¯ãã®ãã¡ã€ã«ã§ãã ãšããã§ãã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒãã¯
src
ãã£ã¬ã¯ããªã«é
眮ãããŸãã
Index.jsãã¡ã€ã«ããŒãžã«ãReactã¢ããªã±ãŒã·ã§ã³ããšåŒã¶ãã®ãé
眮ããã³ãŒãè¡ã¯æ¬¡ã®ãšããã§ãã
ReactDOM.render(<App />, document.getElementById('root'));
ãã®è¡ã¯ãReactã«
App
ã³ã³ããŒãã³ããååŸããŠïŒããã«èª¬æããŸãïŒã調æ»ãã
index.html
ãã¡ã€ã«ã§å®çŸ©ããã
root
div
é
眮ããå¿
èŠãããããšãäŒããŸãã
次ã«ã
<App />
ã³ã³ã¹ãã©ã¯ããæ±ããŸãã HTMLã³ãŒãã«éåžžã«äŒŒãŠããŸãããReactã䜿çšããç¹å¥ãªJavaScriptæ§æã§ããJSXã³ãŒãã®ãµã³ãã«ã§ãã ãã®æ§é ã¯å€§æåã®
A
ã§å§ãŸãã
<app />
ã§ã¯ãªã
<app />
<App />
ã§ããããšã«æ³šæããŠãã ããã ããã¯ãReactã§äœ¿çšããããšã³ãã£ãã£ã®åœåèŠåã«ãããã®ã§ãã ãã®ã¢ãããŒãã«ãããã·ã¹ãã ã¯éåžžã®HTMLã¿ã°ãšReactã³ã³ããŒãã³ããåºå¥ã§ããŸãã ã³ã³ããŒãã³ãåã倧æåã«ãªã£ãŠããªãå ŽåãReactã¯ããããããŒãžã«è¡šç€ºã§ããŸããã
äžéšã®
.js
ãã¡ã€ã«ã§JSXã䜿çšããäºå®ãããå Žåã¯ã次ã®ã³ãã³ãã䜿çšããŠReactãã€ã³ããŒãããå¿
èŠããããŸãã
import React from 'react';
App.jsãã¡ã€ã«
ããã§ãæåã®ã³ã³ããŒãã³ãã®ã³ãŒããèŠãæºåãã§ããŸããã ãããè¡ãã«ã¯ã
src/App.js
ã
App.jsãã¡ã€ã«Reactã³ã³ããŒãã³ããäœæããã«ã¯ãæåã«
React.Component
åå«ã§ããã¯ã©ã¹ãäœæããå¿
èŠããããŸãã ããã¯ã
class App extends Component
ã©ã€ã³ã解決ãããã®ã§ãã ãã¹ãŠã®Reactã³ã³ããŒãã³ãã«ã¯
render
ã¡ãœããã®å®è£
ãå«ãŸããŠããå¿
èŠããã
render
ã¡ãœããã§ã¯ããã®ååããæšæž¬ã§ããããã«ãã³ã³ããŒãã³ããã¬ã³ããªã³ã°ãããèŠèŠè¡šçŸã®èª¬æãçæãããŸãã ãã®ã¡ãœããã¯ãããŒãžãžã®åºåçšã«HTMLããŒã¯ã¢ãããè¿ãå¿
èŠããããŸãã
className
屿§ã¯ãHTMLã®
class
屿§ã«çžåœããããšã«æ³šæããŠãã ããã ã¹ã¿ã€ã«ãèšå®ããããã«CSSã¯ã©ã¹ãèŠçŽ ã«å²ãåœãŠãããã«äœ¿çšãããŸãã JavaScriptã®
class
ããŒã¯ãŒãã¯äºçŽãããŠããããã屿§åãšããŠäœ¿çšã§ããŸããã
ã³ã³ããŒãã³ãã«ã€ããŠèŠã€ããã°ããã®ããšãç¹°ãè¿ããŸãããã
- ååã¯å€§æåã§å§ãŸããŸãïŒ
App
å
ã®A
ïŒã React.Component
ã¯ã©ã¹ãæ¡åŒµããŸãã- ããŒã¯ã¢ãããè¿ã
render
ã¡ãœãããå®è£
ããå¿
èŠããããŸãã
ããã§ã¯ãReactã¢ããªã±ãŒã·ã§ã³ãéçºããéã«é¿ããã¹ãããšã«ã€ããŠè©±ããŸãããã
âæšå¥šäºé
1ïŒã³ã³ããŒãã³ãã¯ã©ã¹ãã©ãã§ã䜿çšããå¿
èŠã¯ãããŸãã
Reactã®ã³ã³ããŒãã³ãã¯ã2ã€ã®ã¢ãããŒãã䜿çšããŠäœæã§ããŸãã 1ã€ç®ã¯ã³ã³ããŒãã³ãã¯ã©ã¹ïŒã¯ã©ã¹ã³ã³ããŒãã³ãïŒã䜿çšããããšã2ã€ç®ã¯æ©èœã³ã³ããŒãã³ãïŒæ©èœã³ã³ããŒãã³ãïŒã䜿çšããããšã§ãã ãæ°ã¥ããããããŸããããäžèšã®äŸã§ã¯ã¯ã©ã¹ã䜿çšããŠããŸãã æ®å¿µãªãããã»ãšãã©ã®Reactåå¿è
åããã¥ãŒããªã¢ã«ã§ã¯ããããã®äœ¿çšãæšå¥šããŠããŸãã
ã¯ã©ã¹ã¡ã«ããºã ã䜿çšããŠã³ã³ããŒãã³ããèšè¿°ããããšã®äœãåé¡ã«ãªã£ãŠããŸããïŒ å®éããã®ãããªã³ã³ããŒãã³ãã¯ãã¹ããé£ãããé床ã«å€§ãããªãåŸåããããŸãã ãããã®ã³ã³ããŒãã³ãã¯ãäœå質ã®è²¬ä»»ã®åé¢ãããžãã¯ãšèŠèŠç衚çŸã®æ··åšãšããåé¡ã®åœ±é¿ãåããŸãïŒããã«ãããã¢ããªã±ãŒã·ã§ã³ã®ãããã°ãšãã¹ããè€éã«ãªããŸãïŒã äžè¬ã«ãã³ã³ããŒãã³ãã¯ã©ã¹ã䜿çšãããšãæ¯theçã«èšãã°ãããã°ã©ããŒã¯ãèªåã®è¶³ã§æã€ããšããäºå®ã«ã€ãªãããŸãã ãããã£ãŠãç¹ã«åå¿è
ããã°ã©ããŒã®å Žåã¯ãã³ã³ããŒãã³ãã¯ã©ã¹ããŸã£ãã䜿çšããªãããšããå§ãããŸãã
ãã®ãããã³ã³ããŒãã³ããèšè¿°ããããã«ã¯ã©ã¹ã䜿çšããããšã¯ãå§ãã§ããŸããã ã©ã®ãããªéžæè¢ããããŸããïŒ ãã®è³ªåã«å¯Ÿããçãã¯ãæ©èœã³ã³ããŒãã³ãã§ãã ã¯ã©ã¹ã䜿çšããŠäœæãããã³ã³ããŒãã³ãã«
render
ã¡ãœããããå«ãŸããŠããªãå Žåãæ©èœã³ã³ããŒãã³ãã«åŠçããããã®åªããåè£ã§ãã ãã®ã¢ã€ãã¢ãæŠåšã«ã
create-react-app
ããŒã«ã«ãã£ãŠäœæããã
App
ã³ã³ããŒãã³ããæ¹åããæ¹æ³ã«ã€ããŠèããŠã¿ãŸãããã
function App() { return ( <div className="App"> ... </div> ); } export default App;
ããã§äœããããããããŸãã ã€ãŸããã¯ã©ã¹ãåé€ãã
render
ã¡ãœããããã©ãŒã
function App() {...}
æ§ç¯ã«çœ®ãæããŸããã ããã§ES6ç¢å°é¢æ°æ§æã䜿çšãããšãã³ãŒãã¯ããã«è¯ããªããŸãã
const App = () => ( <div className="App"> ... </div> ); export default App;
ã¯ã©ã¹ããããŒãžã«è¡šç€ºããå¿
èŠãããããŒã¯ã¢ãããè¿ã颿°ã«å€ããŸããã
ãããèæ
®ããŠãã ããã ããŒã¯ã¢ãããè¿ã颿°ã«ã¯ãå®åã³ãŒãã¯ãããŸããã ããã¯ã»ãšãã©çŽç²ãªããŒã¯ã¢ããã§ãã ããã¯å®ç§ã§ã¯ãããŸãããïŒ
æ©èœã³ã³ããŒãã³ãã®ã³ãŒãã¯èªã¿ããããããããæäœããã®ã§ãæšæºèšèšã«å¯Ÿããæ³šææ£æŒ«ãã¯ããã«å°ãªããªããŸãã
ããã§ã¯ãæ©èœã¯ã©ã¹ã¯ã³ã³ããŒãã³ãã¯ã©ã¹ãããæãŸãããšè¿°ã¹ããããã®èšäºã§ã¯äž»ã«ã¯ã©ã¹ã䜿çšããããšã«æ³šæããŠãã ãããã³ã³ããŒãã³ãã¯ã©ã¹ã®ã³ãŒãã¯åå¿è
ã«ãšã£ãŠããæç¢ºã§ããããã Reactã®éèŠãªæŠå¿µã説æããã®ã¯ç°¡åã§ãã ããããReactã¢ããªã±ãŒã·ã§ã³ã®éçºã«æ
£ããŠããããå®éã®ãããžã§ã¯ããéçºããéã«äžèšã®ããšãèæ
®ããããšã匷ããå§ãããŸãã æ©èœã³ã³ããŒãã³ããããããçè§£ããããã«ã
ãã®è³æãã芧ãã ããã
propertiesããããã£ã«é¢ããç¥è
ããããã£ïŒpropsïŒã¯ãReactã®äžå¿æŠå¿µã®1ã€ã§ãã ãããããã£ããšã¯äœã§ããïŒ ãããçè§£ããããã«ã颿°ã«æž¡ããããã©ã¡ãŒã¿ãŒãèŠããŠãããŠãã ããã æ¬è³ªçã«ãããããã£ã¯ã³ã³ããŒãã³ãã«æž¡ããããã©ã¡ãŒã¿ãŒã§ãã æ¬¡ã®ã³ãŒããæ€èšããŠãã ããã
const Greetings = (props) => <div>Hey you! {props.firstName} {props.lastName}!</div>; const App = () => ( <div> <Greetings firstName="John" lastName="Smith" /> </div> );
ããã§ã¯ã
Greetings
ã³ã³ããŒãã³ããäœæããããã䜿çšããŠã
App
ã³ã³ããŒãã³ããã
John Smith
ãšããååã®ç·æ§ã«æšæ¶ããŸãã ãã®ã³ãŒãã¯ãã¹ãŠã次ã®HTMLããŒã¯ã¢ããã«ãªããŸãã
<div> <div>Hey you! John Smith!</div> </div>
{props.name}
ãããªåŒã®äžæ¬åŒ§ã¯ãJavaScriptã³ãŒãã匷調ããããã«äœ¿çšãããŸãã
Greetings
ã³ã³ããŒãã³ãã¯ããã©ã¡ãŒã¿ãŒã®åœ¢åŒã§ã
firstName
ããã³
lastName
ããããã£ãŒã«æž¡ãããŸãã
props
ãªããžã§ã¯ãã®ããããã£ãåç
§ããŠããããã
props
ãŸãã
firstName
ããããã£ãš
lastName
ããããã£ã衚ã2ã€ã®å€ã§ã¯ãªããåäžã®
props
ãªããžã§ã¯ãã
props
ã«
props
ããšã«æ³šæããŠãã ããã
ES6ã®ãªããžã§ã¯ããåæ§ç¯ããæ©èœã掻çšããããšã§ãã³ãŒããç°¡çŽ åã§ããŸãã
const Greetings = ({ firstName, lastName }) => <div>Hey you! {firstName} {lastName}!</div>;
ã芧ã®ãšãããããã§ã¯
(props)
ã³ã³ã¹ãã©ã¯ã
(props)
({ firstName, lastName })
眮ãæããã
(props)
ããŸãã ãã®çœ®æã«ãããã·ã¹ãã ã«
props
ãªããžã§ã¯ãã®2ã€ã®ããããã£ã®ã¿ã«é¢å¿ãããããšãäŒããŸãã ããã«ããã
props.firstName
ãªã©ã®ãªããžã§ã¯ãããããã£ãæç€ºçã«æå®ããªããŠãã
firstName
ãš
lastName
å€ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸãã
æ©èœã³ã³ããŒãã³ãã®ä»£ããã«åãåé¡ã解決ããããã«ãã¯ã©ã¹ããŒã¹ã®ã³ã³ããŒãã³ãã䜿çšãããšãããã©ãã§ããããïŒ ãã®å Žåã
Greetings
ã³ã³ããŒãã³ãã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
class Greetings extends React.Component { render() { return ( <div>Hey you! {this.props.firstName} {this.props.lastName}!</div> ); } }
ãã®ã³ãŒããããªãã«ã©ããªæèŠãããããã®ãã¯ããããŸããããè£å©çãªã¡ã«ããºã ã§éè² è·ã«ãªã£ãŠããããã§ãã ããã§ã¯ãç¹ã«ãããããã£ã«ã¢ã¯ã»ã¹ããã«ã¯ã
this.props
ãšãã圢åŒã®æ§é ã䜿çšããå¿
èŠããããŸãã
âå¯äžã®è²¬ä»»åå
åäžè²¬ä»»ååïŒSRPïŒã¯ãåŸãã¹ãæãéèŠãªããã°ã©ãã³ã°ååã®1ã€ã§ãã 圌ã¯ãã¢ãžã¥ãŒã«ã¯1ã€ã®åé¡ã®ã¿ã解決ãã質ã®é«ãæ¹æ³ã§è§£æ±ºããå¿
èŠããããšèªã£ãŠããŸãã ãã®ååã ãã«åŸããã«ãããžã§ã¯ããéçºãããšããã®ãããªãããžã§ã¯ãã®ã³ãŒãã¯ããµããŒãã§ããªãæªå€¢ã®ãããªãã¶ã€ã³ã«å€ããå¯èœæ§ããããŸãã
åç¬è²¬ä»»ã®ååã«ã©ã®ããã«éåããããšãã§ããŸããïŒ ã»ãšãã©ã®å Žåãããã¯ãäºãã«é¢ä¿ã®ãªãã¡ã«ããºã ãåããã¡ã€ã«ã«é
眮ãããŠããå Žåã«çºçããŸãã ãã®è³æã§ã¯ããã°ãã°ãã®ååãåç
§ããŸãã
éåžžãåå¿è
ã¯å€ãã®ã³ã³ããŒãã³ãã1ã€ã®ãã¡ã€ã«ã«é
眮ããŸãã ããšãã°ã
Greetings
ãš
App
ã³ã³ããŒãã³ãã®ã³ãŒãã¯åããã¡ã€ã«ã«ãããŸãã å®éã«ã¯ãããã¯SRPã«éåãããããå®è¡ããªãã§ãã ããã
ããå°ããªã³ã³ããŒãã³ãïŒ
Greetings
ã³ã³ããŒãã³ããªã©ïŒã§ãããåå¥ã®ãã¡ã€ã«ã«é
眮ããå¿
èŠããããŸãã
Greetings
ã³ã³ããŒãã³ãã³ãŒããå¥ã®ãã¡ã€ã«ã«é
眮ããŸãã
import React from "react"; const Greetings = ({ firstName, lastName }) => ( <div> Hey you! {firstName} {lastName}! </div> ); export default Greetings;
次ã«ã
App
ã³ã³ããŒãã³ãã§ãã®ã³ã³ããŒãã³ãã䜿çšããŸãã
import Greetings from "./Greetings"; const App = () => ( ... );
ãã¡ã€ã«åã¯ã³ã³ããŒãã³ãã®ååãšäžèŽããå¿
èŠãããããšã«æ³šæããŠãã ããã ã€ãŸãã
App
ã³ã³ããŒãã³ãã®ã³ãŒãã¯
App.js
ãã¡ã€ã«ã«ã
Greetings
ã³ã³ããŒãã³ãã®ã³ãŒãã¯
Greetings
ãã¡ã€ã«ãªã©ã«é
眮ããå¿
èŠããããŸãã
applicationã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã«ç²ŸéããŠãã
ç¶æ
ã¯ãReactã®ãã1ã€ã®äžå¿çãªæŠå¿µã§ãã ããã¯ãã¢ããªã±ãŒã·ã§ã³ããŒã¿ãä¿åãããå Žæãã€ãŸã倿Žå¯èœãªå Žæã§ãã ãã©ãŒã ãã£ãŒã«ãã«å
¥åãããã®ãä¿åããå¿
èŠããããŸããïŒ äœ¿çšç¶æ
ã ãã©ãŠã¶ã²ãŒã ã§ãã¬ãŒã€ãŒãç²åŸãããã€ã³ããä¿åããå¿
èŠããããŸããïŒ ãããè¡ãã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã䜿çšããå¿
èŠããããŸãã
ãŠãŒã¶ãŒãèªåã®ååãå
¥åã§ããã·ã³ãã«ãªãã©ãŒã ãäœæããŸãããã ããã§ãã³ã³ããŒãã³ããèšè¿°ããããã«æå³çã«ã¯ã©ã¹ã䜿çšããŠããããšã«æ³šæããŠãã ãããããã«ãããåé¡ã®æŠå¿µãããç°¡åã«ç€ºãããšãã§ããŸãã
ããã§ ãã¯ã©ã¹ã䜿çšããŠäœæãããã³ã³ããŒãã³ããæ©èœã³ã³ããŒãã³ãã«å€æããæ¹æ³ã«ã€ããŠèªãããšãã§ã
ãŸã ã
import React from "react"; class SimpleForm extends React.Component { render() { return ( <div> <input type="text" name="firstName" /> <Greetings firstName="John" /> </div> ); } } const App = () => ( <div> <SimpleForm /> </div> );
ãŠãŒã¶ãŒã¯ãã©ãŒã ãã£ãŒã«ãã«äœããå
¥åã§ããŸãããããã¯è¯ãããšã§ãã ãã ãããã®ã³ãŒããæ³šææ·±ãèªãã å ŽåããŠã§ã«ã«ã ããŒãžã®åºåã§
John
ããŠãŒã¶ãŒåãšããŠåžžã«äœ¿çšãããŠããããšã«æ°ä»ããããããŸããã ããããã¹ãŠã®ãŠãŒã¶ãŒã®ååã§ã¯ãªãå Žåã¯ã©ããªããŸããïŒ ãããããªããæã
ã¯ããŸãå¿«é©ã§ã¯ãªãäœçœ®ã«èº«ã眮ãã
ãã£ãŒã«ãã«å
¥åãããå€ã䜿çšããæ¹æ³ã¯ïŒ Reactã¯DOMèŠçŽ ã«çŽæ¥äŸåããŸããã ã€ãã³ããã³ãã©ãšã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã¯ããã®åé¡ã®è§£æ±ºã«åœ¹ç«ã¡ãŸãã
class SimpleForm extends React.Component { state = { firstName: "", }; onFirstNameChange = event => this.setState({ firstName: event.target.value }); render() { return ( <div> <input type="text" name="firstName" onChange={this.onFirstNameChange} /> <Greetings firstName={this.state.firstName} /> </div> ); } }
ç¶æ
ã¯ãããããã£ã®åœ¢åŒã§
SimpleForm
ã³ã³ããŒãã³ãã®ã¯ã©ã¹ã«ä¿åãããåçŽãªJavaScriptãªããžã§ã¯ããšããŠæ³åã§ããŸãã ãã®ãªããžã§ã¯ãã«ã
firstName
ããããã£ã远å ããŸãã
ããã§ã¯ã
firstName
ãã£ãŒã«ãã«ã€ãã³ããã³ãã©ãŒãè£
åããŸããã ãŠãŒã¶ãŒããã£ãŒã«ãã«å°ãªããšã1ã€ã®æåãå
¥åãããã³ã«éå§ãããŸãã ã¯ã©ã¹ã§ã¯ã
onChange
ããããã£ã¯ã次ã®ã³ãã³ããå®è¡ããã
onChange
onFirstNameChange
åŠçãæ
åœããŸãã
this.setState(...)
ããã§ãã³ã³ããŒãã³ãã®ç¶æ
ãæŽæ°ãããŸãã ã³ã³ããŒãã³ãã®ã¹ããŒã¿ã¹ã¯çŽæ¥æŽæ°ãããŸããã ããã¯ã
setState
ã¡ãœããã䜿çšããŠã®ã¿è¡ãããŸãã
firstName
ããããã£ã«æ°ããå€ãæžã蟌ãã«ã¯ãç¶æ
ã«æžã蟌ãå¿
èŠããããã®ãå«ããªããžã§ã¯ãããã®ã¡ãœããã«æž¡ãã ãã§ãã
{ firstName: event.target.value }
ãã®å Žåã
event.target.value
ã¯ããŠãŒã¶ãŒããã©ãŒã ãã£ãŒã«ãã«å
¥åããååãã€ãŸãååã§ãã
onFirstNameChange
ãã¡ãœãããšããŠå®£èšããªãã£ãããšã«æ³šæããŠãã ããã ãã®ãããªããšã¯ãã¡ãœããã®åœ¢åŒã§ã¯ãªããç¢å°é¢æ°ãå«ãã¯ã©ã¹ããããã£ã®åœ¢åŒã§å®£èšããããšãéåžžã«éèŠã§ãã åæ§ã®é¢æ°ãã¡ãœãããšããŠå®£èšãããšãäºæ³ãããããã«ãã¯ã©ã¹ã§ã¯ãªãããã®ã¡ãœãããåŒã³åºããã©ãŒã èŠçŽ ã«ãã€ã³ããããŸãã ãã®å°ããªããšã¯ãåå¿è
ã«ãšã£ãŠãã°ãã°æ··ä¹±ãæããŸãã ããã¯ãã³ã³ããŒãã³ãã¯ã©ã¹ã§ã¯ãªããæ©èœã³ã³ããŒãã³ãã®äœ¿çšãæšå¥šããçç±ã®1ã€ã§ãã
formãã©ãŒã ã«å
¥åãããããŒã¿ã確èªãã
æ£èŠè¡šçŸã䜿çšããŠãã©ãŒã ã«å
¥åãããããŒã¿ããã§ãã¯ããç°¡åãªã·ã¹ãã ãå®è£
ããŸãã ååã¯å°ãªããšã3æåã§æ§æãããæåã®ã¿ãå«ãããšãã§ãããšæ±ºããŸãããã
onBlur
ã€ãã³ããã³ãã©ãŒãã³ã³ããŒãã³ãã«è¿œå ããŸããããã¯ããŠãŒã¶ãŒãå
¥åãã£ãŒã«ããé¢ãããšãã«åŒã³åºãããŸãã å¥ã®ããããã£ãã¢ããªã±ãŒã·ã§ã³ç¶æ
firstNameError
远å ã
firstNameError
ã ååã®å
¥åäžã«ãšã©ãŒãçºçããå Žåããã£ãŒã«ãã®äžã«ããã«é¢ããã¡ãã»ãŒãžã衚瀺ãããŸãã
ãã®ã³ãŒããåæããŸãããã
class SimpleForm extends React.Component { state = { firstName: "", firstNameError: "", }; validateName = name => { const regex = /[A-Za-z]{3,}/; return !regex.test(name) ? "The name must contain at least three letters. Numbers and special characters are not allowed." : ""; }; onFirstNameBlur = () => { const { firstName } = this.state; const firstNameError = this.validateName( firstName ); return this.setState({ firstNameError }); }; onFirstNameChange = event => this.setState({ firstName: event.target.value }); render() { const { firstNameError, firstName } = this.state; return ( <div> <div> <label> First name: <input type="text" name="firstName" onChange={this.onFirstNameChange} onBlur={this.onFirstNameBlur} /> {firstNameError && <div>{firstNameError}</div>} </label> </div> <Greetings firstName={firstName} /> </div> ); } }
ç³è«ç¶æ³
å
¥åæ€èšŒã·ã¹ãã ãéçºããããã«ããŸããæ°ããããããã£ãç¶æ
ã«è¿œå ããŸããïŒ
firstNameError
ïŒ
state = { ... firstNameError: "", };
ããŒã¿æ€èšŒæ©èœ
ããŒã¿æ€èšŒã¯ã
validateName
ç¢å°é¢æ°ã§å®è¡ãããŸãã å
¥åãããååãæ£èŠè¡šçŸã§æ€èšŒããŸãã
validateName = name => { const regex = /[A-Za-z]{3,}/; return !regex.test(name) ? "The name must contain at least three letters..." : ""; }
æ€èšŒã倱æããå Žåã颿°ãããšã©ãŒã¡ãã»ãŒãžãè¿ããŸãã ååããã¹ãã«åæ Œããå Žåãååã®ãã§ãã¯äžã«ãšã©ãŒãæ€åºãããªãã£ãããšã瀺ãç©ºã®æååãè¿ããŸãã ããã§ã¯ãç°¡æœã«ããããã«ãäžé
æŒç®åJavaScriptã䜿çšããŸãã
OnBlurã€ãã³ããã³ãã©ãŒ
ãŠãŒã¶ãŒãå
¥åãã£ãŒã«ããé¢ãããšãã«åŒã³åºããã
onBlur
ã€ãã³ã
onBlur
èŠãŠ
onBlur
ã
onFirstNameBlur = () => { const { firstName } = this.state; const firstNameError = this.validateName( firstName ); return this.setState({ firstNameError }); };
ããã§ã¯ããªããžã§ã¯ããç Žæ£ããES6ã®æ©èœãå©çšããŠãç¶æ
ãã
firstName
ããããã£ãæœåºããŸãã ãã®ã³ãŒãã®æåã®è¡ã¯ãããšåçã§ãïŒ
const firstName = this.state.firstName;
次ã«ãäžèšã®ããŒã¿æ€èšŒé¢æ°ãåŒã³åºããŠ
firstName
ãæž¡ãããã®é¢æ°ãè¿ããã®ãç¶æ
ããããã£
firstNameError
æžã蟌ã¿ãŸãã ãã§ãã¯ã«å€±æãããšããšã©ãŒã¡ãã»ãŒãžããã®ããããã£ã«éä¿¡ãããŸãã æåãããšãããã«ç©ºã®è¡ãæžã蟌ãŸããŸãã
ã¬ã³ããªã³ã°æ¹æ³
ã³ã³ããŒãã³ãã®
render()
ã¡ãœãããèããŠã¿ãŸãããïŒ
render() { const { firstNameError, firstName} = this.state; ... }
.
<input ... onBlur={this.onFirstNameBlur} />
onFirstNameBlur
onBlur
.
{firstNameError && <div>{firstNameError}</div>}
JavaScript.
div
, , ,
firstNameError
true
.
â
, , , . , :
render() { const { firstNameError, firstName } = this.state; return ( <div style={{ margin: 50, padding: 10, width: 300, border: "1px solid black", backgroundColor: "black", color: "white" }} > <div style={{marginBottom: 10}}> <label> First name: <input style={{backgroundColor: '#EFEFFF', marginLeft: 10}} type="text" name="firstName" onChange={this.onFirstNameChange} onBlur={this.onFirstNameBlur} /> {firstNameError && <div style={{color: 'red', margin: 5}}>{firstNameError}</div>} </label> </div> <Greetings firstName={firstName} /> </div> ); }
React
style
.
, , , , , . , .
â â2:
, , React-. , , â
render
, , . ãªããããæªãã®ã§ããïŒ , . , , .
ãããé¿ããæ¹æ³ã¯ïŒ , .
style
, . . ,
style.js
:
// style.js: const style = { form: { margin: 50, padding: 10, width: 300, border: "1px solid black", backgroundColor: "black", color: "white" }, inputGroup: { marginBottom: 10 }, input: { backgroundColor: "#EFEFFF", marginLeft: 10 }, error: { color: "red", margin: 5 } }; export default style;
, ,
SimpleComponent
:
import style from './style'; class SimpleForm extends React.Component { ... render() { const { firstNameError, firstName } = this.state; return ( <div style={style.form}> <div style={style.inputGroup}> <label> First name: <input style={style.input} type="text" name="firstName" onChange={this.onFirstNameChange} onBlur={this.onFirstNameBlur} /> {firstNameError && ( <div style={style.error}>{firstNameError}</div> )} </label> </div> <Greetings firstName={firstName} /> </div> ); } } export default SimpleForm;
, . .
â
, :
class SimpleForm extends React.Component { state = { ... lastName: "", lastNameError: "" }; validateName = ...; onFirstNameBlur = ...; onFirstNameChange = ...; onLastNameBlur = () => { const { lastName } = this.state; const lastNameError = this.validateName(lastName); return this.setState({ lastNameError }); }; onLastNameChange = event => this.setState({ lastName: event.target.value }); render() { const { firstNameError, firstName, lastName, lastNameError } = this.state; return ( <div style={style.form}> <div style={style.inputGroup}> <label> First name: <input style={style.input} type="text" name="firstName" onChange={this.onFirstNameChange} onBlur={this.onFirstNameBlur} /> {firstNameError && <div style={style.error}>{firstNameError}</div>} </label> </div> <div style={style.inputGroup}> <label> Last name: <input style={style.input} type="text" name="lastName" onChange={this.onLastNameChange} onBlur={this.onLastNameBlur} /> {lastNameError && <div style={style.error}>{lastNameError}</div>} </label> </div> <Greetings firstName={firstName} lastName={lastName} /> </div> ); } } export default SimpleForm;
â ,
firstName
.
«»? â , .
â â3:
, , , , , . , ,
render
. .
, , , .
TextField
, .
import React from 'react' import style from "./style"; const TextField = ({name, onChange, onBlur, error, label}) => ( <div style={style.inputGroup}> <label> {label} <input style={style.input} type="text" name={name} onChange={onChange} onBlur={onBlur} /> {error && <div style={style.error}>{error}</div>} </label> </div> ); export default TextField;
, ,
render
. , , .
SimpleForm
:
... import TextField from './TextField'; class SimpleForm extends React.Component { ... render() { const { firstNameError, firstName, lastName, lastNameError } = this.state; return ( <div style={style.form}> <TextField name="firstName" label="First name:" onChange={this.onFirstNameChange} onBlur={this.onFirstNameBlur} error={firstNameError} /> <TextField name="lastName" label="Last name:" onChange={this.onLastNameChange} onBlur={this.onLastNameBlur} error={lastNameError} /> <Greetings firstName={firstName} lastName={lastName} /> </div> ); } }
, . ,
TextField
.
FirstNameField
:
import React from 'react'; import TextField from './TextField'; const FirstNameField = ({...rest}) => ( <TextField name="firstName" label="First name:" {...rest} /> ); export default FirstNameField;
, .
({...rest})
( rest, ). , , ,
rest
. , ,
TextField
, « », spread (,
{...rest}
, ).
rest
, ,
TextField
.
, : ,
FirstNameField
TextField
.
LastNameField
:
:
... import FirstNameField from './FirstNameField'; import LastNameField from './LastNameField'; class SimpleForm extends React.Component { ... render() { const { firstNameError, firstName, lastName, lastNameError } = this.state; return ( <div style={style.form}> <FirstNameField onChange={this.onFirstNameChange} onBlur={this.onFirstNameBlur} error={firstNameError} /> <LastNameField onChange={this.onLastNameChange} onBlur={this.onLastNameBlur} error={lastNameError} /> <Greetings firstName={firstName} lastName={lastName} /> </div> ); } }
.
â
, , , :
- , , , .
- . , , , , 1000 ( ).
- , . , , .
- , , , . . , , . , , , .
- , , , , .
this
, .
, React- . , , , , . , , , React, , , , UI-.
â , ,
! , , React-, .
