- 사실은 하나의 HTML파일을 보여주고, 내부의 요소들은 모드 자바스크립트를 활용해서 변경시킵니다.
- 페이지가 변경될 때마다 무조건 새롭게 html,css파일을 표시했어야했던 예전 방식보다 훨씬 효율적입니다.
단점
: 초기렌더링 과정에 시간이 걸립니다.- 리액트는 가상으로 html요소들을 생성하고, 현재 화면에 표시되는 html요소들과 비교를 해 달라진 부분만 다시 그리는
Virtual Dom with Diff Algorithm
을 사용합니다.장점
: 페이지의 수가 많아질 수록 그 장점이 더욱 빛나게 됩니다.
compoent
를 작성해 조합하는 방식으로 코딩을 진행합니다. 한 컴포넌트 안에 필요한 요소만 따로 html, css, js를 작성합니다.className
을 사용합니다.className
의 사용빈도수가 높지 않습니다.{/* 주석 */}
과 같이 사용합니다.rfce
로 컴포넌트의 기본 코드 구성을 만들수 있습니다.$ yarn create react-app firstapp
$ cd firstapp
$ yarn start
<First name="노영서" number={5}/>
- 숫자를 넘기고 싶은 경우 {}를 해줘야합니다.
- props drilling => 최대한 지양, 가까운 컴포넌트까지만 사용하는 것을 권장합니다.
function First({name, number}) {
return (
<div>{name} First, 숫자는 {number}</div>
)
}
const {name, number} = props
return (
<div>{name} First, 숫자는 {number}</div>
)
import React from 'react'
function Intro({name="노영서"}) {
return (
<>
<p>{name}</p>
</>
)
}
export default Intro
import React from 'react'
function Intro({name}) {
return (
<>
<p>{name}</p>
</>
)
}
Intro.defaultProps = {
name: '기본 이름'
}
export default Intro
import React from 'react'
import PropTypes from 'prop-types'
function Intro({name}) {
return (
<>
<p>{name}</p>
</>
)
}
Intro.propTypes = { //여기는 p가 소문자입니다.
name: PropTypes.string
}
export default Intro
import React from 'react'
function Intro({name}) {
let test = 0
const countUp = () => {
test = test + 1
}
return (
<>
<p>{test}</p>
<button onClick={countUp} >카운트업!</button>
</>
)
}
export default Intro
useState
가 있습니다.import React, {useState} from 'react'
function Intro() {
// const [state, setState] = useState(초기값)
const [test, setTest] = useState(0)
const countUp = () => {
setTest(test+1)
}
return (
<>
<p>{test}</p>
<button onClick={countUp} >카운트업!</button>
</>
)
}
export default Intro
$ yarn add moment moment-timezone
import Clock from './components/Clock';
function App() {
return (
<div>
<Clock />
</div>
);
}
export default App;
import React from 'react'
import moment from 'moment'
function Clock() {
return (
<div>{moment().format('YYYY-MM-DD HH:mm:ss')}</div>
)
}
export default Clock
.format('YYYY-MM-DD HH:mm:ss')
를 통해 표시되는 형식을 설정할 수 있습니다.import React, {useState} from 'react'
import moment from 'moment-timezone'
function Clock() {
const [time, setTime] = useState(moment().tz('US/Pacific').format('YYYY-MM-DD HH:mm:ss'))
return (
<div>{time}</div>
)
}
export default Clock
import React, {useState} from 'react'
import moment from 'moment-timezone'
function Clock() {
const [time, setTime] = useState(moment().tz('US/Pacific').format('YYYY-MM-DD HH:mm:ss'))
// 미국시간으로 초기화
//한국 시간으로 변경하는 함수
const toSeoul= () => {
setTime(moment().tz('Asia/Seoul').format('YYYY-MM-DD HH:mm:ss'))
}
return (
<>
<div>{time}</div>
<button onClick={toSeoul}>서울로 바꾸기</button>
</>
)
}
export default Clock
서울로 바꾼 후 다시 태평양 시간으로 바꿔주고 싶은 경우 입니다.
import React, {useState} from 'react'
import moment from 'moment-timezone'
function Clock() {
const [time, setTime] = useState(moment().tz('US/Pacific').format('YYYY-MM-DD HH:mm:ss'))
const changeTZ = (TZ) => {
setTime(moment().tz(TZ).format('YYYY-MM-DD HH:mm:ss'))
}
return (
<>
<div>{time}</div>
<button onClick={() => changeTZ('Asia/Seoul')}>서울로 바꾸기</button>
<button onClick={() => changeTZ('US/Pacific')}>미국으로 바꾸기</button>
</>
)
}
export default Clock
App.js
import Clock from './components/Clock';
function App() {
return (
<div>
<Clock timezone="Asia/Seoul"/>
<Clock timezone="Asia/Taipei"/>
</div>
);
}
export default App;
Clock.js
import React, {useState} from 'react'
import moment from 'moment-timezone'
function Clock(props) {
const {timezone} = props
const [time, setTime] = useState(moment().tz(timezone).format('YYYY-MM-DD HH:mm:ss'))
const changeTZ = (TZ) => {
setTime(moment().tz(TZ).format('YYYY-MM-DD HH:mm:ss'))
}
return (
<>
<div>{time}</div>
<button onClick={() => changeTZ('Asia/Seoul')}>서울로 바꾸기</button>
<button onClick={() => changeTZ('US/Pacific')}>미국으로 바꾸기</button>
</>
)
}
export default Clock
import React, {useState} from 'react'
import moment from 'moment-timezone'
function Clock(props) {
const {timezone, changeTZBtn} = props
const [time, setTime] = useState(moment().tz(timezone).format('YYYY-MM-DD HH:mm:ss'))
const changeTZ = (TZ) => {
setTime(moment().tz(TZ).format('YYYY-MM-DD HH:mm:ss'))
}
return (
<>
<div>{time}</div>
<button onClick={() => changeTZ(changeTZBtn)}>{changeTZBtn}바꾸기</button>
</>
)
}
export default Clock
constant폴더
data.js
export const data = [
{'id': 1, 'title': '제목1', 'content': '내용1'},
{'id': 2, 'title': '제목2', 'content': '내용2'},
{'id': 3, 'title': '제목3', 'content': '내용3'},
]
App.js
import React from 'react'
import {data} from '../components/data'
function Board() {
return (
<div>Board</div>
)
}
export default Board
Board.js
import React from 'react'
import {data} from '../constant/data'
function Board() {
return (
<>
{data.map((element) => {
return (
<>
<h1>{element.title}</h1>
<p>{element.content}</p>
</>
)
})}
</>
)
}
export default Board
export const data = [
{'id': 1, 'title': '제목1', 'content': '내용1', 'category':'영화'},
{'id': 2, 'title': '제목2', 'content': '내용2', 'category':'드라마'},
{'id': 3, 'title': '제목3', 'content': '내용3', 'category':'예능'},
]
import React, {useState} from 'react'
import {data} from '../constant/data'
function Board() {
const [articles, setArticles] = useState(data.filter(element => (element.category==='영화')))
return (
<>
{articles.map((element) => {
return (
<>
<h1>{element.title}</h1>
<p>{element.content}</p>
</>
)
})}
</>
)
}
export default Board