본문 바로가기
JavaScript

[JavaScript] ReactJS: Props / React.memo

by busybee-busylife 2024. 10. 24.
반응형

컴포넌트 = 함수

대체로 맞는 말

함수형 컴포넌트는 React에서 가장 기본적인 컴포넌트 유형 중 하나 

React 컴포넌트는 JavaScript 함수처럼 작동 

props를 매개변수로 받아 UI를 반환 

Btn 컴포넌트는 2개의 props를 받음: {text, big} 

App 컴포넌트는 3개의 Btn 컴포넌트를 사용하여 3개의 버튼을 생성 

App 컴포넌트는 Btn 컴포넌트를 재사용하여 여러 버튼을 쉽게 생성할 수 있음 

 


부모 컴포넌트 변경이 자식 컴포넌트에 어떤 영향을 미칠까? 

 : 기본적으로 React는 부모 컴포넌트가 재랜더링(re-rendering)되면 자식 컴보넌트들도 전부 다시 렌더링 


React.memo 

- 이전 props와 새로운 props를 비교하여 동일한 경우 해당 컴포넌트를 다시 렌더링하지 않음

  (해당 컴포넌트는 props가 변경되지 않는 한 재랜더링(re-rendering) 되지 않는다)

 

 

 

1) 처음 렌더링 시, "Save Changes" ,"Continue", "End" 버튼 등장

2) "Save Changes" 버튼을 클릭하면 changeValue 함수가 실행되어 상태 value가 "Revert Changes"로 변경

3) 상태가 변경되면서 첫 번째 MemorizedBtn만 재렌더링되며, 버튼의 텍스트가 "Revert Changes"로 바뀜

4) 나머지 두 버튼은 React.memo 덕분에 재렌더링되지 않음 

 

 

Btn 컴포넌트 

- Btn 컴포넌트는 text와 changeValue라는 두 개의 props를 받아서 버튼을 렌더링

- text: 버튼에 표시되는 텍스트

- changeValue: 클릭 시 실행되는 함수로, 이를 onClick 이벤트 핸들러로 설정

- style 속성으로 버튼에 스타일을 적용

 

 

 

MemorizedBtn 컴포넌트

- Btn 컴포넌트를 React.memo로 감싸기 

- 이렇게 하면 MemorizedBtn은 props가 변경되지 않는 한 재렌더링되지 않음

- React.memo는 Btn 컴포넌트의 props를 비교하여 이전 렌더와 동일한 props를 받으면 컴포넌트를 다시 렌더링하지 않고, 그 결과를 memoization(이전에 계산한 결과를 저장하여 사용. 동일연산 반복x)하여 성능을 최적화

 

 

 

App 컴포넌트

- App 컴포넌트에서는 상태 value를 관리하고 있으며, 기본값은 "Save Changes"

- changeValue 함수는 setValue를 호출하여 상태 value를 "Revert Changes"로 변경

- MemorizedBtn을 여러 번 사용하여 버튼을 렌더링합니다:

    - 첫 번째 MemorizedBtn은 text와 changeValue라는 두 개의 props를 받음: 상태가 변경될 때마다 이 버튼은 재렌더링

    - 두 번째와 세 번째 MemorizedBtn은 각각 "Continue"와 "End"라는 text만 넘겨받고, changeValue는 전달되지 않음

    - 따라서, 해당 버튼들은 클릭 이벤트 없이 단순한 버튼으로 렌더링

 

 


PropTypes

- 우리가 만든 prop에 원치 않는 속성을 잘못 넣어도 syntax error가 아니다 

   ex) <MemorizedBtn text="Continue" /> 에서 text에 숫자를 넣어도 에러가 나지 않음

- 따라서 우리는 우리가 만든 prop에 맞는 유형의 데이터가 입력되도록 제한할 필요가 있음 

- 각 prop에서 요구하는 데이터 유형을 지정하면: 후에 다른 유형의 데이터 입력 시 warning message로 알려줌

- prop-types 라이브러리를 별도로 설치하여 사용 

반응형

'JavaScript' 카테고리의 다른 글

[JavaScript] ReactJS: useEffect  (0) 2024.11.01
[JavaScript] ReactJS: Create React App  (1) 2024.10.25
[JavaScript] ReactJS: STATE(2)  (0) 2024.10.22
[JavaScript] ReactJS: STATE(1)  (0) 2024.10.21
[JavaScript] ReactJS: Basics  (0) 2024.10.21