React๋ฅผ ์์ํ๊ธฐ ์ ์
โ React 1 - JSX
โ JSX๋?
- React์์ ์ฌ์ฉ๋๋ JSX
const hi = <p>Hi</p>;
- javascript๋ HTML๋ ์๋ javascript ํ์ฅ๋ฒ์ ์ ๋ฌธ๋ฒ syntax extension for JavaScript
- JSX๋ javascript๊ฐ ์๋๊ธฐ ๋๋ฌธ์
.js
ํ์ผ์ JSX ๋ฌธ๋ฒ์ด ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ํด์ํ์ง ๋ชปํด ๋ฌธ๋ฒ ์ค๋ฅ๊ฐ ๋๋ค. ์ด๋ ๋ฐ๋ฒจ์ ํตํด ๋ธ๋ผ์ฐ์ ๊ฐ ํด์ํ ์ ์๋๋ก ์ปดํ์ผ ๊ณผ์ ์ด ํ์ํ๋ค
๐ JSX element
- HTML๋ฌธ๋ฒ์ JavaScript ์ฝ๋ ๋ด๋ถ์ ์จ์ฃผ๋ฉด ๊ทธ๊ฒ์ด ๋ฐ๋ก JSX
- ๋ณ์์ ์ ์ฅํ ์๋ ์๊ณ , ํจ์์ ์ธ์๋ก ๋๊ธธ ์๋ ์๋ค
const hi = <p>Hi</p>;
const myFavorite = {
food: <li>์๋ฌ๋</li>,
animal: <li>dog</li>,
hobby: <li>programming</li>,
};
๐ JSX attribute
- ํ๊ทธ์ attribute(์์ฑ)์ ์ฃผ๊ณ ์ถ์ ๋๋ ํญ์ โโ ์๋ฐ์ดํ๋ก ๊ฐ์ธ์ฃผ๊ธฐ
- attribute๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ ๋๋ ์ค์ HTML์์ ์ฐ๋ attribute name(์์ฑ๋ช )๊ณผ ๋ค๋ฅผ ์ ์์ผ๋ ์ฃผ์! react ๊ณต์๋ฌธ์
const hi = <p>Hi</p>;
const myFavorite = {
food: <li>์๋ฌ๋</li>,
animal: <li>dog</li>,
hobby: <li className='list-item'>programming</li>,
};
๐ Self-Closing Tag
- JSX์์๋ ์ด๋ค ํ๊ทธ๋ผ๋ self closing tag๊ฐ ํญ์ ๊ฐ๋ฅ
<input>
๊ณผ ๊ฐ์ด ํ๋์ ํ๊ทธ๊ฐ ์์์ธ ๊ฒฝ์ฐ์๋<input />
์ ๊ฐ์ด ํญ์/
์ผ๋ก ๋๋ด์ค์ผ ํ๋ค<div />
์<div></div>
๋ ๊ฐ์ ํํ
๐ Nested JSX
1. (ํ์) ์๊ดํธ๋ก ๊ฐ์ธ๊ธฐ
- ์ค์ฒฉ๋ ์์๋ฅผ ๋ง๋ค๋ ค๋ฉด () ์๊ดํธ๋ก ๊ฐ์ธ์ฃผ๊ธฐ!
const good = (
<>
{" "}
//Fragments
<p>hi</p>
<p>์๋
!</p>
</>
);
2. (ํ์) Fragments
ํญ์ ํ๋์ ํ๊ทธ๋ก ์์
- ์ ์ผ ์ฒ์ ์์๊ฐ sibling์ด๋ฉด ์๋๋ฏ๋ก, ๋ฌด์กฐ๊ฑด ํ๋์ ํ๊ทธ๋ก ๊ฐ์ธ์ ธ์ผ ํ๋ค react_Fragments
โ Rendering
- html ์์(element), ๋๋ React ์์ ๋ฑ์ ์ฝ๋๊ฐ ๋์ผ๋ก ๋ณผ ์ ์๋๋ก ๊ทธ๋ ค์ง๋ ๊ฒ์ ๋ ๋๋ง(rendering) ์ด๋ผ๊ณ ํ๋ค
ReactDOM.render
ํจ์๋ฅผ ์ฌ์ฉ
ReactDOM.render(<h1>Hello, world!</h1>, document.getElementById("root"));
โ React 2 - Component์ Props
โ Component๋?
component(์ปดํฌ๋ํธ)๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ๋จ์
- ์ปดํฌ๋ํธ๋ ๋ ๋ฆฝ์ ์ผ๋ก, ์ฌ์ฌ์ฉ๊ฐ๋ฅํ ์ฝ๋๋ก ๊ด๋ฆฌํ ์ ์๋ค
- ์ปดํฌ๋ํธ๋ ํจ์๋ ๋น์ทํ๋ค. ํจ์๋ ๊ธฐ๋ฅ์ด ๋
๋ฆฝ์ ์ด๊ณ ์ฌ์ฌ์ฉํ ์๊ฐ ์๊ณ ์ปดํฌ๋ํธ๋
input
์ ๋ฐ์์return
ํ ์ ์๋ค. - ๐ฉ์ง์ค! React ์ปดํฌ๋ํธ์์๋ input์ props๋ผ๊ณ ๋งํ๊ณ return์ ํ๋ฉด์ ๋ณด์ฌ์ ธ์ผ ํ React์์๊ฐ return๋๋ค
โ Component ๋ง๋ค๊ธฐ
- component๋
classํ
๊ณผfunctionํ
์ด ์๋ค
๐ ํจ์๋ก Welcome ์ปดํฌ๋ํธ ๊ตฌํํ๊ธฐ
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
๐ class๋ก Welcome ์ปดํฌ๋ํธ ๊ตฌํํ๊ธฐ
- class๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ค๋ฉด
React.Component
๋ฅผ extendํด์ ์์ฑ - ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ๋
render()
๋ฉ์๋๋ ๋ฌด์กฐ๊ฑด ์ ์ํด์ผํ๊ณ ,return
๋ ํด์ฃผ์ด์ผ ํ๋ค render()
๋ฉ์๋๋ ๋ฌด์กฐ๊ฑด ์ ์ํด์ผํ๋ค๋ ๋ง์, component๋ฅผ ๋ง๋ค ๋ ํ์ํ ๋ฉ์๋๊ฐ ์๋ ๋ ์๋ค๋ ๋ป. ๊ทธ๋ฐ๋ฐ ๊ทธ ์ค์์render()
๋ง ํ์์ด๋ค
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
โ Component ์ฌ์ฉ
- function/class ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ ์ ์๊ณ ํ๊ทธ์ฒ๋ผ
<Welcome />
์ผ๋ก ์์ฑ - component๋ฅผ ์ฌ์ฉํ ๋์ ์ํ๋ attribute๋ฅผ ์ถ๊ฐํ ์ ์๋๋ฐ parameter๋ก ํด๋น attrubute๋ฅผ ๋ฐ์ ์ฌ์ฉํ๋๋ฐ ์ด๊ฒ์
props
๋ผ๊ณ ํ๋ค props
๋ property์ ์ค์๋ง๋ก,.
(dot)์ผ๋ก ์์ฑ๋ช ์ ์ ๊ทผ๊ฐ๋ฅํ๊ณ ,props.์์ฑ๋ช
์ผ๋ก ์์ฑ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค
// 1. Welcome ์ปดํฌ๋ํธ ์ ์
// Welcome ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ์ธก(๋ถ๋ชจ)์์ name์ด๋ผ๋ attribute๋ฅผ ๋ถ์ฌํ๊ณ . props.name์ ๊ฐ์ ์ฌ์ฉ
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
// 2. App ์ปดํฌ๋ํธ ์ ์
// div๋ก ๊ฐ์ธ์ ธ์๊ณ ,
// <Welcome /> ์ปดํฌ๋ํธ๋ฅผ ์ธ๋ฒ ์ฌ์ฉ. name์ด๋ผ๋ attribute๋ฅผ ๋ถ์ฌํ์
function App() {
return (
<div>
<Welcome name='Sara' />
<Welcome name='Cahal' />
<Welcome name='Edite' />
</div>
);
}
// 3. ํ๋ฉด์ React ์์ ๊ทธ๋ ค์ฃผ๊ธฐ
ReactDOM.render(<App />, document.getElementById("root"));
โ ๋ ์์ Component๋ก ๋ถ๋ฆฌํ๊ธฐ
- ์ฌ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ด 1์ด๋ผ๋ ์๋ค๋ฉด ์ปดํฌ๋ํธ๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ด ์ข๋ค
โ React 3-Component์ State
โ state
state๋?? ๋ง ๊ทธ๋๋ก ์ปดํฌ๋ํธ์ ์ํ ๊ฐ state์ props๋ ๋ ๋ค object ์ด๊ณ , ํ๋ฉด์ ๋ณด์ฌ์ค ์ ๋ณด(์ํ)๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ์ ์์ ์๋ก ๋น์ทํ ์ญํ ์ ํ๋ค
- props๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๋ถ๋ชจ์ชฝ์์ ์ ๋ฌํด์ผ๋ง ์ฌ์ฉํ ์ ์๊ณ (parameter ์ฒ๋ผ)
- state๋ ์ปดํฌ๋ํธ ๋ด์์ ์ ์ํ๊ณ ์ฌ์ฉ
class Button extends React.Component {
constructor() {
super();
this.state = {
clicked: false,
};
}
render() {
return (
<div
className='btn'
// onClick์ this.setState๋ผ๋ ํจ์๋ฅผ ํธ์ถํ์ฌ state๋ฅผ ์
๋ฐ์ดํธ ํ๋ค
onClick={() => {
this.setState({ clicked: !this.state.clicked });
}}
>
{this.state.clicked ? "์ข์์" : "์ซ์ด์"}
</div>
);
}
}
ReactDOM.render(<Button />, document.getElementById("root"));
๐ constructor()
- constructor๋ class์ instance๊ฐ ์์ฑ๋ ๋ ํญ์ ํธ์ถ๋๋ ํจ์(์์ฑ์)
- ์ด๊ธฐํํ ๊ฐ๋ค์ constructor์์ ์ธํ
- super() ๋ผ๋ ํค์๋๋ ๊ผญ ์์ฑํ์!!! ๊ทธ๋์ผ React.Component class์ ์๋ ๋ฉ์๋๋ค(ex. render)์ ์ฌ์ฉํ ์ ์๋ค
โ props์ state
this.props.type
์ด โlikeโ์ด๋ฉดlike-btn
์ด๋ผ๋ ํด๋์ค ์์ฑ์ด ์ถ๊ฐ ์ฝ๋๋ณด๊ธฐ
โ React 4 - React ์ปดํฌ๋ํธ์ Lifecycle
render
,componentDidMount
,componentDidUpdate
,componentWillUnmount
๋ฑ์ ํจ์๋React.Component
class์์ ์ ๊ณตํ๋ ๋ฉ์๋- ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ๋ class๋ก ์์ฑํ๋ฉด ์ด๋ฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ์ปดํฌ๋ํธ๊ฐ lifecycle์ ๋ฐ๋ผ ๊ฐ์์ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค
โ React 5 - ์ด๋ฒคํธ ํธ๋ค๋ง
โReact์์๋ React element์ onClick
์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํด์ event handler ํจ์๋ฅผ ๋๊ฒจ์ค๋ค
class Button extends React.Component {
constructor() {
super();
this.state = {
clicked: false,
};
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState({
clicked: !this.state.clicked,
});
}
render() {
return (
<div
className={`btn ${this.props.type === "like" ? "like-btn" : ""}`}
onClick={this.handleClick}
>
{this.state.clicked ? "์ข์์" : "์ซ์ด์"}
</div>
);
}
}
ReactDOM.render(<Button type='like' />, document.getElementById("root"));
๐ React ์์์ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ ๊ฒฝ์ฐ bind(this)๋ฅผ ํด์ค์ผํ๋ค
- ์ด๋ฒคํธ์ event handler ํจ์๋ฅผ ๋๊ธธ๋
bind
๋ฅผ ํด์ฃผ์ง ์์ผ๋ฉด event handler ํจ์๋ด์์this
์context
๋ฅผ ์์ด๋ฒ๋ ค์ this๊ฐundefined
๊ฐ ๋๋ค - handleClick ๋ฉ์๋ ๋ด์์
this
ํค์๋๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ, ์ด this๋ Button ์ปดํฌ๋ํธ์context
์ฌ์ผ ํ๋ค - handleClick.bind(this)๋ผ๊ณ ์์ฑํด์ค ์์น์์ ๊ทธ this๋ฅผ handleClick ์ ๋๊ฒจ์ handleClick ๋ฉ์๋ ๋ด์์๋ ๊ฐ์ this๋ฅผ ์ฐ๊ฒ ๋ค๋ ๋ป์ด๋ค
- ๊ทธ๋์ผ๋ง Button ์ปดํฌ๋ํธ์
this.state
์ ์ ๊ทผํ๊ณ ,setState
ํจ์๋ ์ธ ์ ์๊ธฐ ๋๋ฌธ
โจ์ฐธ๊ณ โจ context
- context๋ React ์ปดํฌ๋ํธ ํธ๋ฆฌ ์์์ ์ ์ญ์ (global)์ด๋ผ๊ณ ๋ณผ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์๋๋ก ๊ณ ์๋ ๋ฐฉ๋ฒ react_context