- React를 왜 쓰는걸까?
- 웹 페이지는 이동시 특유의 깜빡거림이 있다.
- 모바일 앱은 이동시 부드럽고, 빠르다.(느낌을 받는다.)
- 모바일 앱 같은 웹을 만들 수 있다.
- 고품질의 웹 사이트 제작 가능, 많이 복잡한 UI를 가진 앱도 보다 깔끔하게 제작 가능하다.(UI == user interface)
- 모바일 앱도 제작 가능
- 기업입장에서는 시간절약 즉 비용절감으로 이어진다.
console.clear();
import React, { useState } from "https://cdn.skypack.dev/react@18";
import ReactDOM from "https://cdn.skypack.dev/react-dom@18";
const App = () => {
return <div>안녕</div>;
};
ReactDOM.render(<App/>, document.getElementById("root"));
console.clear();
import React, { useState } from "https://cdn.skypack.dev/react@18";
import ReactDOM from "https://cdn.skypack.dev/react-dom@18";
const Hi = () => {
return <div>Hi</div>;
}
// const Hi = () => <div>Hi</div>; 한줄이라면 이렇게도 사용가능
const Hello = () => {
return <div>Hello!</div>;
}
const App = () => {
//JSX react 문법
return (
<div>
<Hi/> {/* Hi */}
<Hello/> {/* Hello! */}
<Hello/> {/* Hello! */}
</div>
);
};
ReactDOM.render(<App />, document.getElementById("root"));
console.clear();
import React, { useState } from "https://cdn.skypack.dev/react@18";
import ReactDOM from "https://cdn.skypack.dev/react-dom@18";
const Square = () => {
return (
<div
style={{
width: "200px" /*"key" : "value"*/,
height: "200px",
backgroundColor: "pink",
display: "flex",
alignItems: "center",
justifyContent: "center",
fontWeigt: "bold",
color: "white",
marginTop: "10px"
}}
>
정사각형
</div>
);
};
const Circle = () => {
const style = {
width: "200px" /*"key" : "value"*/,
height: "200px",
backgroundColor: "skyblue",
borderRadius : "50%",
display: "flex",
alignItems: "center",
justifyContent: "center",
fontWeigt: "bold",
color: "white",
marginTop: "10px"
}
return (
<div
style={style}
>
원
</div>
);
};
const App = () => {
//JSX react 문법
return (
<div>
<Square />
<Circle />
</div>
);
};
ReactDOM.render(<App />, document.getElementById("root"));
.square {
width: 200px /*"key" : "value"*/;
height: 200px;
background-color: pink;
display: flex;
align-items: center;
justify-content: center;
fontweigt: bold;
color: white;
margin-top: 10px;
}
.circle {
width: 200px /*"key" : "value"*/;
height: 200px;
background-color: skyblue;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
fontweigt: bold;
color: white;
margin-top: 10px;
}
const Square = () => {
return (
<div
className="square"
>
정사각형
</div>
);
};
const Circle = () => {
return (
<div
className="circle"
>
원
</div>
);
};
const App = () => {
//JSX react 문법
return (
<div>
<Square />
<Circle />
</div>
);
};
const App = () => {
//JSX react 문법
return (
<section>
<div>1</div>
<div>2</div>
</section>
);
};
const App = () => {
//JSX react 문법
return (
<>
<div>1</div>
<div>2</div>
</>
);
};
let AppCallCount = 0;
const App = () => {
console.log("AppCallCount 실행 횟수 : " + AppCallCount++);
const [num, setNum] = useState(100);
console.log("num : " + num);
return (
<>
<button
onClick={() => {
setNum(num + 1);
}}
>
버튼
</button>
<div>현재 숫자 : {num}</div>
</>
);
};
const App = () => {
const [number, setNumber] = useState(0);
const [recordNumber, setRecordNumber] = useState(null);
return (
<div>
<div>숫자 : {number}</div>
{recordNumber ? <div>기록된 숫자 : {recordNumber} </div> : <div>기록 없음</div>}
<button
onClick={() => {
setNumber(number + 1);
}}
>
증가
</button>
<button
onClick={() => {
setNumber(0);
setRecordNumber(number);
}}
>
기록
</button>
</div>
);
};
const App = () => {
const [number, setNumber] = useState(0);
const [recordNumber, setRecordNumber] = useState(null);
return (
<div>
<div>숫자 : {number}</div>
{recordNumber != null ? (
<div>
기록된 숫자 : {recordNumber}
<button onClick={() => setRecordNumber(null)}>삭제</button>{" "}
</div>
) : (
<div>기록 없음</div>
)}
<button
onClick={() => {
setNumber(number + 1);
}}
>
증가
</button>
<button
onClick={() => {
setNumber(0);
setRecordNumber(number);
}}
>
기록
</button>
</div>
);
};
const arr = [1,2,3]
const arr2 = [...arr,4] o
arr.push(4); [1,2,3,4] x/*여기서 불변성이 깨짐.*/
const arr = [10,20,30];
const arr2 = [arr[0] + '번', arr[1] + '번', arr[2] + '번'];
const arr2 = arr.map((number) => return number + '번');
const App = () => {
const [num, setNum] = useState(0);
const [recordNums, setRecordNums] = useState([]);
const saveRecord = () => {
setNum(0);
setRecordNums([...recordNums, num]);
};
return (
<>
<div>숫자 : {num}</div>
<div>
{recordNums.length == 0 ? (
<span>기록 없음</span>
) : (
<span>기록 : {JSON.stringify(recordNums)} </span>
)}
</div>
<div>
<button onClick={() => setNum(num + 1)}>증가</button>
<button onClick={() => setNum(num - 1)}>감소</button>
<button onClick={saveRecord}>기록</button>
</div>
</>
);
};
<%
int a = 10;
%>
<h1> 내 나이는 <%=a%> 살 이야.</h1>
<button> 나이 증가 </button>
--------------------------------------------------
내 나이는 10살 이야.
나이 증가
예시)
자동차 A
- 바퀴
- 1번 => 교체
- 2번
- 3번
- 4번
- 프레임
백엔드에서는 1 번 바퀴만 교체할 수 없다. 교체하려면 전부 바꿔야함.
console.clear();
let age = 10;
$('.age-1').text(age);
$('.age-2').text(age);
$('.age-3').text(age);
$('button').click(function(){
age = age + 1;
$('.age-1').text(age);
$('.age-2').text(age);
$('.age-3').text(age);
console.log(age);
});
누가 더 합리적인가?
A: 기존 차를 버리고 다시 구매(구매 할 때 해당 옵션을 자신에 맞게)(기존에 하던 방식)
B: 기존 차를 수리, 부품만 교체(react 방식)
react 클라이언트 사이드 랜더링 방식
PHP
정리가 너무 깔끔하십니다.. 가독성 좋은 정리에 입 벌리다 턱 빠져서 갑니다.. (총총)