#
NPMNode Package Manager : ์ฑ์คํ ์ด์์ ์ฑ์ ์ค์นํ๋ ๊ฒ์ฒ๋ผ NPM์์ ํจํค์ง๋ฅผ ์ค์นํ ์ ์์.
ํจํค์ง๋ -g (global)์ ์ค์นํ ์๋ ์๊ณ , ํด๋น ๋๋ ํ ๋ฆฌ์ ๋ถํ์ผ๋ก์จ ์ฌ์ฉํ๋๋ก์ค์นํ ์ ์๋ค.
#
๊ฒ์๊ณผ ์ค์นNPM์ ๊ฒ์ํ๊ณ ์ค์นํ ์ ์๋ ์ฌ์ดํธ
๋ง์ฝ local-web-server
๋ผ๋ ํจํค์ง๋ฅผ ์ค์นํ๊ณ ์ถ์ ๋,
npm i local-web-server
npm install local-web-server
i๋ install์ ์ฝ์
์ปดํจํฐ์ ์ ์ญ์ ์ธ, ๋ ๋ฆฝ์ ์ธ ํ๋ก๊ทธ๋จ์ผ๋ก ์ค์นํ๊ณ ์ถ์ ๋,
npm install -g local-web-server
g๋ global์ ์ฝ์
๊ถํ์ด ์๋ค๋ฉด sudo
๋ฅผ ์์ ์ถ๊ฐํ๋ค.
#
ํจํค์ง ๋ชฉ๋ก ๋ณด๊ธฐ์ ์ ๋ฐ์ดํธ, ์ญ์ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ์ค์น๋ ํจํค์ง ๋ณด๊ธฐ
npm list
์ ์ญ์ ์ค์น๋ ํจํค์ง ๋ณด๊ธฐ
npm list -g
์ ์ญ์ ์ค์น๋ ํจํค์ง ์ค ์ ์ผ ์๋จ์ ์๋ ํจํค์ง๋ง ๋ณด๊ธฐ
npm list -g --depth=0
์ ์ญ์ ์๋ ํจํค์ง ์ ๋ฐ์ดํธํ๊ธฐ
npm update -g local-web-server
์ ์ญ์ ์๋ ํจํค์ง ์ญ์ ํ๊ธฐ
npm uninstall -g local-web-server
๐ ๋ฐํด๋ฅผ ๋ค์ ๋ง๋ค์ง ๋ง๋ผ!
#
React#
React ์ฑ ๋ง๋ค๊ธฐnpm install -g create-react-app
- ์ ์ญ์ ์ค์นํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ.
npm install -g create-react-appmkdir my-appcd my-appcreate-react-app .
- npx - ์์๋ก ํจํค์ง๋ฅผ ์ค์นํด์ ์ฌ์ฉํ๊ณ ์ง์ฐ๋ ์คํ ๋๊ตฌ.
npx create-react-app my-appcd my-appnpm start
#
React ์ฑ ์คํnpm run start
#
์ฝ๋ฉํ๊ธฐpublic
๋๋ ํ ๋ฆฌ - static ์์์ด ์์นํ ๊ณณ.#
index.html
<div id="root"></div>
์ด
root
์์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ค์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
src
๋๋ ํ ๋ฆฌ - source ์ฝ๋๊ฐ ์๋ ๊ณณ.#
index.js
ReactDOM.render(<App />, document.getElementById('root'));
<App />
์ปดํฌ๋ํธ๋ฅผroot
์๋ฆฌ๋จผํธ๋ก ์ ๋ฌํ๊ฒ๋๋ค.
App.js
ํด๋์คํ (ํด๋์คํ๊ณผ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ์๋๋ฐ ์ด ๊ฐ์ข๋ ํด๋์คํ์ผ๋ก์งํ)
import React from 'react';import logo from './logo.svg';import './App.css';
class App extends React.Component { render() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <p> Edit <code>src/App.js</code> and save to reload. </p> <a className="App-link" href="https://reactjs.org" target="_blank" rel="noopener noreferrer" > Learn React </a> </header> </div> ); }}
export default App;
โ๏ธ ๋ฐ๋์ ๋ฆฌ์กํธ๋ ๋ฐํํ ๋ ํ๋์ ํ๊ทธ๋ก ๊ฐ์ธ์ ธ ์์ด์ผ ํ๋ค.
#
๋ฐฐํฌํ๊ธฐnpm run build
- ๋ฆฌ์กํธ ์ฑ์ ๋น๋ํด์คnpx serve -s build
- ๋น๋ํ ์ฑ์ผ๋ก ๋ก์ปฌ ํธ์คํ
#
JSX๐ JSX๋ JavaScript๊ฐ ์๋๋ค!
JSX๋ก ์์ฑํ ์ฝ๋๋ create-react-app์ ์ํด JavaScript ์ฝ๋๋ก ์ปจ๋ฒํ ๋๋ค.
#
Hello World!import React from 'react';import './App.css';
class App extends React.Component { render() { return <div className="App">Hello World!</div>; }}
export default App;
App
class๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ํ์ฅํ๊ณ render
๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ค. (ํ์), ํด๋์ค ๋ด๋ถ ๋ฉ์๋์์ function
ํค์๋๋ ์๋ต ๊ฐ๋ฅํ๋ค. (ES6)
Components
์ props
#
์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฌ ๊ฐ ์ฌ์ฉํ ๋ ์์ ํ ๋๊ฐ์ ์ปดํฌ๋ํธ๋ง ์ฌ์ฉํด์ผ ํ๋ค๋ฉด, ํ๊ณ๊ฐ ์์ ๊ฒ์ด๋ค. ์ปดํฌ๋ํธ๊ฐ ํน์ ์์ฑ์ ๊ฐ์ง์ ๋ฐ๋ผ ๋ณ๊ฒฝํด์ค ์ ์๋๋ก props
๋ฅผ ํ์ฉํ ์ ์๋ค.
import React from 'react';import './App.css';
class Subject extends React.Component { render() { return ( <header> <h1>{this.props.title}</h1> {this.props.sub} </header> ); }}
class App extends React.Component { render() { return ( <div className="App"> <Subject title="WEB" sub="World Wide Web!" /> <Subject title="React" sub="For UI!" /> </div> ); }}
export default App;
#
React Developer Tools#
์ปดํฌ๋ํธ ํ์ผ๋ก ๋ถ๋ฆฌํ๊ธฐApp.js
import React from 'react';import Subject from './components/Subject';import Content from './components/Content';import TOC from './components/TOC';import './App.css';
class App extends React.Component { render() { return ( <div className="App"> <Subject title="WEB" sub="World Wide Web!" /> <Subject title="React" sub="For UI!" /> <Content text="HTML is FUN!" /> <TOC /> </div> ); }}
export default App;
import React from 'react';
- ๋ฆฌ์กํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ์.
ํด๋น ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ import
์ ๋ช
์.
ํด๋น ์ปดํฌ๋ํธ๊ฐ ์ธ๋ถ์์ ์ฌ์ฉํ ์ ์๋๋ก export
์ ๋ช
์.
props
์ state
#
props
๋ ์ธ๋ถ์์, ๋ด๋ถ๋ก ์ ๋ฌ. ์ธ๋ถ์์ ์ฌ์ฉํ ์ปดํฌ๋ํธ์ ์์ฑ์ ๊ธฐ์
ํ๋ฉด ๋ด๋ถ ์ปดํฌ๋ํธ์์ props
๋ก ์ ๊ทผํ ์ ์์. ์ฌ์ฉํ๋ ์
์ฅ์์ ์กฐ์.
state
๋ ๋ด๋ถ์ ์ํ ๊ฐ.
App.js
import React from 'react';import Subject from './components/Subject';import TOC from './components/TOC';import Content from './components/Content';import './App.css';
class App extends React.Component { constructor(props) { super(props); this.state = { subject: {title: 'WEB', sub: 'World Wide Web!'}, }; } render() { return ( <div className="App"> <Subject title={this.state.subject.title} sub={this.state.subject.sub} /> <Subject title="React" sub="For UI!" /> <TOC /> <Content text="HTML is FUN!" /> </div> ); }}
export default App;
constructor
: ์ปดํฌ๋ํธ๊ฐ ์คํ๋ ๋ ๊ฐ์ฅ ๋จผ์ ์คํ๋๋ ํจ์ ( state
๊ฐ์ ์ด๊ธฐํ)
ํด๋น ๊ฐ์ฒด ์์์ { this.state.subject.title }
์ผ๋ก ์ ๊ทผํ ์ ์์.
TOC
๊ฐ์ #
TOC.js
import React from 'react';
class TOC extends React.Component { render() { var lists = []; var data = this.props.data; var i = 0;
while (i < data.length) { lists.push( <li key={data[i].id}> <a href={'/content/' + data[i].id}>{data[i].title}</a> </li>, ); i = i + 1; }
return ( <nav> <ul>{lists}</ul> </nav> ); }}
export default TOC;
TOC.js
์์ ์ธ๋ถ์์ data
(๊ฐ์ฒด๊ฐ ๋ด๊ธด ๋ฆฌ์คํธ)๋ฅผ props
๋ก ์ ๋ฌ๋ฐ๊ณ , ํด๋น๋ฆฌ์คํธ์ ์์๋ค์ ์์ฐจ์ ์ผ๋ก lists
์ ๋ด์ ์ถ๋ ฅํ๊ฒ ๋ฐ๊พผ๋ค.
์ด ๋ ์ฌ๋ฌ ๊ฐ์ ๋ชฉ๋ก์ key
๋ฅผ ๊ฐ์ ธ์ผํ๋ค. key={data[i].id}
๊ฐ ํ์.
ํค๋ฅผ ๊ธฐ์ ํ์ง ์์ ๊ฒฝ์ฐ.
App.js
import React from 'react';import Subject from './components/Subject';import TOC from './components/TOC';import Content from './components/Content';import './App.css';
class App extends React.Component { constructor(props) { super(props); this.state = { subject: {title: 'WEB', sub: 'World Wide Web!'}, contents: [ {id: 1, title: 'HTML', desc: 'HTML is for information'}, {id: 2, title: 'CSS', desc: 'CSS is for Design'}, {id: 3, title: 'JavaScript', desc: 'JavaScript is for Interactive'}, ], }; } render() { return ( <div className="App"> <Subject title={this.state.subject.title} sub={this.state.subject.sub} /> <TOC data={this.state.contents} /> <Content text="HTML is FUN!" /> </div> ); }}
export default App;
์ด๋ ๊ฒ ์ธ๋ถ์์ Contents
๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
state
, props
, render()
ํจ์#
์ด๋ฒคํธ React ์์๋ props
๋๋ state
์ ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๋ render()
ํจ์๊ฐ ํธ์ถ๋๋๋ก ์ฝ์๋์ด ์๋ค. โ ํ๋ฉด์ด ๋ค์ ๊ทธ๋ ค์ง๋ค.
#
๋์ ์ผ๋ก ๋ณ์ ์ ์ดSubject.title
์ ํด๋ฆญํ์ ๋, this.state.mode
๋ณ์๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค. ์ด ๋ Subject.title
์ <a>
ํ๊ทธ๋ก ๊ฐ์ธ์ ธ ์๋ค.
onClick
์์ฑ์ผ๋ก ํด๋ฆญํ์ ๋ ์คํํ ํจ์(์ด๋ฒคํธ ํธ๋ค๋ฌ)๋ฅผ ์ ์ํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ onClick
์ด ๋ฐ์ํ์ ๋, ํ๋ฉด์ด ์๋ก๊ณ ์นจ ๋๋ค. <a>
ํ๊ทธ์ ๊ธฐ๋ณธ ๋์ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ.
...
<h1><a href="/" onClick={function(e){ console.log(e); // debugger; e.preventDefault();}}>{this.state.subject.title}</a></h1>
...
โ๏ธ
debugger;
๋ฅผ ์ฝ์ ํ๊ณ ์คํํ๋ฉด ํด๋น ์์น์์ ๋ฉ์ถฐ์ง๊ณ ๊ฐ๋ฐ์๋๊ตฌ์์ ํด๋น์์น์ ์์ค๋ฅผ ๋ณผ ์ ์์
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ํ๊ทธ์ ๊ธฐ๋ณธ์ ์ธ ๋์๋ฐฉ๋ฒ์ ๋ชปํ๊ฒ ๋ง๋ ๊ฒ์ด event
๊ฐ์ฒด์ preventDefault()
๋ผ๋ ํจ์์ด๋ค. ์ด๋ฅผ ํตํด ์๋ก๊ณ ์นจ๋๋ ํ์์ ๋ง์ ์ ์๋ค.
state
๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋.
return ( <div className="App"> <header> <h1> <a href="/" onClick={function (e) { e.preventDefault(); this.setState({ mode: 'welcome', }); }.bind(this)} > {this.state.subject.title} </a> </h1> {this.state.subject.sub} </header> <TOC data={this.state.contents} /> <Content title={_title} desc={_desc} /> </div>);
์ด๋ฒคํธ๊ฐ ์คํ๋์ ๋ ์คํ๋๋ function ๋ด๋ถ์
this
์ ๊ฐ์ด ์๋ฌด๊ฒ๋ ์ธํ ๋์ด์์ง ์๋ค. โ this ๋ฐ์ธ๋ฉ ์ฌ์ฉํด์ผํจ. ํจ์ ์์this
๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฃ์ ๊ฐ์ผ๋ก ์ค์ ํจ. (this
=App
)state
๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ๋setState
ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํจ
#
React์์ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด state ๋ณ๊ฒฝReact์์๋ ์ปดํฌ๋ํธ์ state
๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํด๋น ์ปดํฌ๋ํธ render
ํจ์์ ํ์ ์ปดํฌ๋ํธ์ render
ํจ์๋ฅผ ์คํํด reload
ํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ํ์ ์ปดํฌ๋ํธ์๋ ๋ณ๊ฒฝ๋๋ ๊ฒ์ด ์๋ค๋ฉด ๋นํจ์จ์ ์ผ ์ ์๋ค.
์ด๋ฅผ ์ํด React.Component
์ shouldComponentUpdate
ํจ์๊ฐ ์๋ค.
shouldComponentUpdate
๋ newProps
์ newState
๋ผ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง๋ค. ์ฌ๊ธฐ์ newProps
๋ ์ปดํฌ๋ํธ์ ๋ฐ๋ props ๊ฐ์ ๋งํ๋ค.
newProps
์ ์ด์ ๊ฐ์ ๋ํ๋ด๋ this.props.data
๋ฅผ ์ด์ฉํด props
๊ฐ ๋ฐ๋์์๋๋ง ํด๋น ์ปดํฌ๋ํธ์ render
ํจ์๋ฅผ ํธ์ถํ๊ฒ ํ ์ ์๋ค. (๋์ด ๊ฐ์ผ๋ฉด false
๋ฆฌํดํ๊ณ ๋์ด ๋ค๋ฅด๋ฉด true
๋ฅผ ๋ฆฌํดํจ์ผ๋ก ๊ฐ๋ฅ)
๊ทธ๋ฐ๋ฐ ๋ง์ฝ state
์ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด์ด ์์ ๊ฒฝ์ฐ์, ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์๋ณธ์ ๋ณ๊ฒฝํ๋ ํจ์๋ฅผ ํตํด state
๋ฅผ ์
๋ฐ์ดํธํ๊ฒ ๋๋ฉด(์๋ฅผ ๋ค์ด, ๋ฐฐ์ด์ push
ํจ์๋ ์๋ณธ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ค.) ์๋ณธ์ด ์์ ๋์๊ธฐ ๋๋ฌธ์ newProps
์ this.props.data
๋ ๊ฐ์ ์๋ฐ์ ์๊ณ , ๋ฐ๋ผ์ shouldComponentUpdate
ํจ์๋ฅผ ํตํ ์กฐ์์ด ๋ถ๊ฐ๋ฅํด์ง๊ณ ์ด๋ ์ฑ๋ฅ ๊ฐ์ ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ฒ ๋๋ค.
๋ฐ๋ผ์ ๋ฐฐ์ด์์๋ push
ํจ์ ๋์ concat
, ๊ฐ์ฒด์์๋ Object.assign
ํจ์ ๋ฑ์ผ๋ก ์๋ก์ด ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ก state
๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ๊ฒ์ผ๋ก shouldComponentUpdate
ํจ์๋ฅผ ํตํ ์กฐ์์ ๊ฐ๋ฅํ๊ฒ ํ ์ ์๋ค.