React란 사용자 인터페이스를 만드는 JavaScript 라이브러리이다.
npx create-react-app appName
React는 선언적 접근 방식을 따른다.
// 명령적
let imperative = 'How'
// 선언적
let declarative = 'What'
👉 실생활에서의 예: 식당에 가서 테이블에 앉을 경우
이처럼 명령적 접근 방식은 어떻게 테이블에 앉는지가 중점이고 선언적 접근 방식은 2인용 테이블에 중점을 두고 있다.
let arr = [1,2,3,4,5]
function doubble(arr){
let res = []
for(let i=0; i<arr.length; i++){
res.push(arr[i] * 2)
}
return res
}
function add(arr){
let res = 0
for(let i=0; i<arr.length; i++){
res += arr[i]
}
return res
}
const btn = document.getElementById('btn')
btn.addEventListener('click',()=>{
btn.classList.toggle('highlight')
btn.innerText === 'Add Highlight'
? btn.innerText = 'Remove Highlight'
: btn.innerText = 'Add Highlight'
})
let arr = [1,2,3,4,5]
function doubble(arr){
return arr.map((item)=>item*2)
}
function add(arr){
return arr.reduce((total,number)=>number + total, 0)
}
<Btn />
선언적 코드의 또 다른 장점은
프로그램이 컨텍스트에 독립적일 수 있다는 것이다.
즉, 코드는 단계보다 궁극적인 목표에 관심이 있기 때문에 동일 코드가 다른 프로그램에서도 제대로 작동할 수 있게 된다.
명령형 코드는 현재 상태의 컨텍스트에 의존하는 경우가 많기 때문에 프로그램이 컨텍스트에 독립적이기 어렵다.
JSX는 JavaScript를 확장한 문법이다.
React는 JSX 사용이 필수가 아니지만, 대부분의 사람들은 JSX를 사용한다.
function App(){
return (
<div>Hello</div>
)
}
// true
function App(){
return(
<>
<div>Hi</div>
<div>HIHIHI</div>
</>
)
}
// false
function App(){
return(
<div>Hi</div>
<div>HIHIHI</div>
)
}
function App(){
const month = new Date().getMonth()
return (<div>{month}</div>)
}
만약 JSX없이 React를 사용한다면 엄청..불편하다.
React.createElement(component, props, ...children)는 항상 하나의 root 엘리먼트를 만든 다음에 사용한다.(JSX에서 래핑 태그가 필요한 이유)
//false
function App(){
return (
React.createElement('div',{},'HI')
React.createElement('h2', {}, "HELLO")
)
}
//true
function App(){
return(
React.createElement(
"div",
{},
React.createElement("div", {}, "HI"),
React.createElement("h2", {}, "Heooooo")
)
)
}
props를 통해 컴포넌트간 데이터 이동이 가능하다
const expenses = [
{
id: "e1",
title: "Toilet Paper",
amount: 94.12,
date: new Date(2020, 7, 14),
}
]
// 컴포넌트 A
function App(){
return (
<Expenses item={expenses}/>
)
}
// 컴포넌트 B
function Expenses({title,amount,date})
return(
<div>{title}<div>
)
props.children는 래핑한 태그의 콘텐츠를 의미한다
아래의 예제에서는 Card로 래핑한 태그 안의 콘텐츠 모두를 의미한다.
function Card(props){
const classes = 'card ' + props.className
function Card(props) {
return <div className={classes}>{props.children}</div>;
}
<Card className="name">
<h2>Name<h2>
</Card>
}