๐ง React Hooks๋?
ํจ์ํ ์ปดํฌ๋ํธ์์ state ๊ด๋ฆฌ์ Life Cycle์ ๋ค๋ฃฐ ์ ์๊ฒ ํ๋ ๊ธฐ์ ์ด๋ค.
๐งHooks์ ๋์ ์ด์ ?
ํด๋์คํ ์ปดํฌ๋ํธ์์ ๋ฐ์ํ๋ ๋ช๋ช ๋ถํธํ ์ ๋ค์ ๊ทน๋ณตํ๊ธฐ ์ํด
- this ๊ฐ์ ๋ณ๊ฒฝ
- ๋จ์ด์ง๋ ๊ฐ๋ ์ฑ
- HOCํจํด์ Wrapper ์ง์ฅ
๐งHook์ ๊ท์น
์ต์์(at the Top Level)์์๋ง Hook์ ํธ์ถํด์ผ ํ๋ค.
- ๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ ๋๋ ์ค์ฒฉ๋ ํจ์ ๋ด์์ Hook์ ํธ์ถํด์๋ ์ ๋๋ค.
- ๋ชจ๋ ๋ ๋๋ง์์ ๋์ผํ ์์๋ก Hook์ ํธ์ถํด์ผ ํ๋ค.
์ค์ง React ํจ์ ๋ด์์ Hook์ ํธ์ถํด์ผ ํ๋ค.
- ์ผ๋ฐ์ ์ธ JavaScript ํจ์์์ ํธ์ถํด์๋ ์ ๋๋ค.
- React ํจ์ ์ปดํฌ๋ํธ์์ Hook์ ํธ์ถํด์ผ ํ๋ค.
Hook ์ด๋?
- 2018๋ React Conferences์์ ์ฒ์ ์๊ฐ๋์ด React v16.8์ ๋์ ๋ ๊ธฐ์
- ํจ์ ์ปดํฌ๋ํธ์์ React ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ JavaScript ํจ์
- ํด๋์ค๋ฅผ ์์ฑํ ํ์ ์์ด ํจ์ ์ปดํฌ๋ํธ์์ state ๊ด๋ฆฌ์ Life Cycle์ ๋ค๋ฃฐ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ์
- Hook์ ์ข
๋ฅ
- useState()
- useEffect()
- useMemo()
- useRef()
- useCallback()
- …
Hook์ ๊ท์น
์ต์์(at the Top Level)์์๋ง Hook์ ํธ์ถํด์ผ ํ๋ค.
- ๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ ๋๋ ์ค์ฒฉ๋ ํจ์ ๋ด์์ Hook์ ํธ์ถํด์๋ ์ ๋๋ค.
- Hook ํธ์ถ ์์๊ฐ ์ปดํฌ๋ํธ์ ๋ ๋๋ง ์์์ ์ผ์นํ๋ค๊ณ ๊ฐ์ ํ๋ค.
- ๋ฐ๋ผ์ ๋ชจ๋ ๋ ๋๋ง์์ ๋์ผํ ์์๋ก Hook์ ํธ์ถํด์ผ ํ๋ค.
๋ง์ฝ ์กฐ๊ฑด๋ฌธ์ด๋ ๋ฐ๋ณต๋ฌธ์์์ ํ ์ ํธ์ถํ๋ค๋ฉด Hook์ด ์ด๋ค ์กฐ๊ฑด์ ๋ฐ๋ผ ์คํ๋์ง ์์ ์ ์๋ค.- ๋ ๋๋ง ๋๋ง๋ค ๋งจ ์ฒ์ ํจ์๊ฐ ์คํ๋ ๋ ๋ฆฌ์กํธ๊ฐ ๊ธฐ์ตํด ๋์ Hook์ ํธ์ถ ์์๊ฐ ๋ค๋ฅด๊ฒ ์คํ๋ ๊ฒ์ด๊ณ ๊ฒฐ๊ตญ ๋ฒ๊ทธ๋ฅผ ์ด๋ํ๋ค.
- ์ด๋ ํญ์ ๋ฆฌ์กํธ ํจ์ ์ต์์ ๋ ๋ฒจ์์๋ง ํ ์ ํธ์ถํด์ผ ํ๋ ์ด์ ์ด๋ค.
- ๋ฆฌ์กํธ๋ ์ด Hook๋ค์ ํธ์ถ๋๋ ์์๋๋ก ์ ์ฅํด ๋๋๋ค.(=LinkedList)
- ๊ทธ๋์ ๋งค ๋ ๋๋ง๋ง๋ค ์์๋๋ก ํ ์ ํธ์ถํ ์ ์๋ ๊ฒ์ด๋ค.
์ค์ง React ํจ์ ๋ด์์ Hook์ ํธ์ถํด์ผ ํ๋ค.
- ์ผ๋ฐ์ ์ธ JavaScript ํจ์์์ ํธ์ถํด์๋ ์ ๋๋ค.
- React ํจ์ ์ปดํฌ๋ํธ์์ Hook์ ํธ์ถํด์ผ ํ๋ค.
- ์ปค์คํ Hook์ 'use'๋ก ์์ํด์ผ ํ๋ค.
์๋ชป๋ ์
๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ ๋๋ ์ค์ฒฉ๋ ํจ์ ๋ด์์ Hook์ ํธ์ถํด์๋ ์ ๋๋ค.
import React, { useState, useEffect } from 'react';
function BadCounter() {
const [count, setCount] = useState(0);
// ์กฐ๊ฑด๋ฌธ ์์์ useEffect๋ฅผ ํธ์ถํ๋ ๋์ ์์
if (count === 5) {
useEffect(() => {
alert('Count reached 5!');
}, []);
}
const increment = () => {
setCount(prevCount => prevCount + 1);
};
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
</div>
);
}
export default BadCounter;
- if ๋ฌธ ๋ด์์ ์กฐ๊ฑด์ ๋ฐ๋ผ useEffect๋ฅผ ํธ์ถํ๊ณ ์๋ค. React Hook ๊ท์น์ ์๋ฐํ๋ ๋ถ๋ถ์ด๋ค.
- useEffect๋ ํญ์ ์ปดํฌ๋ํธ์ ์ต์์ ๋ ๋ฒจ์์ ํธ์ถ๋์ด์ผ ํ๊ณ , ์กฐ๊ฑด๋ฌธ ์์์ ํธ์ถํด์๋ ์ ๋๋ค.
- ์ด๋ฌํ ์ฝ๋๋ ์๊ธฐ์น ์์ ๋์์ ์ ๋ฐํ ์ ์๊ณ , React์ ์ต์ ํ๋ฅผ ๋ฐฉํดํ๋ค.
- count === 5๊ฐ ์๋ ๊ฒฝ์ฐ useEfffect์ ๊ฑด๋๋ฐ๊ฒ ๋๋ฉด์ Hook์ ํธ์ถ ์์๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋๋ค.
์ณ์ ์
import React, { useState, useEffect } from 'react';
function GoodCounter() {
const [count, setCount] = useState(0);
useEffect(() => {
// count๊ฐ 5๊ฐ ๋๋ฉด alert์ ํ์ํฉ๋๋ค.
if (count === 5) {
alert('Count reached 5!');
}
}, [count]); // count๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ์คํ๋ฉ๋๋ค.
const increment = () => {
setCount(prevCount => prevCount + 1);
};
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
</div>
);
}
export default GoodCounter;
- useState ํ ๊ณผ useEffect ํ ์ ์ปดํฌ๋ํธ ํจ์์ ์ต์์ ๋ ๋ฒจ์์ ํธ์ถ๋์๋ค.
- Hook ํธ์ถ์ด ํญ์ ๋์ผํ ์์น์ ์์ด์ React๊ฐ ์์ธก ๊ฐ๋ฅํ ๋์์ ์ํํ ์ ์๋ค.
๊ท์น์ ๊ฐ์ ํ๋ ํ๋ก๊ทธ์ธ
eslint-plugin-react-hooks
์ด ํ๋ฌ๊ทธ์ธ์ Create React App์ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋์ด ์๋ค.
npm install eslint-plugin-react-hooks --save-dev
// ESLint ์ค์ ํ์ผ
{
"plugins": [
// ...
"react-hooks"
],
"rules": {
// ...
"react-hooks/rules-of-hooks": "error", // Checks rules of Hooks
"react-hooks/exhaustive-deps": "warn" // Checks effect dependencies
}
}
Hooks๋ ์ ๋์ ๋์์๊น?
<Class /> ๊ธฐ์กด์ ๋ฆฌ์กํธ๋ ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ ํ๋ค.
๋น์ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ์กด์ฌํ์ง๋ง ํด๋์ค ์ปดํฌ๋ํธ์ ๋นํด ๊ธฐ๋ฅ์ด ์ ์๋ค.
ํด๋์ค ์ปดํฌ๋ํธ์ ๋จ์
this
- this๋ ํด๋์ค ์์ ์ ๊ฐ๋ฆฌํด
- this๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์๊ณ ๋ณ๊ฒฝ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์
- ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ฉด์ this๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ด ๋ณ๊ฒฝ๋์ด ๊ณ ์ ๋์ง ์๋ this๋ก ์ธํด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๋ค.
์ฌ์ฌ์ฉ์ฑ
- ํด๋์ค ์ปดํฌ๋ํธ์์ ์ํ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ฝ์ง ์๋ค.
- HOC ํจํด๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ์ง๋ง ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- HOC๋ผ๋ ๊ณ ์ฐจ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์์ง๋ง Wrapper ์ง์ฅ์ด๋ผ๋ ์ปค๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค.
๋จ์ด์ง๋ ๊ฐ๋ ์ฑ
์ด๊ธฐ๊ฐ์ด 0์ธ count ์ํ๋ฅผ ์ ์ธํ๊ณ , ๋ฒํผ์ ๋๋ฅด๋ฉด count + 1 ๋๋ ๊ฐ๋จํ ๋ก์ง์ ๊ฐ์ง๊ณ ์๋ ์ปดํฌ๋ํธ
ํด๋์คํ ์ปดํฌ๋ํธ
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0,
}
}
handleClick() {
this.setState({ count: this.state.count + 1});
}
render() {
return {
<div>
<p>Count: {this.state.count}</p>
<button onClick={this.handleClick.bind(this)}>Click me</button>
</div>
}
}
}
ํด๋์คํ ์ปดํฌ๋ํธ ์ฝ๋๋ฅผ ํจ์ํ ์ปดํฌ๋ํธ๋ก ๋ณ๊ฒฝํ๋ฉด ์๋์ ๊ฐ๋ค.
ํจ์ํ ์ปดํฌ๋ํธ
const Example = () => {
const [count, setCount] = React.useState(0);
const handleClick = () => {
setCount(count + 1);
}
return {
<div>
<p>Count: {count}</p>
<button onClick={handleClick}>Click me</button>
</div>
}
}
- ํด๋์คํ ์ปดํฌ๋ํธ์ ๋นํด ๊ฐ๋จํ ์ฝ๋๋ก ์์ฑํ ์ ์๋ค.
- Hook์ ์ฌ์ฉํด์ ์ํ์ ์ํ ๋ณ๊ฒฝ ํจ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ธํ ์ ์๋ค.
- ํด๋์คํ ์ปดํฌ๋ํธ์์ ํ์์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ this์ ๋ฌธ์ ๋ก๋ถํฐ ํด๋ฐฉ๋ ๋ชจ์ต๋ ๋ณผ ์ ์๋ค.
HOC(Higher Order Component)๋?
- Higher Order Component (๊ณ ์ฐจ ์ปดํฌ๋ํธ)
- ํ๋ฉด์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ก์ง์ ๋ถ๋ฆฌํด์ ์ปดํฌ๋ํธ๋ก ๋ง๋ค๊ณ , ์ฌ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ ๋ถ๋ถ์ parameter๋ก ๋ฐ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
// ์ฌ์ฉ์์ ๋์ด ์ ๋ณด ํ์ด์ง
class UserProfile extends React.Component {
state = {
users: [],
};
componentDidMount() {
fetchUsers().then((users) => {
this.setState({ users });
});
}
render() {
const { users } = this.state;
return (
<div>
{users.map(({ name, job }) => (
<div key={name}>
<p>{name}: {job}</<p>
</div>
))}
</div>
);
}
}
// ์ฌ์ฉ์์ ์ง์
์ ๋ณด ํ์ด์ง
class UserJobPage extends React.Component {
state = {
users: [],
};
componentDidMount() {
fetchUsers().then((users) => {
this.setState({ users });
});
}
render() {
const { users } = this.state;
return (
<div>
<p>์ฌ์ฉ์์ ์ง์
ํ์ด์ง</p>
{users.map(({ name, job }) => (
<div key={name}>
<p>{name}: {job}</p>
</div>
))}
</div>
);
}
}
- ๋ ์ปดํฌ๋ํธ๋ ๋ ๋๋ง ํ๋ ๋ก์ง๋ง ์กฐ๊ธ ๋ค๋ฅด๊ณ , ์ ์ ์ ๋ณด๋ฅผ fetch ํด์์ ์ํ๋ก ์ ์ฅํ๋ ๋ก์ง์ ๋์ผํ๋ค.
// ์ ์ fetching ๋ก์ง์ ์ํํ๋ HOC
function usersHOC(Component) {
return class extends React.Component {
state = {
users: []
};
componentDidMount() {
fetchUsers().then((users) => {
this.setState({ users });
});
}
render() {
return <Component {...this.props} {...this.state} />;
}
};
}
- ์ค๋ณต๋ ์ ์ fetching ๋ก์ง์ ๋ฐ๋ก ๋ถ๋ฆฌํด์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ธฐ
- usersHOC๋ผ๋ ๊ณ ์ฐจ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์๋ค.
- ๋ ํ์ด์ง ์ปดํฌ๋ํธ์์ ๊ฐ์ง๊ณ ์๋ ์ ์ fetching ๋ก์ง์ usersHOC ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌ
function usersHOC(Component) { // ์ธ์๋ก ์ปดํฌ๋ํธ ์ ๋ฌ
return class extends React.Component {
state = {
users: []
};
componentDidMount() {
fetchUsers().then((users) => {
this.setState({ users })
});
}
render() {
return <Component {...this.props} {...this.state} />; <!-- ์ปดํฌ๋ํธ์ props๋ก ์ ์ state ์ ๋ฌ -->
}
};
}
- usersHOC ์ปดํฌ๋ํธ๋ ์ ์ fetching ๋ก์ง์ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ฅผ ์ธ์๋ก ๋ฐ๊ณ ,
- ์ธ์๋ก ๋ฐ์ ์ปดํฌ๋ํธ์ users state๋ฅผ ๋๊ฒจ์ค๋ค.
// ๊ฐ ํ์ด์ง ์ปดํฌ๋ํธ๋ usersHOC๋ฅผ ๊ฐ์ธ์ ์ฌ์ฉํ๋ค.
function UserAgePage({ users }) {
// ... ์ฌ๊ธฐ์ UserAgePage ์ปดํฌ๋ํธ์ ๋ก์ง์ด ํฌํจ๋ฉ๋๋ค ...
}
export default usersHOC(UserAgePage);
// ๊ฐ ํ์ด์ง ์ปดํฌ๋ํธ๋ usersHOC๋ฅผ ๊ฐ์ธ์ ์ฌ์ฉํ๋ค.
function UserJobPage({ users }) {
// ... ์ฌ๊ธฐ์ UserJobPage ์ปดํฌ๋ํธ์ ๋ก์ง์ด ํฌํจ๋ฉ๋๋ค ...
}
export default usersHOC(UserJobPage);
- ๊ฐ ํ์ด์ง ์ปดํฌ๋ํธ์๋ usersHOC ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๋ฉด ์ ์ ํ์นญ ๋ก์ง์ ์ฌ์ฉํ ์ ์๋ค.
HOC ํจํด์ ๋ฌธ์ ์ : Wrapper ์ง์ฅ
HOC ํจํด์ ํด๋์ค ์ปดํฌ๋ํธ์์ ์ฌ์ฌ์ฉ์ฑ์ ์ํด ์ถ์ฒ๋๋ ํจํด์ด์๋ค. ๊ทธ๋ฌ๋ HOC ํจํด์๋ Wrapper ์ง์ฅ์ด๋ผ๋ ์ปค๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค.
<ThemeHOC>
<UserHOC>
<AuthHOC>
<MyComponent />
</AuthHOC>
</UserHOC>
</ThemeHOC>
MyComponent์ ํ ๋ง ๋ก์ง, ์ ์ ๊ด๋ จ ๋ก์ง, ์ธ์ฆ ๋ก์ง์ ์ ์ฉํ๊ธฐ ์ํด ๊ฐ ๊ณ ์ฐจ์ปดํฌ๋ํธ๋ค์ ๊ฐ์ธ์คฌ๋ค. ์ด๋ ๊ฒ ๊ณ ์ฐจ ์ปดํฌ๋ํธ๋ฅผ ๊ณ์ํด์ ๊ฐ์ธ๋ฉด ์ปดํฌ๋ํธ์ depth๊ฐ ์์ฒญ ๊น์ด์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๋ฐ, ์ด๋ฅผ Wrapper ์ง์ฅ์ด๋ผ๊ณ ํ๋ค.
Hook์ Life Cycle
Hooks๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด ์๋ช ์ฃผ๊ธฐ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด ๋ง์ด ๋ณํ๊ฒ ๋๋ค.
- Mount : ์ฒ์ ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋๊ณ ๋ ๋๋ง์ ๊ฑฐ์น๋ ๊ณผ์ ์ ์๋ฏธ
- ํด๋์ค ์ปดํฌ๋ํธ์์๋ componentDidMount() ํจ์๋ฅผ ์คํ
- Update : props ํน์ state๊ฐ ๋ณ๊ฒฝ๋์์ ๋, forceUpdate() ํจ์๊ฐ ์คํ๋์์ ๋ ๋ฆฌ๋ ๋๋ง ํ๋ ๊ณผ์ ์ ์๋ฏธ
- ํด๋์ค ์ปดํฌ๋ํธ์์๋ componentDidUpdate() ํจ์๋ฅผ ์คํ
- Unmount : ์ปดํฌ๋ํธ๊ฐ ์ข
๋ฃ๋๋ ๊ณผ์ ์ ์๋ฏธ
- ํด๋์ค ์ปดํฌ๋ํธ์์๋ componentWillUnmount() ํจ์๋ฅผ ์คํ
Hooks๊ฐ ๋ฑ์ฅํ ์ดํ๋ถํฐ๋ ์์ ๋งํ ํด๋์คํ ์ปดํฌ๋ํธ์ ๋ํ์ ์ธ ์๋ช ์ฃผ๊ธฐ ํจ์ ์ธ ๊ฐ์ง๋ฅผ useEffect() ํจ์ ํ๋๋ก ๋ชจ๋ ์ปค๋ฒํ ์ ์๊ฒ ๋์๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ
componentDidMount() {
this.updateList(this.props.id);
}
componentDidUpdate() {
if(prevProps.id === this.props.id) return;
this.updateList(this.props.id);
}
Mount ๋ ๋ updateList() ํจ์๋ฅผ ์คํํ๊ณ , ๋ props id๊ฐ ์ ๋ฐ์ดํธ๋ ๋ updateList() ํจ์๋ฅผ ์คํํ๋ ํด๋์คํ ์ปดํฌ๋ํธ์ ์ฝ๋
Hooks๋ฅผ ์ฌ์ฉํ ํจ์ํ ์ปดํฌ๋ํธ
useEffect(() => {
updateList(id);
}, [id]);
useEffect() ํ ํ๋๋ก ๋ ๊ฐ์ง ๋ผ์ดํ ์ฌ์ดํด ํจ์์ ๊ธฐ๋ฅ์ ์์ฃผ ๊ฐ๋จํ๊ฒ ์์ฑํ ์ ์๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ
componentDidMount() {
document.body.style.overflow = 'hidden';
}
conponentWillUnmount() {
document.body.style.removeProperty('overflow');
}
์ปดํฌ๋ํธ๊ฐ Mount ๋ ๋ ์คํฌ๋กค ๋ฐฉ์ง ์คํ์ผ์ ์ถ๊ฐํ๊ณ , Unmount ๋ ๋ ์คํฌ๋กค ๋ฐฉ์ง ์คํ์ผ์ ๋ค์ ์์ ์ฃผ๋ ์ฝ๋์ด๋ค.
Hooks๋ฅผ ์ฌ์ฉํ ํจ์ํ ์ปดํฌ๋ํธ
useEffect(()=> {
document.body.style.overflow = "hidden";
return () => document.body.style.removeProperty("overflow");
}, []);
useEffect() ํจ์ ํ๋ ๋ด์์ Mount, Unmount ๋ ๊ฐ์ง ์๋ช ์ฃผ๊ธฐ์ ๋ํ ๋ก์ง์ ์์ฑํ ์ ์๊ฒ ๋์๋ค.
Custom Hook
Custom Hook์ด๋ useState, useEffect์ ๊ฐ์ด ๋ฆฌ์กํธ์์ ์ ๊ณตํ๋ Hook๋ค์ ์ด์ฉํด ๊ฐ๋ฐ์๊ฐ ์ง์ ๋ง๋๋ Hook์ ์๋ฏธํ๋ค.
์ํ ๊ด๋ฆฌ๋ ์๋ช ์ฃผ๊ธฐ ๋ก์ง๋ค์ ์ถ์ํํ์ฌ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ๋ง๋๋ ํจ์๋ฅผ ๋ปํ๋ค.
HOCํจํด์ผ๋ก ๋ง๋ ์ ์ fetching ๋ก์ง์ Custom Hook์ผ๋ก ๋ง๋ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
const useFetchUser = () => {
const [users, setUsers] = useState([]);
useEffect(()=> {
fetchUsers().then((users) => {
setUsers(users);
});
}, []);
return { users };
}
- usersHOC ์ปดํฌ๋ํธ๋ณด๋ค๋ ํจ์ฌ ๊ฐ๋จํ๊ณ ์ฝ๊ธฐ ์ฝ๋ค.
- users๋ผ๋ ์ํ๋ฅผ ์ ์ธํ๊ณ , useEffect๋ฅผ ์ฌ์ฉํด ์ฒ์ ๋ง์ดํธ ๋ ๋ fetchUsers ๋ก์ง์ ์ํํ๋ค.
const UserAgePage = () => {
const { users } = useFetchUser();
return(
...
- useFetchUser ํจ์๋ฅผ ํธ์ถํ๋ ๋จ ํ ์ค๋ง ์ถ๊ฐํด ์ฃผ๋ฉด ์ฝ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- Wrapper ์ง์ฅ๊ฐ์ด ๊ณจ์น ์ํ ๋ฌธ์ ๋ ๋ฐ์ํ์ง ์๋๋ค.
'Frontend > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React Router: push์ replace์ ์ฐจ์ด์ (0) | 2024.10.15 |
---|---|
React Hook Form์ handleSubmit์ผ๋ก ํผ ์ ์ถ ์ ํ์ด์ง ๋ฆฌ๋ ๋๋ง ๋ฐฉ์งํ๊ธฐ (0) | 2024.09.26 |
React Router v6 (0) | 2024.09.26 |
React์์ ๋ ๋๋ง์ด ๋ฐ์ํ๋ ์กฐ๊ฑด๊ณผ ๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ๋ฒ (0) | 2024.05.09 |
๋ฆฌ์กํธ๋ฒ์ 18๋ถํฐ ๋ฑ์ฅํ๋ Batching ๊ฐ๋ (0) | 2024.05.03 |