ããã«ã¡ã¯ãHabrïŒ
Samer Bunaã®èšäºãReact.jsã®ããããåé¡ãã®ç¿»èš³ã玹ä»ããŸãã
ãããã¯ã«ãªããªãã§ãã ããã ããªãã¯æ£ããã§ããç¡æ°ã®Webãã¯ãããžãŒãã¢ãŒããã¯ãã£ããã¬ãŒã ã¯ãŒã¯ããããçŸåšå€ããéçºãããŠããŸãã èŠããŠãããŠãã ããïŒããã®ãŠã§ãéçºè
ã«ãªã£ã人ã¯ã¿ãªããªãã®ããã«å§ããŸããã 圌ãã¯èªåãã¡ã®ã¹ãã«ãšåäœã¡ã«ããºã ãæŽ»æ°ä»ãããŸã§ãèšèªã峿žé€šã次ã
ãšå匷ããŸãã
Webéçºã¯çŸåšãã¹ãŒããŒããŒã±ãããžã®æåã®æ
è¡ã§ãã æ£ã«ã¯äœçŸãã®ååããããŸãã æ··ä¹±ããŠãèšå€§ãªéžæãæããããšã¯éåžžã«ç°¡åã§ãã ã©ãã§ãæèœã§ããå¿
èŠããããã®ããã«ãäžåºŠã«ãã¹ãŠãç ç©¶ããããšããã®ã¯ééãã§ãã
å®éãããšãã°ãã©ã€ãã©ãªã®ãªãæãåçŽãªHTML / CSS / JavaScriptã䜿çšããŠWebãµã€ããäœæããReactã®ãããªãã¬ãŒã ã¯ãŒã¯ã远å ãããªã©ã1ã€ã®ããšã«éäžãããšãåå¿è
ããå°éå®¶ãžã®éãã¯ããã«äŸ¿å©ã§å¿«é©ã«ãªããŸãã
å®éãçµéšè±å¯ãªéçºè
ãæ³šæãæã£ãŠããªãåçŽãªããšãåå¿è
ãæ±ãã®ã¯é£ããå ŽåããããŸãã ãã®èšäºã¯ãã»ãšãã©ã®ReactåŠç¿è
ãééããäžè¬çãªééããå°é£ã«å¯ŸåŠããããšãç®çãšããŠããŸãã
1-å°æåã®ã³ã³ããŒãã³ãå
Reactã³ã³ããŒãã³ãã«ã¯å€§æåã®ååãå¿
èŠã§ãã ããã§ãªãå Žåãã³ã³ããŒãã³ãã¯çµã¿èŸŒã¿ã®
divãŸãã¯
spanãšããŠåŠçãã
ãŸã ã
äŸïŒ
class greeting extends React.Component {
ãã¬ãŒã ã¯ãŒã¯ãæž¡ãïŒã¬ã³ããªã³ã°ïŒ<greeting />-Reactã¯ãšã©ãŒãã¹ããŒããŸãïŒ
Warning: The tag <greeting> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter.
ã倧æåããå§ããŠãã ãããé£ããã§ããïŒã
*ãŸãã
ãã¿ã³ã³ã³ããŒãã³ãã
img ãããã³ãã®ä»ã®ã¿ã°ãåŒã³åºããªãã§ãã ããã Reactã¯åã«ããããç¡èŠãã裞ã®HTMLã¿ã°ãšããŠã¬ã³ããªã³ã°ããŸãã

2-ã¢ãã¹ãããã£ãããã¯ã¹ã©ã€ããã代ããã«åäžåŒçšç¬Šã䜿çšãã
æååã¯
éã¢ãã¹ããã㣠ïŒ
`...` ïŒïŒå
ã®ãããã¯ãã£ãã¯ãïŒã§äœæãããéåžžã®åäžåŒçšç¬ŠïŒ
'...' ïŒãšã¯ç°ãªããŸãã
ã»ãšãã©ã®ããŒããŒãã§ã¯ãã¿ãã®äžã«ããããŒãæŒãããšã§éã¢ãã¹ãããã£ãèšå®ã§ããŸãã
æ¹è¡ãåŸç¶ã®é£çµã䜿çšããã«åçåŒãæååã«æ¿å
¥ããå¿
èŠãããå Žåã«äœ¿çšããŸãã
` ` ' '
ç¶æ³ãæ³åããŠã¿ãŸãããããæéïŒ...ãã®æéã«é¢ããã¡ãã»ãŒãžã衚瀺ããå¿
èŠããããŸã
// const time = new Date().toLocaleTimeString(); // , // 'Time is ' + time // , // ${} `Time is ${time}`
ãŸããéã¢ãã¹ãããã£ã®å
åŽã§æ¹è¡ãè¡ãããšãã§ããŸãã
const template = ` `;
éåžžã®åäžåŒçšç¬Šã§ã¯ããããè¡ããŸããã
3-React.PropTypesã®äœ¿çš
PropTypesãªããžã§ã¯ãã¯Reactããåé€ãããŸããã åã«ååšããªãã®ã§ãããã«æ
£ããå¿
èŠããããŸãã ãããä»ïŒ
- æ°ããprop-typesã¢ãžã¥ãŒã«ã远å ããŸãïŒ npm install prop-types
- ç®çã®ãã¡ã€ã«ã«ã€ã³ããŒãããŸãã ãprop-typesãããPropTypesãã€ã³ããŒãããŸã
ä»ã§ã¯åäœããŸãã äŸïŒ
PropTypes.string ã
ã³ãŒãã«ãŸã
React.PropTypesã®è¡ãããå Žåããšã©ãŒãçºçããŸã
é ã®äžã«ïŒ
TypeError: Cannot read property 'string' of undefined
4-ãã¥ãŒããªã¢ã«ã§èª¬æãããŠããããŒãžã§ã³ã䜿çšãã
ããã°ã©ãã³ã°ã¬ãã¹ã³ã衚瀺ãããèªãã ããããããäŸãåç
§ãããšãã¯ãã¬ãã¹ã³ã«é©ããããŒãžã§ã³ã䜿çšããŠããããšã確èªããŠãã ããã éåžžãã¢ãžã¥ãŒã«ã®ææ°ããŒãžã§ã³ã䜿çšããŠãå®å
šã§ããããã¥ãŒããªã¢ã«ã¯å€ããªã£ãŠããŸãã ãã®çµæãééããªããšã©ãŒãçºçããŸãã éã«ããã¥ãŒããªã¢ã«ã§
React 16ã䜿çšããŠããå Žåã15çªç®ã®ããŒãžã§ã³ã眮ãæããã®ã
æ ããªãã§ãã ããã
ããã¯Node.jsã«ãšã£ãŠç¹ã«éèŠã§ãã ãã¹ãŠã®ã³ãŒããŒã«å€ãããŒãžã§ã³ã®ãšã©ãŒããããŸãã ããšãã°ã
ããŒã7.xã§ã¯
Object.valuesãåé€ããããããããŒã6.xã§ã³ãŒããä¿®æ£ãããããç°¡åã«ã¢ããã°ã¬ãŒãã§ããŸãã
5-颿°ãšã¯ã©ã¹ã®æ··ä¹±
ãã®ã³ãŒãã®ã©ãã«ãšã©ãŒãããã®ãââããããŸããïŒ
class Numbers extends React.Component { const arrayOfNumbers = _.range(1, 10);
JavaScriptã¯ã©ã¹ã®æ¬äœå
ã«ã¯ã
å®è³ªçã«äœã«ãæš©å©ããªããããã³ãŒãã¯æ£ãããããŸããã ã¡ãœãããšããããã£ã¯ãéãããæ§æãä»ããŠã®ã¿å®£èšã§ããŸãã
ã¯ã©ã¹æ§æå
ã®{}äžæ¬åŒ§ã¯èŠæ
£ãããããã¯æ§é ã®ããã«èŠããŸãããããã§ã¯ãªãã®ã§ãããã¯æ¬åœã«çŽããããã§ãã
ã¢ã¯ã·ã§ã³ã®èªç±ãå¿
èŠãªå Žåã¯ãæ©èœã«åºã¥ããã³ã³ããŒãã³ãã䜿çšããŸãã
const Number = (props) => { const arrayOfNumbers = _.range(1, 10);
6-æååãšããŠã®æ°å
æååã䜿çšããŠããããã£ãæž¡ãããšãã§ããŸãïŒ
<Greeting name="World" />
çªå·ãæž¡ãå¿
èŠãããå Žåã¯ãåŒçšç¬Šã§ããããæžã蟌ãŸãªãã§ãã ããã
// ! <Greeting counter="7" />
代ããã«ãããããäžæ¬åŒ§ã«æ¿å
¥ããŸãã
<Greeting counter={7} />
Greetingã³ã³ããŒãã³ãå
ã§{7}ã䜿çš
ãããšã
this.props.counterã䜿çšããŠçªå·ãååŸã§ããŸããããã䜿çšããŠæ°åŠæŒç®ãå®è¡ããããšã¯çµ¶å¯Ÿã«å®å
šã§ãã ã7ãã誀ã£ãŠäœ¿çšãããšãäºæž¬ã§ããªãçµæãæãå¯èœæ§ããããŸãã
7-1ã€ã®ããŒãã§2ã€ã®ã¢ããªã±ãŒã·ã§ã³
WebãµãŒããŒãèµ·åããã«ã¯ã
ãã¹ã ïŒ127.0.0.1ãªã©ïŒãš
ããŒã ïŒ8080ãªã©ïŒãå¿
èŠã§ããµãŒããŒãæ£ããhttpã¢ãã¬ã¹ã§èŠæ±ããªãã¹ã³ããããã«åŒ·å¶ããŸãã
ãµãŒããŒãèµ·åãããšããã«ãããŒããå®å
šã«å¶åŸ¡ã§ããŸãã åãããŒãã§ã¢ã€ãã³ããªã³ã«ããããšã¯ã§ããªããªããŸãã 圌ã¯å¿ãããªããŸãïŒéã§ã¯ãªã枯ã§ãïŒïŒã
å¥ã®ç«¯æ«ããåããµãŒããŒãèµ·åããŠã¿ãŠãã ããã ã»ãšãã©ã®å Žåããäœ¿çšæžã¿ããšã©ãŒã衚瀺ãããŸãã
Error: listen EADDRINUSE 127.0.0.1:8080
ããŒãã
ããã¯ã°ã©ãŠã³ãã§äœ¿çšãããŠããããšã倿ããå Žåããã
ãŸã ã ããªãã¯åœŒãèŠãŸãããã圌ã¯äººçã劚ããŸãã ãã®ãããªç¶æ³ã§ã¯ã貎éãªããŒããå æããŠããããŒãããæ®ºããããšã¯æçã§ãã
lsof -i :8080
8-ç°å¢å€æ°
äžéšã®ãããžã§ã¯ãã¯ã
ç°å¢å€æ°ã®ååšã«äŸåããŠã
ãŸã ïŒãç°å¢å€æ°ãïŒã å¿
èŠãªå€æ°ãªãã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããšã
æªå®çŸ©ã®å€ïŒ
undefined ïŒã®äœ¿çšãéå§ããããšããŸãããã¡ãããããã¯é倧ãªãšã©ãŒã«ã€ãªãããŸãã
ããšãã°ããããžã§ã¯ãã
MongoDBããŒã¿ããŒã¹ã«æ¥ç¶ãããŠããå Žåã
process.env.Mongo_URIãªã©ã®ç°å¢å€æ°ã¯ãããŒã¿ããŒã¹ã«å®å
šã«æ¥ç¶ããã®ã«
圹ç«ã¡ãŸãã ãŸããç¶æ³ã«å¿ããŠãã°ãã倿Žããããšãã§ããŸãïŒå¥ã®ããŒã¿ããŒã¹ã«æ¥ç¶ããå¿
èŠã¯ãããŸããïŒã
MongoDBã§ãããžã§ã¯ããããŒã«ã«ã§å®è¡ããã«ã¯ãæåã«
MONGO_URI倿°ããšã¯ã¹ããŒãããå¿
èŠããããŸãã å¿
é ãããšãã°ããŒã¿ããŒã¹ãããŒã27017ã§æ©èœããå Žåãã¢ããªã±ãŒã·ã§ã³ãèµ·åããåã«ãããå®è¡ããŸãã
export MONGO_URI = "mongodb://localhost:27017/mydb"
9-ã«ãŒãªãŒ{}ãŸãã¯æ¬åŒ§ïŒïŒ
代ããã«
return { something(); };
æžããŸã
return ( something()
æåã®äŸã§ã¯ãªããžã§ã¯ããè¿ãããšããŸããïŒå€±æããŸãïŒã2çªç®ã®äŸã§ã¯
somethingïŒïŒé¢æ°ãåŒã³åºããŠã颿°ãè¿ãã¹ããã®ãè¿ãããšãã§ããŸãã
JSXæ§æã®
<tag>ã¯é¢æ°ãåŒã³åºãããããã®åé¡ã¯ãã¹ãŠã®JSXã³ãŒãã«é©çšãããŸãã
ç¢å°é¢æ°ã«ã䜿çšã§ã
ãŸã ïŒãç¢å°é¢æ°ãïŒã 代ããã«
const Greeting = () => { <div> Hello World </div> };
æžããŸã
const Greeting = () => ( <div> Hello World </div> );
*èŠããŠãããŠãã ããïŒES6ã§ã¯ç¢å°é¢æ°ã®äžæ¬åŒ§ã¯äžèŠã§ãïŒ*
10-ãªããžã§ã¯ããæ¬åŒ§ã§å²ãŸãªãã§ãã ãã
åã®æ®µèœã®ãããã¯ãçµäºããŸãã éåžžã®ãªããžã§ã¯ããè¿ãããã«ç¢å°é¢æ°ãåç
§ããããšã§æ··ä¹±ãããããªããŸãã
代ããã«
const myAction = () => { type: 'DO_IT' };
æžããŸã
const myAction = () => ({ type: 'DO_IT'});
ãªããžã§ã¯ããæ¬åŒ§ã§å²ãããšãªããçãæ§æã®ç®çãéæããããšã¯ã§ããŸããã
çµ±åããã«ã¯ãåæ§ã®æ¢è£œã®äŸãèããŠã¿ãŸãããã
this.setState(prevState => ({ answer: 12 }));
11-ã¡ãœããã§ééã£ãæåã䜿çšãã
React.Componentã§ããã
React.componentã§ã¯ãããŸã
ã ã
ComponentDidMountã§ã¯ãªã
componentDidMountã§ãã å®éã«ã¯
ReactDOMã§ãã ã
ReactDomã§ã¯ãããŸã
ã ã
ããŸããŸãªæ¹æ³ãã©ã®ããã«æžãããŠãããã«æ³šæããŠãã ããããã®ãããªééããç¯ããšãããªãã¯æ¬åœã«å€ãã®æéãè²»ããããšãã§ããããªãã¯èªåèªèº«ãæ¥ããããæãã§ãããã
ESLintã詊ããŠãã ããããã®ãããªãšã©ãŒã远跡ããã®ã«åœ¹ç«ã¡ãŸãã
å€ãã®å Žåãããããã£ã«ã¢ã¯ã»ã¹ãããšãšã©ãŒãçºçããŸãã
<Greeting userName="Max" />
ããšãã°ã
props.userNameã®ä»£ããã«
props.usernameãŸãã¯
props.UserName ãå
¥åãããšãå€
undefinedãè¿ãããŸãã
12-ç¶æ
ãªããžã§ã¯ãã®ã¢ããªã±ãŒã·ã§ã³ã®ãšã©ãŒ
ã¯ã©ã¹ã³ã³ããŒãã³ãã§ã¯ãããŒã«ã«
ç¶æ
ãªããžã§ã¯ãã宣èšããåŸã§
ãããä»ããŠå€ãååŸã§ããŸãã
class Greeting extends React.Component { state = { name: "", }; render() { return `, ${this.state.name}` } }
ããã°ã©ã ã¯
â, â
ã衚瀺ããŸãã
ç¶æ
ã®ä»£ããã«ããªããžã§ã¯ãã®ä»»æã®ååã䜿çšã§ããŸãã äŸïŒ
class Greeting extends React.Component { user = { name: "", }; render() { return `, ${this.user.name}` } }
åããã®ãå°å·ããŸãã
ãã ããéãããããŸãã
ç¶æ
ã¯ãReactã«ãã£ãŠå¶åŸ¡ãããç¹å¥ãªãªããžã§ã¯ãã§ãã
setStateãä»ããŠå€ã倿Žã§ããReact
ã¯ããã«
å¿çããŸãã ãã®ãããªããªãã¯ã¯äžèšã®ãµã³ãã«ã³ãŒãã§ã¯æ©èœããŸããããåå¿ãèŠãããªãå Žåã§ã䜿çšã§ããŸãã
13-<tag />ããã³</ tag>ã®ããªããž
ã¿ã°ãéãããšãã¯ã
ã¹ã©ãã·ã¥ /ãä»ããããšãå¿ããªãã§ãã ããã ã¯ããå Žåã«ãã£ãŠã¯
<tag />ãå¿
èŠãªããšãããã°ã
</ tag>ãå¿
èŠãªå ŽåããããŸãã
HTMLã«ã¯
èªå·±çµäºã¿ã°ããããŸã ïŒãèªå·±çµäºã¿ã°ãïŒã ãããã¯ãåäŸãã®ããªãèŠçŽ ã§ãã ããšãã°ã
imgã¯ããããæããŸãã
<img src="..." /> // <img></img>
divã¿ã°ã«ã¯å¥œããªã ãä»ã®ã¿ã°ãæ·»ä»ã§ããã®ã§ãéãããéãããããå¿
èŠããããŸãã
<div> ... </div>
åãã«ãŒã«ãReactã³ã³ããŒãã³ãã«é©çšãããŸãã
<Greeting>Hello!</Greeting>
ãã ãããåäŸããããªãå Žåã§ãããããéãããéãããã§ããŸãããŸããèªå·±çµäºã¿ã°ã䜿çšããããšãã§ããŸãã
// 2 <Greeting></Greeting> <Greeting />
誀ã£ãã¢ããªã±ãŒã·ã§ã³ã®äŸïŒ
// <Greeting><Greeting />
ãããããšã©ãŒã衚瀺ãããã¯ãã§ãïŒ
Syntax error: Unterminated JSX contents
14-ã€ã³ããŒã/ãšã¯ã¹ããŒãã¯ãæ£ããæ©èœããããšããæåŸ
ã€ã³ããŒã/ãšã¯ã¹ããŒãæ©èœã¯ã2015幎ãã
JavaScriptã«ãã£ãŠå
¬åŒã«ãµããŒããããŠã
ãŸã ã ãã ããããã¯ãã¹ãŠã®ãã©ãŠã¶ãŒãš
Nodeã®ææ°ããŒãžã§ã³ã§å®å
šã«ãµããŒããããŠããªã
ES2015ããã®å¯äžã®ãã®ã§ãã
å€ãã®å ŽåãReactãããžã§ã¯ãã¯
WebpackãšBabelã§äœæãããŸãã ãã¹ãŠã®ãã©ãŠã¶ãçè§£ã§ãããã®ã«ã³ãŒããã³ã³ãã€ã«ã§ããŸãã ãããã£ãŠã
Webpackããã³Babelã§ã€ã³ããŒã/ãšã¯ã¹ããŒãã䜿çšããããšãã
å§ãããŸãã
Nodeã«ã€ã³ããŒã/ãšã¯ã¹ããŒããçè§£ãããããã«ãããšãã°ãããã³ãïŒããã³ããšã³ãïŒã§äœ¿çšãã
SSR ïŒ
ãµãŒããŒåŽã¬ã³ããªã³ã°-ãµãŒããŒã§ã®ã¬ã³ããªã³ã°ãå圢ã¢ããªã±ãŒã·ã§ã³ ïŒã䜿çšããå Žåã«ããããå¿
èŠã«ãªãããšããã
ãŸã ã ãããè¡ãã«ã¯ãNodeèªäœã«Babelãååšããå¿
èŠããããŸãã éçºã®äŸ¿å®äžã
pm2 ã
nodemon ã
babel-watchããäœããæ¥ç¶ããããšããå§ãããŸãã
15-ãã€ã³ãã®åé¡
Reactã³ã³ããŒãã³ãã§ã¯ã©ã¹ã¡ãœããã宣èšããrenderã¡ãœããã«å«ããããšãã§ããŸãã äŸïŒ
class Greeting extends React.Component { whoIsThis() { console.dir(this);
render ãã®å
éšã§
whoIsThisã¡ãœããã
this.whoIsThisã䜿çšããŠäœ¿çšããŸããããã®å Žåã
ããã¯DOMèŠçŽ ïŒã³ã³ããŒãã³ãèªäœïŒã«ã¢ã¯ã»ã¹ããããã§ãã
Reactã¯ããã確èªããããšããŠããŸãã ãã ããJavaScriptã¯
thisã¡ãœãããš
whoIsThisã¡ãœãããèªåçã«ãã€ã³ãïŒå
ã®ããã€ã³ããïŒããããšãããŸããã
ãããäŸã§ãã¹ãããŸãã ã¡ãœããã¯renderããçŽæ¥åŒã³åºããããããwhoIsThisã®console.dirè¡ã¯Greetingãªããžã§ã¯ããåºåããŸãã

ãã ããããã«åŒã³åºãããªãå Žæãããšãã°
ã€ãã³ããã³ãã©ãŒ ïŒå
ã®ãã€ãã³ããã³ãã©ãŒãïŒã§ã¯ã©ã¹ã¡ãœããã䜿çšãããšã
console.dirã¯äºæãããã®ãåºåããŸããã

äžèšã®äŸã§ã¯ãReact
ã¯è¡ãã¯ãªãã¯ããåŸã«ã®ã¿
whoIsThisã¡ãœãããåŒã³åºããŸããããã«ãããå
éšããã³ã³ããŒãã³ãã«ã¢ã¯ã»ã¹ã§ããªããªããŸãã ãããããªãã
æªå®çŸ©ã«ãªãçç±ã§ãã
ããã¯ãã¯ã©ã¹ã¡ãœãããã
this.propsãŸãã¯
this.stateãååŸããããšãããšãã«åé¡ãçºçããããšãå€ãåºæã§ãã ããŸããããŸããã ããã解決ããæ¹æ³ã¯ãããããããŸãã ã¡ãœããã颿°ã§ã©ãããããã
.bindã䜿çšããŠãã¡ãœããã«
åŒã³åºãå
ãèšæ¶ãããããšãã§ããŸãã ãŸãã
renderã§ã¯ãªã
ãã¯ã©ã¹ã®
ã³ã³ã¹ãã©ã¯ã¿ãŒã§ ãã€ã³ãããããšãã§ã
ãŸã ã
ããã§ããæè¯ã®è§£æ±ºçã¯ã
Babelãä»ããŠã¯ã©ã¹ã«
ECMAScript ïŒããã¯
stage-3ã§ã ïŒã®æ©èœã䜿çšãããã³ãã©ãŒã«ç¢å°é¢æ°ãèšè¿°ããããšã§ãã
class Greeting extends React.Component { whoIsThis = () => { console.dir(this); } render() { return ( <div onClick={this.whoIsThis}> Hello World </div> ); } }
ããã¯æåŸ
ã©ããã«æ©èœããŸãã
以äžã§ãã èªãã§ãããŠããããšãã