React 1์ฃผ์ฐจ ์ ๋ฆฌ
์ด ๊ธ์ ๋ชฉ์ฐจ47๊ฐ
- โ React๋ฅผ ์ ์ฌ์ฉํ ๊น?
- โ JSX์ ์ฅ์
- ๐ JSX ๊ธฐ๋ณธ ๋ฌธ๋ฒ ์ ๋ฆฌ
- 1. ํ๋์ ์ต์์ ํ๊ทธ๋ก ๊ฐ์ธ๊ธฐ
- 2. HTML ์์ฑ ๋์ camelCase ์ฌ์ฉ
- 3. JavaScript ํํ์ ์ฌ์ฉ
- 4. self-closing ํ๊ทธ๋ ๋ฐ๋์ ๋ซ๊ธฐ
- ๐งฉ Props๋?
- ๐ก Props์ ํน์ง
- โ๏ธ ๊ฐ๋จํ ์์ : Comment ์ปดํฌ๋ํธ
- ๐ ์ปดํฌ๋ํธ ํฉ์ฑ(Component Composition)
- ๐งผ ์ฝ๋ ์ ๋ฆฌ๋ฅผ ์ํ ์ปดํฌ๋ํธ ์ถ์ถ
- ์: Comment ์ปดํฌ๋ํธ ๋ถํด
- ๐งฉ State๋?
- โ ํน์ง
- ๐ฆ ํด๋์ค ์ปดํฌ๋ํธ์์์ State ์ฌ์ฉ
- โ State๋ ์ง์ ์์ โ
- ๐ข ์๋ช ์ฃผ๊ธฐ ๋จ๊ณ
- ๐ ์ฃผ์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋ (ํด๋์ค ์ปดํฌ๋ํธ ๊ธฐ์ค)
- โ๏ธ ์๋ช ์ฃผ๊ธฐ ํ๋ฆ ์์
- ๐ Hook์ด๋?
- โ useState
- ๐ ์ํ๋ฅผ ์ ์ฅํ ์ ์๊ฒ ํด์ฃผ๋ Hook
- ๐ ์ค๋ช
- ๐ useEffect
- ๐ ๋ถ์ ํจ๊ณผ(Side Effect)๋ฅผ ์ฒ๋ฆฌํ๋ Hook
- โ๏ธ useEffect์ ๋์ ๋ฐฉ์
- โ ์์ : ๋ง์ดํธ, ์ธ๋ง์ดํธ, ์ ๋ฐ์ดํธ
- ๐งช useState & useEffect ๊ฐ์ด ์ฌ์ฉํ๊ธฐ
- โ๏ธ ๊ฒฐ๊ณผ:
- ๐ useMemo
- ๐ ๋ณต์กํ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ต(memoization)ํด์ ๋ถํ์ํ ์ฐ์ฐ์ ๋ฐฉ์ง
- โ ์ธ์ ์ฌ์ฉํ๋์?
- ๐ ์์
- ๐ useCallback
- ๐ ํจ์๋ฅผ ๊ธฐ์ต(memoization)ํด์ ๋งค ๋ ๋๋ง๋ง๋ค ์๋ก ๋ง๋ค์ด์ง๋ ๊ฒ์ ๋ฐฉ์ง
- โ ์ธ์ ์ฌ์ฉํ ๊น?
- ๐ ์์
- ๐ฏ useRef
- ๐ DOM ์์๋ ๋ณ์์ ์ฐธ์กฐ(reference) ๋ฅผ ์ ์ฅํ ์ ์๋ Hook
- ๐ ์์ : input์ ํฌ์ปค์ค ์ฃผ๊ธฐ
- โ ๋ฆฌ์กํธ์ DOM์ ์ด๋ฒคํธ ์ฐจ์ด์
- โ HTML DOM ๋ฐฉ์
- โ ๋ฆฌ์กํธ ๋ฐฉ์
- ๐ก ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๋?
- ๐ ๏ธ ๋งค๊ฐ๋ณ์ ์ ๋ฌ ๋ฐฉ๋ฒ
- ๐ฅ ์ด๋ฒคํธ ๊ฐ์ฒด(e)
๐ก React๋?
React๋ Facebook(ํ์ฌ Meta)์์ ๋ง๋ JavaScript ๊ธฐ๋ฐ์ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
์นํ์ด์ง์ UI(User Interface)๋ฅผ ๊ตฌ์ฑํ ๋, ํจ์จ์ ์ด๊ณ ์ง๊ด์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌ๋ก ์ฌ์ฉ๋๋ค.
โ React๋ฅผ ์ ์ฌ์ฉํ ๊น?
๊ธฐ์กด์ ์น ๊ฐ๋ฐ ๋ฐฉ์์ HTML, CSS, JavaScript ํ์ผ์ ๋๋ ์ ๊ด๋ฆฌํ๊ณ ,
ํ์ด์ง์ ์์ ๋ณํ๊ฐ ์์ด๋ ์ ์ฒด HTML์ ๋ค์ ๋ถ๋ฌ์์ผ ํ์ง๋ง,
React๋ ํ์ํ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธํ๊ณ , UI๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ๋์์ค๋ค.
๐ก JSX๋?
JSX (JavaScript XML) ๋ JavaScript์ XML์ ํ์ฅํ ๋ฌธ๋ฒ์ด๋ค.
์ฝ๊ฒ ๋งํ๋ฉด, JavaScript ์ฝ๋ ์์์ HTML์ ์์ฑํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๋ฌธ๋ฒ
const element = <h1>Hello, React!</h1>;
- ์ ์ฝ๋์ฒ๋ผ, HTML ํ๊ทธ๋ฅผ ๋ง์น JavaScript ๋ณ์์ฒ๋ผ ์์ฑํ ์ ์๋ค.
- ์ด ์ฝ๋๋ ์ฌ์ค Babel์ด๋ผ๋ ๋๊ตฌ์ ์ํด
React.createElement()๋ก ๋ณํ๋๋ค.
โ JSX์ ์ฅ์
- ๊ฐ๋ ์ฑ ํฅ์: UI ๊ตฌ์กฐ๋ฅผ ์ฝ๋์์ ์ง๊ด์ ์ผ๋ก ๋ณผ ์ ์๋ค.
- ์ปดํฌ๋ํธํ ์ฉ์ด: UI๋ฅผ ์์ ์กฐ๊ฐ์ผ๋ก ๋๋์ด ๊ด๋ฆฌํ๊ธฐ ํธํ๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์ ์๋ฒฝํ ํตํฉ: ์กฐ๊ฑด๋ถ ๋ ๋๋ง, ๋ฐ๋ณต ๋ ๋๋ง ๋ฑ์ JS ๋ฌธ๋ฒ์ผ๋ก ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
๐ JSX ๊ธฐ๋ณธ ๋ฌธ๋ฒ ์ ๋ฆฌ
1. ํ๋์ ์ต์์ ํ๊ทธ๋ก ๊ฐ์ธ๊ธฐ
// โ ์ค๋ฅ ๋ฐ์
return (
<h1>Hello</h1>
<p>React</p>
);
// โ
์ฌ๋ฐ๋ฅธ ์ฝ๋
return (
<div>
<h1>Hello</h1>
<p>React</p>
</div>
);
์ปดํฌ๋ํธ๋ ํญ์ ํ๋์ ๋ถ๋ชจ ์์๋ง ๋ฐํํด์ผ ํ๋ค.
2. HTML ์์ฑ ๋์ camelCase ์ฌ์ฉ
// HTML: <div class="box"></div>
// JSX: <div className="box"></div>
classโclassNameonclickโonClick
JSX์์๋ HTML ์์ฑ์ camelCase(์นด๋ฉ ํ๊ธฐ๋ฒ) ์ผ๋ก ์์ฑํด์ผ ํ๋ค.
3. JavaScript ํํ์ ์ฌ์ฉ
JSX ์์์๋ ์ค๊ดํธ {} ๋ฅผ ์ฌ์ฉํด JavaScript ํํ์์ ์ธ ์ ์๋ค.
const name = "๋ฏผ์ง";
return <h1>์๋
ํ์ธ์, {name}๋!</h1>;
- ์กฐ๊ฑด๋ถ ๋ ๋๋ง๋ ๊ฐ๋ฅ!
{isLoggedIn ? <Logout /> : <Login />}
4. self-closing ํ๊ทธ๋ ๋ฐ๋์ ๋ซ๊ธฐ
JSX์์๋ ํผ์ ์ฐ์ด๋ ํ๊ทธ๋ ๋ฐ๋์ ์ฌ๋์(/) ๋ฅผ ๋ถ์ฌ ๋ซ์์ผ ํ๋ค.
<input />
<br />
<hr />
๐ก Props์ ์ปดํฌ๋ํธ ํฉ์ฑ
๐งฉ Props๋?
๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ์ ๊ฐ์ ์ ๋ฌํ ๋ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ์ ๋ฌ ๋ฐฉ์
function Welcome(props) {
return <h1>์๋
ํ์ธ์, {props.name}๋!</h1>;
}
<Welcome name="๋ฏผ์ง" />
props.name์ ํตํด ๋ถ๋ชจ๊ฐ ์ ๋ฌํname๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.- ์ปดํฌ๋ํธ์ ๊ฐ์ ์ ๋ฌํ ๋๋ HTML ์์ฑ์ฒ๋ผ ์์ฑํ๋ค.
๐ก Props์ ํน์ง
- ์ฝ๊ธฐ ์ ์ฉ โ ์์ ์ปดํฌ๋ํธ์์ props ๊ฐ์ ์ง์ ๋ณ๊ฒฝํ ์ ์๋ค.
- ๊ฐ์ฒด ํํ๋ก ์ ๋ฌ๋๋ฉฐ, ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ํ ๋ฒ์ ๋ณด๋ผ ์ ์๋ค.
- ๋์ ์ผ๋ก ๋ ๋๋ง์ด ๊ฐ๋ฅํ๋ค. (๋ฐ์ดํฐ์ ๋ฐ๋ผ ์ปดํฌ๋ํธ ๋ด์ฉ์ด ๋ฐ๋)
โ๏ธ ๊ฐ๋จํ ์์ : Comment ์ปดํฌ๋ํธ
function Comment(props) {
return (
<div className="comment">
<h2>{props.name}</h2>
<p>{props.comment}</p>
</div>
);
}
<Comment name="์งํ" comment="์ข์ ๊ธ ๊ฐ์ฌํฉ๋๋ค!" />
<Comment name="์์" comment="๋ง์ด ๋ฐฐ์๊ฐ์ ๐" />
- ์ด๋ ๊ฒ props๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
๐ ์ปดํฌ๋ํธ ํฉ์ฑ(Component Composition)
ํฉ์ฑ์ด๋, ์์ ์ปดํฌ๋ํธ๋ค์ ๋ชจ์์ ํ๋์ ํฐ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋งํ๋ค.
function CommentList() {
return (
<div>
<Comment name="๋ฏผ์ง" comment="์ ๋ง ์ข์์!" />
<Comment name="์งํ" comment="๋ฐฐ์๊ฐ๋๋ค~" />
</div>
);
}
CommentList๋Comment๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํด ๋ง๋ ์์ ์ปดํฌ๋ํธ์ด๋ค.
์ปดํฌ๋ํธ๋ฅผ ์ค์ฒฉํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์
๐งผ ์ฝ๋ ์ ๋ฆฌ๋ฅผ ์ํ ์ปดํฌ๋ํธ ์ถ์ถ
์ปดํฌ๋ํธ๊ฐ ๋๋ฌด ์ปค์ง๊ฑฐ๋ ๊ธฐ๋ฅ๋ณ๋ก ๊ตฌ๋ถ์ด ํ์ํ๋ค๋ฉด, ์ปดํฌ๋ํธ ์ถ์ถ์ ํตํด ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค.
์: Comment ์ปดํฌ๋ํธ ๋ถํด
function Avatar(props) {
return <img src={props.user.avatarUrl} alt={props.user.name} />;
}
function UserInfo(props) {
return (
<div className="user-info">
<Avatar user={props.user} />
<span>{props.user.name}</span>
</div>
);
}
function Comment(props) {
return (
<div className="comment">
<UserInfo user={props.author} />
<p>{props.text}</p>
<span>{props.date}</span>
</div>
);
}
์ด๋ ๊ฒ ํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ ๋ช ํํ ์ญํ ์ ๊ฐ์ง๊ฒ ๋์ด ์ฌ์ฌ์ฉ๋ ์ฌ์์ง๊ณ ์ ์ง๋ณด์๋ ํธํด์ง๋ค.
๐ก State์ ์๋ช ์ฃผ๊ธฐ
๐งฉ State๋?
State(์ํ) ๋ ์ปดํฌ๋ํธ๊ฐ ๊ธฐ์ตํด์ผ ํ ๋ฐ์ดํฐ
์ฝ๊ฒ ๋งํ๋ฉด ์ฌ์ฉ์์์ ์ํธ์์ฉ์ด๋ ๋ด๋ถ์ ๋ณํ์ ๋ฐ๋ผ ๋ฐ๋๋ ๊ฐ์ด๋ค.
โ ํน์ง
- State๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ ์ธ๋จ
- ๊ฐ์ด ๋ฐ๋๋ฉด ์ปดํฌ๋ํธ๋ ์๋์ผ๋ก ๋ค์ ๋ ๋๋ง
- Props๋ ๋ถ๋ชจ๋ก๋ถํฐ ๋ฐ๋ ๊ฐ(์ธ๋ถ), State๋ ์ปดํฌ๋ํธ ์์ ์ด ๊ด๋ฆฌํ๋ ๊ฐ(๋ด๋ถ)
๐ฆ ํด๋์ค ์ปดํฌ๋ํธ์์์ State ์ฌ์ฉ
import React from 'react';
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 }; // ์ด๊ธฐ ์ํ ์ ์
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState({ count: this.state.count + 1 }); // ์ํ ์
๋ฐ์ดํธ
}
render() {
return (
<div>
<p>ํ์ฌ ์นด์ดํธ: {this.state.count}</p>
<button onClick={this.handleClick}>+1</button>
</div>
);
}
}
this.state๋ ์ด๊ธฐ ์ํ๋ฅผ ์ ์this.setState()๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํจ
โ State๋ ์ง์ ์์ โ
this.state.count = this.state.count + 1; // โ ์ ๋ ์ด๋ ๊ฒ ํ๋ฉด ์ ๋จ!
๋ฐ๋์ setState()๋ฅผ ์ฌ์ฉํด์๋ง ๊ฐ์ ๋ณ๊ฒฝํด์ผ ํ๋ค.
๊ทธ๋์ผ ๋ฆฌ์กํธ๊ฐ ์ํ ๋ณํ์ ํจ๊ป ์๋์ผ๋ก ๋ ๋๋ง์ ๊ด๋ฆฌํด์ค๋ค.
this.state๋ฅผ ์ง์ ๋ฐ๊พธ๋ฉด ํ๋ฉด์ ์๋ฌด๋ฐ ๋ณํ๊ฐ ์ผ์ด๋์ง ์๋๋ค.
๐ก ์๋ช ์ฃผ๊ธฐ(Lifecycle)๋?
์ปดํฌ๋ํธ๋ ์์ฑ โ ์ ๋ฐ์ดํธ โ ์ ๊ฑฐ์ ํ๋ฆ์ ๊ฐ๋๋ฐ,
์ด ๊ณผ์ ์ ์ปดํฌ๋ํธ ์๋ช ์ฃผ๊ธฐ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๐ข ์๋ช ์ฃผ๊ธฐ ๋จ๊ณ
- Mounting (์์ฑ): ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ง๋ค์ด์ง๋ ๋จ๊ณ
- Updating (์ ๋ฐ์ดํธ): props ๋๋ state๊ฐ ๋ณ๊ฒฝ๋ ๋
- Unmounting (์ ๊ฑฐ): ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง ๋
๐ ์ฃผ์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋ (ํด๋์ค ์ปดํฌ๋ํธ ๊ธฐ์ค)
| ๋ฉ์๋ | ์์ | ์ญํ |
|---|---|---|
constructor() |
์์ฑ ์ | ์ด๊ธฐ๊ฐ ์ค์ |
render() |
๋ ๋๋ง | ํ๋ฉด์ UI ์ถ๋ ฅ |
componentDidMount() |
๋ ๋๋ง ํ | API ํธ์ถ, setInterval ๋ฑ |
componentDidUpdate() |
์ํ๋ props๊ฐ ๋ณ๊ฒฝ๋ ํ | ๋ณํ ๊ฐ์ง |
componentWillUnmount() |
์ ๊ฑฐ ์ง์ | ์ ๋ฆฌ ์์ (ํ์ด๋จธ ์ ๊ฑฐ ๋ฑ) |
โ๏ธ ์๋ช ์ฃผ๊ธฐ ํ๋ฆ ์์
class LifeCycleDemo extends React.Component {
constructor(props) {
super(props);
console.log('1๏ธโฃ constructor');
this.state = { count: 0 };
}
componentDidMount() {
console.log('3๏ธโฃ componentDidMount');
}
componentDidUpdate() {
console.log('๐ componentDidUpdate');
}
componentWillUnmount() {
console.log('โ componentWillUnmount');
}
render() {
console.log('2๏ธโฃ render');
return (
<div>
<p>{this.state.count}</p>
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
์ฆ๊ฐ
</button>
</div>
);
}
}
๋ฒํผ ํด๋ฆญ โ ์ํ ์ ๋ฐ์ดํธ โ render โ componentDidUpdate ์์๋ก ํธ์ถ๋๋ค.
๐ก ๋ฆฌ์กํธ Hook ์ ๋ฆฌ
๐ Hook์ด๋?
Hook(ํ )์ ํจ์ํ ์ปดํฌ๋ํธ์์๋ state์ ์๋ช ์ฃผ๊ธฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ ํจ์
๋ฆฌ์กํธ 16.8๋ถํฐ ๊ณต์์ ์ผ๋ก ๋์ ๋์๊ณ , ์ง๊ธ์ ๊ฑฐ์ ๋ชจ๋ ๋ฆฌ์กํธ ํ๋ก์ ํธ์์ Hook์ ์ฌ์ฉํ๋ค.
โ useState
๐ ์ํ๋ฅผ ์ ์ฅํ ์ ์๊ฒ ํด์ฃผ๋ Hook
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0); // count: ์ํ๊ฐ, setCount: ์ํ๋ฅผ ๋ฐ๊พธ๋ ํจ์
return (
<div>
<p>ํ์ฌ ์นด์ดํธ: {count}</p>
<button onClick={() => setCount(count + 1)}>+1</button>
</div>
);
}
๐ ์ค๋ช
useState(0)โ ์ด๊ธฐ๊ฐ 0countโ ํ์ฌ ์ํ๊ฐsetCountโ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ํจ์- ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ปดํฌ๋ํธ๋ ์๋์ผ๋ก ์ฌ๋ ๋๋ง
๐ useEffect
๐ ๋ถ์ ํจ๊ณผ(Side Effect)๋ฅผ ์ฒ๋ฆฌํ๋ Hook
API ํธ์ถ, ํ์ด๋จธ ์ค์ , DOM ์ง์ ์กฐ์ ๋ฑ์ ํ ๋ ์ฌ์ฉํ๋ค.
import React, { useState, useEffect } from 'react';
function Timer() {
const [count, setCount] = useState(0);
// ํ๋ฉด์ด ๋ ๋๋ง๋ ํ ์คํ๋จ
useEffect(() => {
console.log(`์นด์ดํธ๊ฐ ${count}๋ก ๋ฐ๋์์ด์!`);
}, [count]); // count๊ฐ ๋ฐ๋ ๋๋ง๋ค ์คํ
return (
<div>
<p>{count}</p>
<button onClick={() => setCount(count + 1)}>+1</button>
</div>
);
}
โ๏ธ useEffect์ ๋์ ๋ฐฉ์
์์กด์ฑ ๋ฐฐ์ด ([]) |
์คํ ์์ | ์์ |
|---|---|---|
| ์์ | ํญ์ ์คํ (๋ ๋๋ง๋ง๋ค) | useEffect(() => { ... }); |
๋น ๋ฐฐ์ด [] |
์ต์ด ๋ง์ดํธ ์ 1๋ฒ ์คํ | useEffect(() => { ... }, []); |
ํน์ ๊ฐ [a, b] |
a ๋๋ b๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ์คํ | useEffect(() => { ... }, [a, b]); |
โ ์์ : ๋ง์ดํธ, ์ธ๋ง์ดํธ, ์ ๋ฐ์ดํธ
useEffect(() => {
console.log('์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋ํ๋จ'); // Mount
return () => {
console.log('์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์์ ์ฌ๋ผ์ง'); // Unmount
};
}, []); // ๋น ๋ฐฐ์ด: ์ต์ด ๋ง์ดํธ & ์ธ๋ง์ดํธ ์๋ง ์คํ
๐งช useState & useEffect ๊ฐ์ด ์ฌ์ฉํ๊ธฐ
function WelcomeMessage({ name }) {
const [message, setMessage] = useState('');
useEffect(() => {
setMessage(`${name}๋, ํ์ํฉ๋๋ค!`);
}, [name]);
return <p>{message}</p>;
}
โ๏ธ ๊ฒฐ๊ณผ:
name์ด ๋ฐ๋๋ฉด ์๋์ผ๋ก message๋ ๋ณ๊ฒฝ๋จ- ์์กด์ฑ ๋ฐฐ์ด ๋๋ถ์ ํ์ํ ์์ ์๋ง ์คํ๋จ
๐ useMemo
๐ ๋ณต์กํ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ต(memoization)ํด์ ๋ถํ์ํ ์ฐ์ฐ์ ๋ฐฉ์ง
const memoizedValue = useMemo(() => {
return someHeavyComputation(input);
}, [input]);
โ ์ธ์ ์ฌ์ฉํ๋์?
- ๊ณ์ฐ ๋น์ฉ์ด ๋์ ํจ์๋ฅผ ๋ฐ๋ณตํด์ ํธ์ถํ์ง ์๋๋ก ํ ๋
- ํน์
props๋state๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ๋ค์ ๊ณ์ฐ๋๊ฒ ํ๊ณ ์ถ์ ๋
๐ ์์
import { useMemo, useState } from "react";
function ExpensiveComponent({ input }) {
const expensiveValue = useMemo(() => {
console.log("๐ฅ ์ฐ์ฐ ์คํ!");
return input * 1000000;
}, [input]);
return <p>๊ฒฐ๊ณผ: {expensiveValue}</p>;
}
input์ด ๋ฐ๋ ๋๋ง ์ฐ์ฐ์ด ๋ค์ ์ํ๋๊ณ , ๊ทธ ์ธ์๋ ์ด์ ๊ฐ ์ฌ์ฌ์ฉ
๐ useCallback
๐ ํจ์๋ฅผ ๊ธฐ์ต(memoization)ํด์ ๋งค ๋ ๋๋ง๋ง๋ค ์๋ก ๋ง๋ค์ด์ง๋ ๊ฒ์ ๋ฐฉ์ง
jsx
๋ณต์ฌํธ์ง
const memoizedCallback = useCallback(() => {
doSomething(a, b);
}, [a, b]);
โ ์ธ์ ์ฌ์ฉํ ๊น?
- ์์ ์ปดํฌ๋ํธ์ props๋ก ํจ์๋ฅผ ๋๊ธธ ๋
- ๋ฆฌ๋ ๋๋ง์ ์ต์ํํ๊ณ ์ถ์ ๋
๐ ์์
import React, { useCallback, useState } from "react";
import Child from "./Child";
function Parent() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
console.log("Clicked!");
}, []);
return (
<><button onClick={() => setCount(count + 1)}>+1</button>
<Child onClick={handleClick} />
</>
);
}
Child ์ปดํฌ๋ํธ๋ handleClick์ด ๋ณํ์ง ์์ผ๋ฏ๋ก ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์์
๐ฏ useRef
๐ DOM ์์๋ ๋ณ์์ ์ฐธ์กฐ(reference) ๋ฅผ ์ ์ฅํ ์ ์๋ Hook
const myRef = useRef(null);
.current์์ฑ์ผ๋ก ์ค์ DOM ์ ๊ทผ ๊ฐ๋ฅ- ์ํ ๋ณ๊ฒฝ๊ณผ ๋ค๋ฅด๊ฒ ๋ณ๊ฒฝ๋์ด๋ ๋ ๋๋ง์ ์ ๋ฐํ์ง ์์
๐ ์์ : input์ ํฌ์ปค์ค ์ฃผ๊ธฐ
import React, { useRef } from "react";
function FocusInput() {
const inputRef = useRef(null);
const onClick = () => {
inputRef.current.focus();
};
return (
<><input ref={inputRef} />
<button onClick={onClick}>ํฌ์ปค์ค ์ฃผ๊ธฐ</button>
</>
);
}
๐ก ์ด๋ฒคํธ(Event)๋?
- ์ฌ์ฉ์์์ ์ํธ์์ฉ์์ ๋ฐ์ํ๋ ์ฌ๊ฑด
- ๋ฒํผ ํด๋ฆญ, ํค๋ณด๋ ์ ๋ ฅ, ๋ง์ฐ์ค ์์ง์, ํผ ์ ์ถ ๋ฑ
- ์:
onClick,onChange,onSubmit,onMouseEnter,onKeyDown, โฆ
โ ๋ฆฌ์กํธ์ DOM์ ์ด๋ฒคํธ ์ฐจ์ด์
| ๊ตฌ๋ถ | DOM ๋ฐฉ์ | ๋ฆฌ์กํธ ๋ฐฉ์ |
|---|---|---|
| ์ด๋ฒคํธ ์ด๋ฆ | ์๋ฌธ์ (onclick) |
์นด๋ฉํ๊ธฐ๋ฒ (onClick) |
| ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ ๋ฌ ๋ฐฉ์ | ๋ฌธ์์ด ("myFunc()") |
ํจ์ ({myFunc}) |
๐ ์์ ๋น๊ต
โ HTML DOM ๋ฐฉ์
<button onclick="handleClick()">Click Me</button>
โ ๋ฆฌ์กํธ ๋ฐฉ์
<button onClick={handleClick}>Click Me</button>
๐ก ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๋?
- ์ด๋ฒคํธ ๋ฐ์ ์ ์คํ๋๋ ํจ์
- ๋ณดํต ์ปดํฌ๋ํธ ๋ด๋ถ์ ์ ์ํด์ ์ฌ์ฉ
function MyComponent() {
const handleClick = () => {
alert("๋ฒํผ์ด ํด๋ฆญ๋์์ต๋๋ค!");
};
return <button onClick={handleClick}>ํด๋ฆญ</button>;
}
๐ ๏ธ ๋งค๊ฐ๋ณ์ ์ ๋ฌ ๋ฐฉ๋ฒ
์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ค๋ฉด ํ์ดํ ํจ์ ๋๋ .bind() ์ฌ์ฉ
jsx
๋ณต์ฌํธ์ง
// ๋ฐฉ๋ฒ 1: ํ์ดํ ํจ์ ์ฌ์ฉ
<button onClick={() => handleClick(userId)}>ํด๋ฆญ</button>
// ๋ฐฉ๋ฒ 2: bind ์ฌ์ฉ
<button onClick={handleClick.bind(null, userId)}>ํด๋ฆญ</button>
๐ฅ ์ด๋ฒคํธ ๊ฐ์ฒด(e)
์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์๋ ์ ๋ฌ๋๋ ๊ฐ์ฒด
jsx
๋ณต์ฌํธ์ง
function handleClick(event) {
console.log(event.target); // ํด๋ฆญ๋ DOM ์์
}