일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 타입좁히기
- 티스토리꾸미기
- react
- 폰트적용하기
- 반복줄이기
- reactjs
- React Native
- 개발콘텐츠
- 리액트
- click and drag
- TSDoc
- Chart.js
- CSS
- typescript
- const 단언문
- React.js
- 공통컴포넌트
- JS console
- 타입스크립트
- 레이아웃쪼개기
- returnType
- utilty type
- 커스텀
- vue.js
- 2022
- javascript
- 제네릭
- NonNullable
- 누구나 자료구조와 알고리즘
- 성능최적화
- Today
- Total
몽땅뚝딱 개발자
[React] 클래스형 컴포넌트 - Component, PureComponent / shallow-equal 본문
[React] 클래스형 컴포넌트 - Component, PureComponent / shallow-equal
레오나르도 다빈츠 2022. 8. 28. 12:41
◽ Class형 컴포넌트
Class형 컴포넌트에는 Component외 PureComponent가 있다.
◽ 차이점
두 컴포넌트 모두 props와 state의 변경에 따라 render() 함수를 호출하는데, 변경에 대한 기준이 다르다.
1. Component
비교 대상이 완전히 동일하지 않으면 변경이 발생했다고 본다.
setState() 함수로 실행된 값은 이전에 있던 state 변수값과 동일하더라도 컴포넌트에서는 새로운 state 변수가 같은 이름으로 생성됐다고 인식한다.
// 1. Component를 import한다.
import React, { Component } from "react";
// 2. 상속받는다.
class ChildComp extends Component {
// 코드 ...
}
2. PureComponent
비교 대상의 값을 비교해 동일하지 않으면 변경이 발생했다고 본다.
setState() 함수를 실행하여 새로운 state 변수를 선언하더라도 변수값을 비교하여 동일하다면 변경됐다고 간주하지 않는다.
예외적으로 객체에 대해서는 *참조값을 비교한다.
* 참조값: 객체를 생성했을 때 저장되는 메모리 주소로 완전히 동일한 객체라도 새로 선언하면 다른 참조값을 갖게된다.
불필요한 rendor() 함수의 실행을 줄이면 페이지 성능을 향상시킬 수 있다.
// 1. PureComponent를 import한다.
import React, { PureComponent } from "react";
// 2. 상속받는다.
class ChildComp extends PureComponent {
// 코드 ...
}
◽ shallow-equal 패키지
shallow-equal 패키지는 PureComponent에서 state 값의 변경을 비교하는 것과 동일한 기능을 하는 함수이다.
shallowEqualArrays() 함수를 사용하면 문자열과 배열은 값만 비교한다. (객체는 참조 값을 비교)
◽ 설치하기
npm install shallow-equal --save
◽ 사용하기
예제 1. shallowEqualArrays(obj1, obj2...)
componentDidMount() {
const object = { react: 'after LIKE' }
const Array1 = [ '리액트', object ]
const Array2 = [ '리액트', object ]
const Array3 = [ '리액트', { react: 'after LIKE' } ]
console.log(shallowEqualArrays(Array1, Array2)); // true: 같은 참조값이기 떄문
console.log(shallowEqualArrays(Array2, Array3)); // false: 다른 참조값이기 때문
}
예제 2. shallowEqualArrays로 변경여부 감지하기
import React, { Component } from "react";
import { shallowEqualArrays } from "shallow-equal";
class ChildComp extends Component {
constructor(props) {
super(props);
this.state = { stateString: 'After LIKE' }
}
shouldComponentUpdate(nextProps, nextState) {
// 해당 함수로 값만 비교하기때문에 false를 반환하고 render()가 실행되지 않는다.
return !shallowEqualArrays(this.state, nextState)
}
componentDidMount() {
this.setState({ stateString: 'After LIKE' })
}
render() {
return console.log('in render()');
}
}
export default ChildComp
출처
이정열, 초보자를 위한 리액트 200제 (정보문화사, 2021)
'Development > React.js · Next.js' 카테고리의 다른 글
[React] <Fragments> 태그 (0) | 2022.08.28 |
---|---|
[React] 함수형 컴포넌트 (0) | 2022.08.28 |
[React] 클래스형 컴포넌트 - state / state 값 변경하기 / setState() / forceUpdate() (0) | 2022.08.22 |
[React] 클래스형 컴포넌트 - Props / 자료형 선언 / 필수값과 기본값 지정 (0) | 2022.08.20 |
[React] 기본개념 (0) | 2022.05.22 |