๋จผ์ ํ์ด์ค๋ถ์ ์๋จ ๋ถ๋ถ์ ๋ณด์
์กฐ๊ทธ๋ง ํ์ค ๋ถ๋ถ์ด์ง๋ง , ์ค์ ์ฝ๋๋ฅผ ๋ดค์๋
์ค์ ์ฝ๋ ๋ถ๋ถ์ ์๋น๋์ ์ฐจ์งํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ๋ถ๋ถ์ ์์ ์ด ์ด๋ฃจ์ด์ง๋ค๋ฉด ํ์ด์ง๋ง๋ค ์ ๋ถ๋ถ์ ๋ฐ๊พธ์ด ์ฃผ์ด์ผ ํ๋?
๋ํ ํ์ด์ง ์์ค๋ฅผ ๋ณด๊ณ ์ด๋ ๋ถ๋ถ์ด ์ ์์ญ์ธ์ง ์ฐพ๊ธฐ๊ฐ ํ๋ค๋ค.
๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ๊ฐ์์ ์์ญ์ ์ฌ์ฉ์ ์ ์ ํ๊ทธ(Component)๋ฅผ ์ฌ์ฉํ์ฌ
๊ฐ๋
์ฑ์ ๋์ด๊ณ , ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง๊ณ , ์ ์ง ๋ณด์์ ์ฅ์ ์ด ์๊ธด๋ค.
Component๋ฅผ ์์๋ณด๊ธฐ ์ ์ JSX๋ถํฐ ์์๋ณด์.
jsp์์๋ ํ์ด์ง ๋ถํ ํด์ ํ์ง์๋? ๋ญ๊ฐ ๋ ์ข์์ง๊ฑฐ์ง ๋ผ๋ ์๋ฌธ์ด ์๊น
๋ฆฌ์กํธ๋ ๊ฐ์ ๋์ ์ฌ์ฉํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๊ทน๋ํ
๋ฆฌํ๋ก์ฐ(Reflow):DOM ์กฐ์์ผ๋ก ๋ ์ด์์ ๊ณผ์ ์ด ๋ค์ ์งํ๋๋ ๊ฒ
๋ฆฌํ์ธํธ(Repaint):ํ์ธํ ๊ณผ์ ์ด ๋ค์ ์งํ๋๋ ๊ฒ
ex)
์ฌ์ฉ์๊ฐ Todo ๋ฆฌ์คํธ ์ฑ์ ์ฌ์ฉํ ๋,
์๋ฌด๊ฒ๋ ์๋ ๋ฆฌ์คํธ์ ํ ์ผ์ ํ๋ ์ถ๊ฐํ๋ ๊ณผ์ ์ ์๊ฐํด ๋ด ์๋ค. ํ ์ผ์ ์ ๋ ฅํ๊ณ ์ถ๊ฐ ๋ฒํผ์ ๋๋ฅด๋ฉด, ์๋ฌด๊ฒ๋ ์๋ ๋ฆฌ์คํธ์ ํ ์ผ์ ํ๋ ํ์ํ๊ณ , ์ ์ฒด ํ ์ผ ๊ฐ์๋ฅผ ํ์ํฉ๋๋ค. ์ด ๋, ๊ฐ์ ๋์ด ์๋ ๊ฒฝ์ฐ, ํ ์ผ์ ํ๋ ํ์ํ๊ธฐ ์ํด ๋ฆฌํ๋ก์ฐ/๋ฆฌํ์ธํธ๊ฐ ํ ๋ฒ ๋ฐ์ํ๊ณ , ์ ์ฒด ํ ์ผ ๊ฐ์๋ฅผ ํ์ํ๊ธฐ ์ํด ๋ฆฌํ๋ก์ฐ/๋ฆฌํ์ธํธ๊ฐ ๋ค์ ํ ๋ฒ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
ํ์ง๋ง, ๋ฆฌ์กํธ์์๋ ์ด ๋ชจ๋ ๊ณผ์ ์ ๊ฐ์ ๋์์ ์ํํฉ๋๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์๊ฐ ํ ์ผ์ ์ ๋ ฅํ๊ณ ์ถ๊ฐ ๋ฒํผ์ ๋๋ฅด๋ฉด, ํ ์ผ ํ์, ์ ์ฒด ํ ์ผ ๊ฐ์๋ฅผ ํ์ํ๊ธฐ ์ํด ๊ฐ์ ๋์์ ๊ณ์ฐ์ ํ ํ, ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌํ์ฌ ๋ฆฌํ๋ก์ฐ/๋ฆฌํ์ธํธ๋ฅผ ํ ๋ฒ๋ง ์ํํ๋๋ก ํฉ๋๋ค.
์ถ์ฒ : https://dev-yakuza.posstree.com/ko/react/create-react-app/react/
๊ฒฐ๋ก
1.ํ์ด์ค๋ถ์์ ๋ง๋ ์ปดํจํฐ ์ธ์ด์ฏค์ด๋ผ ์๊ฐ.
2.jsx๋ฅผ create-react-app์ด JavaScript๋ก Converting.
JSX์ ex)
HTML๋ ์๋๊ณ , JavaScript๋ ์๋,,
JS์ ex)
JS์์ํ์ฅ๋ ๋ฌธ๋ฒ์ด๋ผ๊ณ ์ ํ์์ง๋ง, ๊ท์น์ ์ด์ง ๋ค๋ฅธ ๋๋์ด๋ค.
๊ณต์ ๋ฌธ์์ JSX์ ์ค๋ช
React์์๋ ๋ณธ์ง์ ์ผ๋ก ๋ ๋๋ง ๋ก์ง์ด UI ๋ก์ง(์ด๋ฒคํธ๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์, ์๊ฐ์ ๋ฐ๋ผ state๊ฐ ๋ณํ๋ ๋ฐฉ์, ํ๋ฉด์ ํ์ํ๊ธฐ ์ํด ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ ๋ฐฉ์ ๋ฑ)๊ณผ ์ฐ๊ฒฐ๋๋ค๋ ์ฌ์ค์ ๋ฐ์๋ค์ ๋๋ค.
React๋ ๋ณ๋์ ํ์ผ์ ๋งํฌ์ ๊ณผ ๋ก์ง์ ๋ฃ์ด ๊ธฐ์ ์ ์ธ์์ ์ผ๋ก ๋ถ๋ฆฌํ๋ ๋์ , ๋ ๋ค ํฌํจํ๋ โ์ปดํฌ๋ํธโ๋ผ๊ณ ๋ถ๋ฅด๋ ๋์จํ๊ฒ ์ฐ๊ฒฐ๋ ์ ๋์ผ๋ก ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค. ์ดํ ์น์ ์์ ๋ค์ ์ปดํฌ๋ํธ๋ก ๋์์ค๊ฒ ์ง๋ง, JS์ ๋งํฌ์ ์ ๋ฃ๋ ๊ฒ ์ต์ํด์ง์ง ์๋๋ค๋ฉด ์ด ์ด์ผ๊ธฐ๊ฐ ํ์ ์ ์ค ๊ฒ์ ๋๋ค
์์ฑ ๊ฐ ๋ฃ๋ ๋ฐฉ๋ฒ:
"" ์ ์ด์ฉํด ๋ฌธ์์ด์,
{}๋ฅผ ์ฌ์ฉํด JavaScript ํํ์ ์ฌ์ฉ๊ฐ๋ฅ
์์ฑ(className)์ props์ ๋ค์ด๊ฐ๋ ๊ฒ ๋ฟ๋ง ์๋๋ผ
children์ ๋ด์ฉ์ด ๋ค์ด๊ฐ๋ค
๐ก ์ฃผ์ ์ ์๋ ๊ฐ์ tag๋ก ๊ฐ์ธ์ ธ์ผํ๋ค.(๊ท์น)
React ์ฑ์ ๊ฐ์ฅ ์์ ๋จ์
<div id="root"></div>
const element = <h1>Hello, world</h1>;
ReactDOM.render(element, document.getElementById('root'));
// root๋ผ๋ ID๊ฐ์ ๊ฐ์ง ๊ณณ์ element๋ฅผ render()ํด์ค๋ค
React DOM์ ํด๋น ์๋ฆฌ๋จผํธ์ ๊ทธ ์์ ์๋ฆฌ๋จผํธ๋ฅผ ์ด์ ์ ์๋ฆฌ๋จผํธ์ ๋น๊ตํ๊ณ DOM์ ์ํ๋ ์ํ๋ก ๋ง๋๋๋ฐ ํ์ํ ๊ฒฝ์ฐ์๋ง DOM์ ์ ๋ฐ์ดํธํ์ฌ ํจ์จ์
๐ค์ปดํฌ๋ํธ์์ ์ฐจ์ด?
๊ฐ๋ ์ ์ผ๋ก ์ปดํฌ๋ํธ๋ JavaScript ํจ์์ ๋น์ท
โpropsโ๋ผ๊ณ ํ๋ ์์์ ์ ๋ ฅ์ ๋ฐ์ ํ, ํ๋ฉด์ ์ด๋ป๊ฒ ํ์๋๋์ง๋ฅผ ๊ธฐ์ ํ๋ React ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํ.
element๊ฐ ๋ ํ์์ ๊ฐ๋ (ํ๋ฉด์ ์ด๋ป๊ฒ ํ์๋๋์ง์ ๋๋)
Function : props๋ฅผ ๊ฐ์ง๊ณ ๋ค๋
์ผํ๋ค.
Class : extends Component๋ฅผ ํ๊ณ render()ํจ์๋ฅผ ์ด์ฉํ๋ค.
์ฐจ์ด์ : : props๋ฅผ ๊ฐ์ง๊ณ ์ฌ๋ this ์ฌ์ฉํ๋์ง์ ์ฐจ์ด๋ ์กด์ฌ.
class๋ณด๋จ Function ๋ง์ด ์ฌ์ฉํ๋ ์ถ์ธ๋ผ๊ณ ํ๋ค~
Why? Life Cycle ์ฐจ์ด์
ํด๋์ค ์ปดํฌ๋ํธ๋ props๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์์ ์์๊ณผ ๋ค๋ฅด๊ฒ ๋์ํ ์ ์๋ ๋ฌธ์ ์ ์ด ์กด์ฌ,
๋ณ๋์ ์๋ฐฉ ์์
์ ํด ์ฃผ์ด์ผ ํ์ง๋ง ํจ์ํ ์ปดํฌ๋ํธ๋ ์ด๋ฌํ ๋ฌธ์ ์ ์ด ๋ฐ์ํ์ง ์๋๋ค๊ณ ํ๋ค.
์์ธํ ๋ด์ฉ์ ๋ฐ์ ์ถ์ฒ์ฐธ์กฐ.
์ถ์ฒ: https://boxfoxs.tistory.com/395
๋จผ์ props๋ ์ฝ๊ธฐ ์ ์ฉ์ด๋ผ๋ ์ฌ์ค๊ณผ
๋ชจ๋ React ์ปดํฌ๋ํธ๋ ์์ ์ props๋ฅผ ๋ค๋ฃฐ ๋ ๋ฐ๋์ ์์ ํจ์์ฒ๋ผ ๋์ํด์ผ ํฉ๋๋ค. ๋ผ๋ ๊ท์น์ด ์๋ค.
์์ํจ์๋?
์ ๋ ฅ๊ฐ์ ๋ฐ๊พธ๋ ค ํ์ง ์๊ณ ํญ์ ๋์ผํ ์ ๋ ฅ๊ฐ์ ๋ํด ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์ํจ์
function sum(a, b) {
return a + b; //๋์ผํ ์
๋ ฅ๊ฐ (ex, 1,2), ๋์ผํ ๊ฒฐ๊ณผ (ex return 3 )
}
์์ํจ์ X
function withdraw(account, amount) {
account.total -= amount; // ์์ ์ ์
๋ ฅ๊ฐ์ ๋ฐ๊พผ๋ค
}
1์ด๋ง๋ค render๋๋ ์๊ณ๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ค.
function Clock(props) {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {props.date.toLocaleTimeString()}.</h2>
</div>
);
}
function tick() {
ReactDOM.render(
<Clock date={new Date()} />,
document.getElementById('root')
);
}
setInterval(tick, 1000); // 1์ด๋ง๋ค tick function ํธ์ถ
์ ์ฝ๋์ ๋ฌธ์ ์ :
Clock์ด ํ์ด๋จธ๋ฅผ ์ค์ ํ๊ณ ๋งค์ด UI๋ฅผ ์
๋ฐ์ดํธํ๋ ๊ฒ์ด Clock์ ๊ตฌํ ์ธ๋ถ์ฌํญ์ด ๋์ด์ผ ํฉ๋๋ค.
์ฆ, Clock์ด ์ค์ค๋ก ์
๋ฐ์ดํธ๋ฅผ ํด์ผํ๋ค. -->State ์ฌ์ฉ
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
componentDidMount() { //์๋ช
์ฃผ๊ธฐ ๋ฉ์๋
this.timerID = setInterval(
() => this.tick(),
1000
);
}
componentWillUnmount() { // ํ์ด๋จธ ๋ฉ์ถ๊ธฐ
clearInterval(this.timerID);
}
tick() {
this.setState({
date: new Date() // state์ date ๊ฐ ๋ณ๊ฒฝ ์ฝ๋
});
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2> //this.state.date = new Date()
</div>
);
}
}
ReactDOM.render(
<Clock />,
document.getElementById('root')
);
class ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ State๋ฅผ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค
ํ์ง๋ง Function ์ปดํฌ๋ํธ ๊ฒฝ์ฐ Hooks๋ฅผ ์ด์ฉํด์ผํ๋ค.
useState()ํจ์๋ฅผ ํตํด state ๊ฐ ๊ด๋ฆฌ ๊ฐ๋ฅ
์ ์ฒด์ ์ธ ๋ฌธ๋ฒ
import React, { useState } from 'react';
//Hooks๊ฐ useState()ํจ์ ๋ฌ์์ค
function ์ปดํฌ๋ํธ(props) {
const [๊ฐ๋ณ์, ๊ฐ๋ณ๊ฒฝํจ์] = useState(๊ธฐ๋ณธ๊ฐ);
const ๊ฐ๋ณ๊ฒฝํจ์ = () => {
//๋ณ๊ฒฝ๋ ์ฝ๋
}
return(
<></>
);
}
์์ ์ฝ๋
import React, { useState } from 'react'; //Hooks๊ฐ useState()ํจ์ ๋ฌ์์ค
//+๋ฒํผ๊ณผ -๋ฒํผ์์ฑํด์ ์ซ์๋ฅผ ๋ณํ์ํค๋ ์ปดํฌ๋ํธ
function Counter(props) {
//num : ์ง์ ๋ ์ซ์ - ๋ณ์์ ๋ด๊ธฐ
//setNum : ๋ณํ๋ ์ซ์ - ๋ณ์์ ๋ด๊ธฐ
const [num, setNum] = useState(0); //๊ธฐ๋ณธ๊ฐ์ 0์ผ๋ก ์ฒ๋ฆฌ
//1์ฉ ์ฆ๊ฐํ ํจ์
const onIncrease = () => {
setNum(num + 1); //ํด๋์ค์ปดํฌ๋ํธ์ setState()ํจ์์ฒ๋ผ ์ฌ์ฉ
}
//1์ฉ ๊ฐ์ํ ํจ์
const onDecrease = () => {
setNum(num - 1); //ํด๋์ค์ปดํฌ๋ํธ์ setState()ํจ์์ฒ๋ผ ์ฌ์ฉ
}
return (
<div style={style}>
<h1>๊ฐ๋ณํ : { num }</h1>
<button onClick={onIncrease}>+</button>
<button onClick={onDecrease}>-</button>
</div>
);
}
export default Counter;
// Wrong
this.setState({
counter: this.state.counter + this.props.increment,
});
// Correct
this.setState(function(state, props) {
return {
counter: state.counter + props.increment
};
});
ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ฃผ๋๊ฒ ๋ง๋ค.
ํจ์๋ ์ด์ state๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ฐ์๋ค์ผ ๊ฒ์ด๊ณ ,
์
๋ฐ์ดํธ๊ฐ ์ ์ฉ๋ ์์ ์ props๋ฅผ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ฐ์๋ค์ผ ์๋ ์๋ค.
๋ฆฌ์กํธ Component์์ ๋ค๋ฃจ๋ ๋ฐ์ดํฐ๋ 2๊ฐ : Props, State
props ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ์๊ฒ ์ฃผ๋ ๊ฐ
์์ ์ปดํฌ๋ํธ์์๋ props ๋ฅผ ๋ฐ์์ค๊ธฐ๋งํ๊ณ , ๋ฐ์์จ props ๋ฅผ ์ง์ ์์ ํ ์ ๋ ์๋ค.
state ๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ ์ธํ๋ฉฐ ๋ด๋ถ์์ ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ.
๐ก ์ฃผ์ ๋ณ๊ฒฝํ ๋ state = value ํ๋ฉด ์๋๊ณ setState = value๋ก ๋ฐ๊ฟ์ฃผ์ด์ผ ํ๋ค.
์ถ์ฒ: https://velopert.com/3629
HTML
<button onclick="activateLasers()">
Activate Lasers
</button>
React
<button onClick={activateLasers}>
Activate Lasers
</button>
HTML
<form onsubmit="console.log('You clicked submit.'); return false">
<button type="submit">Submit</button>
</form>
React
function Form() {
function handleSubmit(e) {
e.preventDefault();
console.log('You clicked submit.');
}
return (
<form onSubmit={handleSubmit}>
<button type="submit">Submit</button>
</form>
);
}