React란?
React는 웹 프레임워크로, 자바스크립트 라이브러리의 하나로서
사용자 인터페이스를 만들기 위해 사용된다.
- React는 facebook에서 제공해주는 프론트엔드 라이브러리라고 볼 수 있다.
- 싱글 페이지 애플리케이션이나 모바일 애플리케이션의 개발 시 토대로 사용될 수 있다.
즉, 현재 많이 활용되고 있는, 웹/앱의 View를 개발할 수 있도록 하는 인기있는 라이브러리라고 볼 수 있다.
React의 필요성?
react를 사용하지 않아도, html과 css, javascript를 이용해서 웹 페이지를 만들 수 있지만, react를 이용해 사용자와 상호작용할 수 있는 동적인 UI를 쉽게 만들 수 있기 때문에 많이 이용되는 것 같다.
React의 특징
React의 특징은 크게 다음과 같이 구분해보았다.
1. Data Flow
2. Component 기반 구조
3. Virtual Dom
4. Props and State
5. JSX
1. Data Flow
React는 데이터의 흐름이 한 방향으로만 흐르는 단방향 데이터 흐름을 가진다.
Augular.js와 같은 양방향 데이터 바인딩은 규모가 커질수록(대규모 애플리케이션의 경우) 데이터의 흐름을 추적하기가 힘들고 복잡해지는 경향이 있어, 복잡한 앱에서도 데이터 흐름에서 일어나는 변화를 보다 예측 가능할 수 있도록 단방향 흐름을 가지도록 했다고 한다.
2. Component 기반 구조
Component는 독립적인 단위의 소프트웨어 모듈을 말한다.
즉, 소프트웨어를 독립적인 하나의 부품으로 만드는 방법이라고 볼 수 있다.
React는 UI(View)를 여러 컴포넌트(component)를 쪼개서 만든다
한 페이지 내에서도 여러 각 부분을 독립된 컴포넌트로 만들고, 이 컴포넌트를 조립해 화면을 구성한다
컴포넌트 단위로 쪼개져 있기 때문에, 전체 코드를 파악하기가 상대적으로 쉽습니다. 이렇게 기능 단위, UI 단위로 캡슐화시켜 코드를 관리하기 때문에 재사용성이 높다. 따라서 코드는 반복해 입력할 필요 없이, 컴포넌트만 import해 사용하면 된다는 간편함이 있으며, 애플리케이션이 복잡해지더라도 코드의 유지보수, 관리가 용이해지는 장점을 가진다
Header, Footer같은 구조등을 컴포넌트로 만들고, 이를 조합해서 root component를 만드는 방식이다.
3. Virtual DOM
먼저, DOM은 Document Object Model의 약자이다.
DOM은 html, xml, CSS 등을 트리 구조로 인식하고, 데이터를 객체로 간주하고 관리한다.
React는 이 DOM Tree 구조와 같은 구조체를 Virtual DOM으로 가지고 있다.
Virtual DOM은 가상의 Document Object Model을 말한다.
이벤트가 발생할 때마다 Virtual DOM을 만들고, 다시 그릴 때마다 실제 DOM과 비교하고 전후 상태를 비교해, 변경이 필요한 최소한의 변경사항만 실제 DOM에 반영해, 앱의 효율성과 속도를 개선할 수 있다고 한다.
4. Props and State
- Props
Props란 부모 컴포넌트에서 자식 컴포넌트로 전달해 주는 데이터를 말한다.
쉽게 읽기 전용 데이터라고 생각하면 될 것 같습니다! 자식 컴포넌트에서 전달받은 props는 변경이 불가능하고 props를 전달해준 최상위 부모 컴포넌트만 props를 변경할 수 있다. - State
State는 컴포넌트 내부에서 선언하며 내부에서 값을 변경할 수 있다. state는 동적인 데이터를 다룰 때 사용하며, 사용자와의 상호작용을 통해 데이터를 동적으로 변경할 때 사용한다. 클래스형 컴포넌트에서만 사용할 수 있고, 각각의 state는 독립적이다.
5. JSX
React에서 JSX 사용이 필수는 아니지만, React에서 사용된다,
const element = <h1>Hello, world!</h1>;
위와 같은 변수 선언도 JSX문법이다.
JSX란 ?
Javascript를 확장한 문법이다.
React에서는 이벤트가 처리되는 방식, 시간에 따라 state가 변하는 방식,
화면에 표시하기 위해 데이터가 준비되는 방식 등 렌더링 로직이 본질적으로
다른 UI 로직과 연결된다는 사실을 받아들인다.
React는 별도의 파일에 마크업과 로직을 넣어 기술을 인위적으로 분리하는 대신,
둘 다 포함하는 “컴포넌트”라고 부르는 느슨하게 연결된 유닛으로 관심사를 분리한다.
이후 섹션에서 다시 컴포넌트로 돌아오겠지만, JS에 마크업을 넣는 게 익숙해지지 않는다면
이 이야기가 확신을 줄 것입니다.
React는 JSX 사용이 필수가 아니지만, 대부분의 사람은 JavaScript 코드 안에서 UI 관련 작업을 할 때
시각적으로 더 도움이 된다고 생각합니다.
또한 React가 더욱 도움이 되는 에러 및 경고 메시지를 표시할 수 있게 해줍니다.
사용 예시
[클릭 시 Good Morning → Good Evening 로 바꾸기]
import { useState } from 'react'
import './App.css'
function App() {
const [txt, setTxt] = useState("Good Morning")
const myclick = () => {
setTxt("Good Evening")
};
return (
<>
<div>{txt}</div>
<input type="button" value="CLICK" onClick={myclick}/>
</>
)
}
export default App
[클릭 시 로또 번호 생성하기]
import { useState } from 'react'
import './App.css'
function App() {
const [txt1, setTxt1] = useState("__")
const [txt2, setTxt2] = useState("__")
const [txt3, setTxt3] = useState("__")
const [txt4, setTxt4] = useState("__")
const [txt5, setTxt5] = useState("__")
const [txt6, setTxt6] = useState("__")
const myclick = () => {
let arr = [1,2,3,4,5, 6,7,8,9,10,
11,12,13,14,15, 16,17,18,19,20,
21,22,23,24,25, 26,27,28,29,30,
31,32,33,34,35, 36,37,38,39,40,
41,42,43,44,45];
for(let i=0; i<1000; i++){
let rnd = parseInt((Math.random()*45)+"");
let a = arr[0];
arr[0] = arr[rnd];
arr[rnd] = a;
}
for(let i=0; i<=5; i++){// i<45로 하면 모든 숫자를 정렬한것으로 됨
for(let j=0; j<=5; j++){
if(arr[i] < arr [j]){
let a = arr[i]
let b = arr[j]
arr[i] =b ;
arr[j] =a ;
}
}
}
setTxt1(arr[0])
setTxt2(arr[1])
setTxt3(arr[2])
setTxt4(arr[3])
setTxt5(arr[4])
setTxt6(arr[5])
};
return (
<>
<table border={1}>
<tbody>
<tr>
<td>{txt1}</td>
<td>{txt2}</td>
<td>{txt3}</td>
<td>{txt4}</td>
<td>{txt5}</td>
<td>{txt6}</td>
</tr>
<tr>
<td colSpan={6}>
<input type="button" value="CLICK" onClick={myclick}/>
</td>
</tr>
</tbody>
</table>
</>
)
}
export default App
[ 출력단 입력 후 클릭 시 구구단 출력 ]
import { useState } from 'react'
import './Gugu.css'
function App() {
const [txt, setTxt] = useState("")
const myclick = () => {
let dan= document.querySelector('#it').value;
let idan = parseInt(dan);
let txt2 = ""
for (let i = 1; i <= 9; i++) {
txt2 += idan +"*"+ i+ "="+(idan*i)+"<br>"
}
setTxt(txt2)
};
return (
<>
<table border="1">
<tbody>
<tr>
<td>출력단수</td>
<td>
<input type="text" id="it" />
</td>
</tr>
<tr>
<td colSpan={2}>
<input type="button" value="출력하기" onClick={myclick}/>
</td>
</tr>
<tr>
<td colSpan={2}>
<div id="my_div" dangerouslySetInnerHTML={{__html : txt}}></div>
</td>
</tr>
</tbody>
</table>
</>
)
}
export default App
react 서버에서 받는 html 태그 값 스타일 적용하기.
dangerouslySetInnerHTML={{__html : txt}}
로 작성해 주면 된다. / txt에는 들어갈 내용을 작성
[ 번호 입력 후 입력한 번호 나오게 하기 ]
import { useState } from 'react'
import './Phone.css'
function App() {
const [txt, setTxt] = useState("")
// input태그에 value 값을 바꾸려면 글자를 바꿔주는게 필요하다.
// 이부분을 작성하지 않으면 바뀌지 않는다.
const mychange =(e) => setTxt(e.target.value);
const myclick = (e) => {
let str_new = e.target.value;
let str_old = txt;
setTxt(str_new+str_old);
};
const mycall = () => {
alert("Calling\n"+ txt);
};
return (
<>
<table border="1">
<tbody>
<tr>
<td colSpan="3">
<input type="text" id="it"value={txt} onChange={mychange}/>
</td>
</tr>
<tr>
<td><input type="button" className="btn_num" value="1" onClick={(e)=>{myclick(e)}}/></td>
<td><input type="button" className="btn_num" value="2" onClick={(e)=>{myclick(e)}}/></td>
<td><input type="button" className="btn_num" value="3" onClick={(e)=>{myclick(e)}}/></td>
</tr>
<tr>
<td><input type="button" className="btn_num" value="4" onClick={(e)=>{myclick(e)}}/></td>
<td><input type="button" className="btn_num" value="5" onClick={(e)=>{myclick(e)}}/></td>
<td><input type="button" className="btn_num" value="6" onClick={(e)=>{myclick(e)}}/></td>
</tr>
<tr>
<td><input type="button" className="btn_num" value="7" onClick={(e)=>{myclick(e)}}/></td>
<td><input type="button" className="btn_num" value="8" onClick={(e)=>{myclick(e)}}/></td>
<td><input type="button" className="btn_num" value="9" onClick={(e)=>{myclick(e)}}/></td>
</tr>
<tr>
<td><input type="button" className="btn_num" value="0" onClick={(e)=>{myclick(e)}}/></td>
<td colSpan="2">
<input type="button" className="btn_call" value="☎" onClick={(e)=>{mycall(e)}}/>
</td>
</tr>
</tbody>
</table>
</>
)
}
export default App
input 태그에서 value값을 넣을때
그냥 value={txt}로 넣으면 나중에 값이 바뀌지 않는다 따라서
onChange={mychange}를 작성하고
const mychange =(e) => setTxt(e.target.value); 를 해줘야 회면이 바뀐다.
[ UPDown 숫자 맞추기 게임 ]
import {useState} from 'react'
import './Updown.css'
function App() {
const [txt1, setTxt1] = useState("");
const [txt2, setTxt2] = useState("");
const [com, setCom] = useState(parseInt(Math.random()*99+"")+1);
const mychange1 = (e) => setTxt1(e.target.value);
const mychange2 = (e) => setTxt2(e.target.value);
// useEffect(() => {
// myran();
// },[]);
console.log("com",com);
const myclick = () => {
let imine = parseInt(txt1);
let line = "";
if(com>imine){
line += imine + "\t" +"UP"+"\n";
}else if(com<imine){
line += imine + "\t" +"DOWN"+"\n";
}else{
line += imine + "\t" +"정답입니다."+"\n";
}
setTxt2(txt2+line);
setTxt1("")
};
// const myran = () => {
// com = parseInt(Math.random()*99+"")+1;
// console.log("com",com);
// };
return (
<>
<table border="1">
<tbody>
<tr>
<td>맞출수</td>
<td>
<input type="text" id="it" value={txt1} onChange={mychange1} />
</td>
</tr>
<tr>
<td colSpan="2">
<input type="button" value="맞춰보기" onClick={myclick}/>
</td>
</tr>
<tr>
<td colSpan="2">
<textarea id="ta" value={txt2} onChange={mychange2} />
</td>
</tr>
</tbody>
</table>
</>
)
}
export default App
'파이썬 > 수업내용' 카테고리의 다른 글
[Python] Vue - CRUD (0) | 2024.07.16 |
---|---|
[Python] Svelte - MVVM 패턴 으로 CRUD (0) | 2024.07.16 |
[python] Svelte-CRUD (0) | 2024.07.15 |
[Pytho] Svelte (1) | 2024.07.15 |
[Python] Vue.js (0) | 2024.07.15 |