NPM# NPM1 - YouTube
Node Package Manager : ์ฑ์คํ ์ด์์ ์ฑ์ ์ค์นํ๋ ๊ฒ์ฒ๋ผ NPM์์ ํจํค์ง๋ฅผ ์ค์นํ ์ ์์.
ํจํค์ง๋ -g (global)์ ์ค์นํ ์๋ ์๊ณ , ํด๋น ๋๋ ํ ๋ฆฌ์ ๋ถํ์ผ๋ก์จ ์ฌ์ฉํ๋๋ก์ค์นํ ์ ์๋ค.
๊ฒ์๊ณผ ์ค์น# npm
NPM์ ๊ฒ์ํ๊ณ ์ค์นํ ์ ์๋ ์ฌ์ดํธ
๋ง์ฝ 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 - YouTube
React ์ฑ ๋ง๋ค๊ธฐ# npm install -g create-react-app
- ์ ์ญ์ ์ค์นํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ.npm install -g create-react-app mkdir my-app cd my-app create-react-app .
๋ณต์ฌ npx - ์์๋ก ํจํค์ง๋ฅผ ์ค์นํด์ ์ฌ์ฉํ๊ณ ์ง์ฐ๋ ์คํ ๋๊ตฌ. npx create-react-app my-app cd my-app npm start
๋ณต์ฌ React ์ฑ ์คํ# npm run start
์ฝ๋ฉํ๊ธฐ# public
๋๋ ํ ๋ฆฌ - static ์์์ด ์์นํ ๊ณณ.# < div id = " root " > </ div >
๋ณต์ฌ ์ด root
์์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ค์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
src
๋๋ ํ ๋ฆฌ - source ์ฝ๋๊ฐ ์๋ ๊ณณ.# 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 ;
๋ณต์ฌ โ๏ธ ๋ฐ๋์ ๋ฆฌ์กํธ๋ ๋ฐํํ ๋ ํ๋์ ํ๊ทธ๋ก ๊ฐ์ธ์ ธ ์์ด์ผ ํ๋ค.
๋ฐฐํฌํ๊ธฐ# 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# 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 ) ; 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
ํจ์๋ฅผ ํตํ ์กฐ์์ ๊ฐ๋ฅํ๊ฒ ํ ์ ์๋ค.