๊ฐ๋ฐ ๊ณต๋ถ/๋ฐ๋ธ์ฝ์ค TIL
[ํด๋ผ์ฐ๋ฉ ์ดํ๋ฆฌ์ผ์ด์ ์์ง๋์ด๋ง TIL] 240202 - React.js ๊ธฐ์ด
๊ฐ์ค์ด
2024. 2. 2. 23:40
Intro
์ค๋์ React์ ์ฃผ์ ํน์ฑ์ธ State์ Props์ ๋ํด ํ์ตํ์๋ค.
์ค๋ ํ์ตํ ๋ด์ฉ
: React.js ๊ธฐ์ด
Why Reactโ
- ๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ณต ์ฝ๋๋ฅผ ์์ ํ ํ์๊ฐ ์๋ค.
- ์ ์ธํ ํ๋ก๊ทธ๋จ์ด๋ค.
- Virtual DOM์ ์ฌ์ฉํ๋ค.
- ์๋ฅผ ๋ค์ด, 5๋ฒ์ ๋ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ Virtual DOM์ 5๋ฒ ์ ๋ฐ์ดํธ๊ฐ ๋ฐ์ํ ๋์ ์ค์ ๋์๋ ์๋ฌด๋ฐ ๋ณํ๊ฐ ์๊ณ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ชจ๋ ์ข ๋ฃ๋๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ ๋ชจ์๋ค๊ฐ ํ๋ฒ์ ์ค์ ๋์ ์ ๋ฐ์ดํธ ํ๋ค.
โ ๏ธ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ, ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
โซ๏ธ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ: ์ ์ฐจ๋ฅผ ํ๋ํ๋ ๋ค ๋์ดํด์ผ ํ๋ค. (ex. ์์๋ฅผ ์ ํํ ๋ค์ ์์์ ์์ดํ ์ ์ด์ฉ๊ตฌ~~) โก๏ธ jQuery
โซ๏ธ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ: ๋ชฉ์ ์ ๋ฐ๋ก ๋งํ๋ค. (ex. ์์ดํ ์ ์ฆ๊ฐ/๊ฐ์ ์ํจ๋ค.) โก๏ธ React
Create React App
: ๋ณต์กํ ์ค์ ์์ด ์ฝ๊ฒ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋๋ก ๋๋ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ
๋ฆฌ์กํธ ์ฑ ์์ฑํ๊ธฐ
- npx: ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํญ์ ์ต์ ๋ฒ์ ์ผ๋ก ์คํํ ์ ์๋ค. (node.js๋ฅผ ์ค์นํ ๋ ํจ๊ป ์ค์น๋๋ค.)
npx create-react-app project-name
๋ฆฌ์กํธ ์ฑ ์คํ (package.json์ scripts ์ฐธ๊ณ )
npm start
Create React App ์ฝ๋ ๋ถ์
- public ํด๋
- fivicon.ico: ๋ธ๋ผ์ฐ์ ํญ ์ ๋ชฉ ์ ์์ด์ฝ
- logo192.png, logo512.png, manifest.json: ๋ชจ๋ฐ์ผ์์ ํํ๋ฉด์ ์ถ๊ฐ ๋ฒํผ ๋ฑ์ ๋๋ ์ ๋ ์ค์น๋๋ ์์ด์ฝ
- roboots.txt: ๊ฒ์์์ง ์์ง/์์งํ์ง ์์ ๋ฑ์ ์ค์ ํ๋ ํ์ผ
- src ํด๋
- App.test.js: ์ฝ๋ ํ ์คํธ ํ์ผ
- import/export
function App() {
...
}
export default App
import App from './App'
react๋ ESModules๋ฅผ ์ฌ์ฉํด import/export๋ก ๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ํ๋ค.
JSX (์๋ฐ์คํฌ๋ฆฝํธ XML)
: ์๋ฐ์คํฌ๋ฆฝํธ์ HTML ํ๊ทธ๋ฅผ ์์ด ์ฌ์ฉํ๋ ๋ฌธ๋ฒ
- ๋ฐ๋์ ๋ซํ ํ๊ทธ์ฌ์ผ ํ๋ค.
- <br>๋ <br /> ์ฒ๋ผ ์ ํํด๋ก์ง ํ๊ทธ๋ก ์ฌ์ฉํด์ผ ํ๋ค.
- ๋ฐ๋์ ํ๋์ ๋ถ๋ชจ๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค. (ํ๋์ ์ต์์ ํ๊ทธ๋ก ์์ ํ๊ทธ๋ค์ ๋ฌถ์ด์ค์ผ ํ๋ค.
- ์ต์์ ํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ง ์์ ๋ React.Frament๋ ๋น ํ๊ทธ๋ฅผ ์ ๋ ฅํด์ผ ํ๋ค.
import React from 'react'
function App() {
return (
<React.Fragment>
<h1></h1>
<header></header>
</React.Fragment>
)
}
function App() {
return (
<>
<h1></h1>
<header></header>
</>
)
}
- ํ๊ทธ์ class ์ง์ ํ๋ ๋ฒ
- class="ํด๋์ค๋ช "์ด ์๋ className="ํด๋์ค๋ช "์ ์ฌ์ฉํด์ผ ํจ
- ์คํ์ผ๋ง
- CSS ํ์ผ์ importํด์ ๊ฐ์ ธ์ค๊ธฐ
- inline style
import MyHeader from './MyHeader';
// import './App.css';
function App() {
const style = {
App: {
backgroundColor: 'black',
},
h2: {
color: 'red',
},
bold_text: {
color: 'green',
},
};
return (
<div className="App" style={style.App}>
<MyHeader />
<h2 style={style.h2}>์๋
, ๋ฆฌ์กํธ</h2>
<b style={style.bold_text} id="bold_text">
React.js
</b>
</div>
);
}
export default App;
State (์ํ)
- Counter.js ์์)
// state ์ฌ์ฉํ๊ธฐ ์ํด useState ์ํฌํธ ํ์
import React, { useState } from 'react';
const Counter = () => {
// 0์ผ๋ก ์ด๊ธฐํ -> useState(0)
const [count, setCount] = useState(0);
const [count2, setCount2] = useState(0);
// setCount๋ ๋๋ง๋ค Counter๊ฐ ๋ฆฌ๋ ๋๋จ
console.log('counter ํธ์ถ');
const onIncrease = () => {
setCount(count + 1);
};
const onDecrease = () => {
setCount(count - 1);
};
return (
<div>
<h2>{count}</h2>
<button onClick={onIncrease}>+</button>
<button onClick={onDecrease}>-</button>
</div>
);
};
export default Counter;
Props (Properties)
: ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๋ ๊ฐ
โ ๏ธ ๊ฐ ๋ฟ๋ง ์๋๋ผ ์ปดํฌ๋ํธ๋ ์ ๋ฌ ๊ฐ๋ฅํ๋ค.
- Container.js
const Container = ({ children }) => {
return <div style={{ margin: 20, padding: 20, border: '1px solid gray' }}>{children}</div>;
};
export default Container;
- App.js
import Container from './Container';
import Counter from './Counter';
import MyHeader from './MyHeader';
function App() {
console.log('App ํธ์ถ');
const counterProps = {
a: 1,
b: 2,
};
return (
<Container>
<div className="App">
<MyHeader />
<Counter {...counterProps} />
</div>
</Container>
);
}
export default App;
โ ์ปดํฌ๋ํธ๋ ๋ณธ์ธ์ด ๊ฐ์ง State, ๋ถ๋ชจ์๊ฒ ๋ด๋ ค์จ Props, ๋ถ๋ชจ๊ฐ ๋ ๋๋ง ๋ ๋ ๋ฆฌ๋ ๋๋ง๋๋ค.
๋ง๋ฌด๋ฆฌ
์ด๋ฒ์ฃผ ๊ฐ์๋ ๊ทธ๋๋ ์ด์ฌํ ๋ค์๋ค. ๐
ํ๋ฃจ์น ๋ฐ๋ฆฌ๊ธด ํ์ง๋ง ใ ใ ๋๋จธ์ง๋ ์ฃผ๋ง์ ๋ค์ด์ผ์ง!