์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- CSS
- history api
- ์๋ฐ์คํฌ๋ฆฝํธ
- ํ๋ก๊ทธ๋๋จธ์ค
- fetch API
- ๋ฐ๋ธ์ฝ์ค3๊ธฐ
- ํ๋ก ํธ์๋
- REACT
- float
- useRef
- ๋ธ๋ก๊ทธ
- Gatsby
- ์๊ณ ๋ฆฌ์ฆ
- position
- useEffect
- ์ฝ๋ฉํ ์คํธ
- Props
- ๋ฐ๋ธ์ฝ์ค
- Flex
- Today
- Total
Daehyunii's Dev-blog
classํ ์ปดํฌ๋ํธ - pureComponent ๋ณธ๋ฌธ
classํ ์ปดํฌ๋ํธ - pureComponent
Daehyunii 2022. 12. 16. 13:33PureComponent
shouldComponentUpdate๋ฅผ ๊ตฌํํด ๋์ ์ปดํฌ๋ํธ๋ค.
pureComponent์ ์ฒซ ๋ฒ์งธ ๊ธฐ๋ฅ์ state์ ๋ณ๊ฒฝ์ด ์๋ ๊ฒฝ์ฐ์ ์๋์ผ๋ก true, false๋ฅผ ๊ณ์ฐํ์ฌ ๋ฐํํ๋ค. ์ด๋ฅผ ํตํด state์ ๋ณํ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ๋ฆฌ๋ ๋๋ง ๋๋๋ก ์ต์ ํ ํ ์ ์๋ค. ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
import React, { Component } from "react";
class Test extends Component {
state = {
counter: 0,
};
onClick = () => {
this.setState({});
};
render() {
return (
<div>
<button onClick={this.onClick}>ํด๋ฆญ</button>
</div>
);
}
}
export default Test;
PureComponent๊ฐ ์๋ Component๋ก ํด๋์ค๋ฅผ ํ์ฅํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ, React.Component๋ shouldComponentUpdate๋ฅผ ๋ฐ๋ก ์ค์ ํด์ฃผ์ง ์์ ๊ฒฝ์ฐ, ํญ์ true๋ฅผ ๋ฐํํ๋ค. ์ฆ, setState๊ฐ ์คํ๋๋ฉด state, props์ ๋ณ๊ฒฝ ์ฌ๋ถ๋ฅผ ์ ๊ฒฝ์ฐ์ง ์๊ณ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฐ์ดํธ์ํจ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ถํผ์ํ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๊ฒ ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ผ๋ก shouldComponentUpdate()๋ฅผ ํตํด ์ง์ ์ค์ ํด์ฃผ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง Component ๋์ PureComponent๋ก ํด๋์ค๋ฅผ ํ์ฅํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๋ฆฌ๋ ๋๋ง์ด ๋๊ธฐ ์ ๊ธฐ์กด state์ ๋ฐ๋ state์ ๋ณ๊ฒฝ์ ํ์ธํ์ฌ ๋ณ๊ฒฝ์ด ์๋ ๊ฒฝ์ฐ์๋ง ๋ ๋๋ง๋๊ฒ ํ๋ค. ๋ค์ PureComponent๋ก ํด๋์ค๋ฅผ ํ์ฅํด ๋ณด์.
import React, { PureComponent } from "react";
class Test extends PureComponent {
state = {
counter: 0,
};
onClick = () => {
this.setState({});
};
render() {
return (
<div>
<button onClick={this.onClick}>ํด๋ฆญ</button>
</div>
);
}
}
export default Test;
โ ๏ธ์ฃผ์์ฌํญ
PureComponent๋ก ํด๋์ค๋ฅผ ํ์ฅํ ๊ฒฝ์ฐ์ ์์ํ์ง ๋ชปํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. state์ ๋ณ๊ฒฝ์ ํ์ธํ ๋ ์ฐธ์กฐ ์ ๋ฌ์ด ๋๋ ์๋ฃ๊ตฌ์กฐ์ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
import React, { PureComponent } from "react";
class Test extends PureComponent {
state = {
counter: 0,
array: [],
};
onClick = () => {
const array2 = this.state.array;
array2.push(1);
console.log(this.state);
this.setState({
array: array2,
});
};
render() {
return (
<div>
<button onClick={this.onClick}>ํด๋ฆญ</button>
</div>
);
}
}
export default Test;
๋ฒํผ ํด๋ฆญํ๋ฉด array2์๋ ์ซ์ ๊ฐ 1์ pushํ๊ฒ ๋๊ณ setState๋ฅผ ํตํด array์ ๊ฐ์ array2๋ก ๋ณ๊ฒฝํ๊ฒ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด state์ ์ ๋ณด๊ฐ ๋ฐ๋๊ฒ ๋ ๊ฒ ์๋๊ฐ?? ๋ค์ ์์์ ์ดํด๋ณด์!
state์ ๋ณ๊ฒฝ์ด ์์์๋ ๋ถ๊ตฌํ๊ณ ๋ฆฌ๋ ๋๋ง ๋๊ณ ์์ง ์์ ๊ฒ์ ์ ์ ์๋ค. (๋ฆฌ๋ ๋๋ง ๋๋ ๊ฒฝ์ฐ highlight์ฒ๋ฆฌ๋ฅผ ํตํด ํ๋ฉด์ ๋ณด์ฌ์ง๊ฒ ๋๋ ๋ฆฌ์กํธ ๊ฐ๋ฐ ๋๊ตฌ์ ์ต์ ์ด ์๋ค) ์ด๋ฐ ๊ฒฝ์ฐ์๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋์์์๋ ์ํ๊ฐ ๋ณ๊ฒฝ ๋ ๊ฒ์ PureComponent๋ ์ธ์งํ์ง ๋ชปํ๊ณ ๋ฆฌ๋ ๋๋ง ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ฐธ์กฐ ์ ๋ฌ์ ๊ฒฝ์ฐ์๋ ์ ๊ฐ์ฐ์ฐ์์ ๊ฐ์ ์์ ๋ณต์ฌ๋ฅผ ํตํด ๊ธฐ์กด ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฌถ์ด ํ๋์ ๋ฐ์ดํฐ๋ก ๋ค์ ๋ง๋ค์ด ๊ฐ์ ๊ฐฑ์ ํด์ฃผ์ด์ผ PureComponent๊ฐ state ๋ณ๊ฒฝ์ ์ ์ ์๋ค.
import React, { PureComponent } from "react";
class Test extends PureComponent {
state = {
counter: 0,
array: [],
};
onClick = () => {
const array2 = this.state.array;
array2.push(1);
console.log(this.state);
this.setState({
array: [...this.state.array, array2],
});
};
render() {
return (
<div>
<button onClick={this.onClick}>ํด๋ฆญ</button>
</div>
);
}
}
export default Test;
์์ ๋ณต์ฌ๋ฅผ ํตํด์ array์ ๊ฐ์ ๊ฐฑ์ ํด์ฃผ๋ฉด state์ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ ๋ ๋๋ง๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
pureComponent์ ๋ ๋ฒ์งธ ๊ธฐ๋ฅ์ props์ ๋ณํ๋ฅผ ๊ฐ์งํ์ฌ ๋ฆฌ๋ ๋๋ง ๋๊ฒ ๋ง๋ค์ด ์ฃผ๋ ๊ธฐ๋ฅ์ด ์๋ค. ํ ๊ฐ์ง ์ฃผ์ํด์ผ ํ ์ ์ pureComponent๋ classํ ์ปดํฌ๋ํธ์๋ง ์ ์ฉ์ด ๊ฐ๋ฅํ๋ฐ ํจ์ํ ์ปดํฌ๋ํธ์๋ ์ด์ ๊ฐ์ ๊ธฐ๋ฅ์ ํด์ฃผ๋ ๊ฒ์ด ์๋๋ฐ ๊ทธ๊ฒ์ด ๋ฐ๋ก React.memo์ด๋ค. ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด์. (์ด๋ฒ์๋ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌํด๋ณด๊ฒ ๋ค)
//์์ ์ปดํฌ๋ํธ
import React from "react";
const Try = (props) => {
return (
<li>
<div>{props.value.try}</div>
<div>{props.value.result}</div>
</li>
);
};
Try.displayName = "Try";
//๋จ, memo๋ฅผํ๊ฒ ๋๋ฉด ์ปดํฌ๋ํธ์ ์ด๋ฆ์ด ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ์ ์ด๋ฆ์ ์ ๋๋ก ๋ณ๊ฒฝ์์ผ์ฃผ์ด์ผ ํ๋ค.
export default Try;
๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ฝ๋๊ฐ ๊ธธ์ด ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ฝ๋๋ ์๋ตํ๋๋ก ํ๊ฒ ๋ค! ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ ๋ฐ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํ๊ฒ ๋๋ค. ๊ทธ๋ฐ๋ฐ divํ๊ทธ ๋ด์ ์๋ ๋ฐ์ดํฐ๋ ๊ณ์ ๊ณ ์ ๋ ๊ฐ์์๋ ๋ถ๊ตฌํ๊ณ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ฉด Try ์์ ์ปดํฌ๋ํธ๋ ๋ค์ ๋ฆฌ๋ ๋๋ง๋๊ฒ ๋๋ค. ์ด๋ ๋งค์ฐ ๋นํจ์จ์ ์ด๋ค.(์์์์๋ li์ props ๋ณ๊ฒฝ์ด ์์์๋ ๊ณ์ ๋ฆฌ๋ ๋๋ง ๋๋ค.) ๋ค์ ์์์ ํตํด ํ์ธํด ๋ณด์.
์ด๋ฌํ ๋นํจ์จ์ ์ธ ๋ฆฌ๋ ๋๋ง์ ๋ง๊ธฐ์ํด props๊ฐ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ์๋ง ๋ฆฌ๋ ๋๋ง ๋๋๋ก ๊ณ ์ฐจ ์ปดํฌ๋ํธ์ธ React.memo๋ฅผ ํ์ฉํ ์ ์๋ค.๋ฉ๋ชจ๋ก ๋ํ ๋ ๋, React๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์งํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ ๋๋ง์ด ์ผ์ด๋ ๋ props๊ฐ ๊ฐ๋ค๋ฉด, React๋ ๋ฉ๋ชจ์ด์ง๋ ๋ด์ฉ์ ์ฌ์ฌ์ฉํ๋ค. ๋ค์ ์ ์ฉํด ๋ณด์.
โ๏ธ ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC, Higher Order Component)๋ ์ปดํฌ๋ํธ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ React์ ๊ณ ๊ธ ๊ธฐ์ ์ ๋๋ค. ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)๋ React API์ ์ผ๋ถ๊ฐ ์๋๋ฉฐ, React์ ๊ตฌ์ฑ์ ํน์ฑ์์ ๋์ค๋ ํจํด์ ๋๋ค.
//์์ ์ปดํฌ๋ํธ
import React, {memo} from "react";
const Try = memo((props) => {
return (
<li>
<div>{props.value.try}</div>
<div>{props.value.result}</div>
</li>
);
});
Try.displayName = "Try";
//๋จ, memo๋ฅผํ๊ฒ ๋๋ฉด ์ปดํฌ๋ํธ์ ์ด๋ฆ์ด ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ์ ์ด๋ฆ์ ์ ๋๋ก ๋ณ๊ฒฝ์์ผ์ฃผ์ด์ผ ํ๋ค.
export default Try;
์ด ์ฒ๋ผ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ง์์ฃผ๋ ๊ธฐ๋ฅ๋ค์ ๋ํด์ ์ดํด๋ณด์๋ค! ์ ๋ฆฌํด ๋ณด์๋ฉด React.Component๋ก class๋ฅผ ํ์ฅํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ด ์๋ ๊ฒฝ์ฐ์๋ง ๋ฆฌ๋ ๋๋ง ๋๋๋ก ํด์ค ํ์๊ฐ ์์๋๋ shouldComponentUpdate( )๋ฅผ ํจ๊ป ์ฌ์ฉํ๊ณ , ๊ฐ๋จํ๊ฒ๋ React.PureComponent๋ฅผ ํ์ฉํ ์ ์๊ณ ํจ์ํ ์ปดํฌ๋ํธ์ธ ๊ฒฝ์ฐ์๋ props์ ๋ณ๊ฒฝ์ด ์๋ ๊ฒฝ์ฐ์๋ง ๋ฆฌ๋ ๋๋ง ๋๋๋กํ๋ React.memo๊ธฐ๋ฅ์ด ์๋ค. ์ด๋ฅผ ํตํด ๋ณด๋ค ์ต์ ํ๋ฅผ ์ฉ์ดํ๊ฒ ํ ์ ์์ ๊ฒ์ด๋ค!
'๐ Language & CS knowledge > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JSX๋? (0) | 2022.12.20 |
---|---|
์ปดํฌ๋ํธ ์คํ์ผ๋ง, useMemo, useCallback, Custom Hook (0) | 2022.12.19 |
์ฌ์ฉ์ฌ๋ก - ํ์ด์ง๋ค์ด์ ๋ง๋ค๊ธฐ (0) | 2022.12.18 |
React, useEffect, useRef, props (0) | 2022.12.18 |
classํ ์ปดํฌ๋ํธ - shouldComponentUpdate( ) (0) | 2022.12.15 |