React에서 불필요한 다시 렌더링을 피하는 방법은 무엇입니까?

사용자 14685524

이 질문이 여러 번 요청되었다는 것을 알고 있지만 상태가 변경 될 때 반응 렌더링 결정의 논리를 이해하고 "반응식"으로 올바르게 작성하는 방법을 이해하려고합니다.

이것은 내 코드입니다.

// Parent.js

import React, { useEffect, useState } from "react";
import ComponentA from "./ComponentA";
import ComponentB from "./ComponentB";

export default function App() {
  const [a, setA] = useState(false);
  const [b, setB] = useState(false);

  const onClickA = () => {
    setA((p) => !p);
  };

  const onClickB = () => {
    setB((p) => !p);
  };

  useEffect(() => {
    console.log("Parent rendered");
  });
  return (
    <div>
      <ComponentA value={a} onClick={onClickA} />
      <ComponentB value={b} onClick={onClickB} />
    </div>
  );
}
// Child A

import React, { useEffect } from "react";

export default function ComponentA(props) {
  useEffect(() => {
    console.log("A rendered");
  });

  return (
    <button onClick={props.onClick}>Button A - {props.value.toString()}</button>
  );
}
// Child B

import React, { useEffect } from "react";

export default function ComponentB(props) {
  useEffect(() => {
    console.log("B rendered");
  });

  return (
    <button onClick={props.onClick}>Button B - {props.value.toString()}</button>
  );
}

따라서 버튼 A 또는 버튼 B를 클릭하면 상위 구성 요소가 다시 렌더링되어 각각의 UI가 서로의 상태와 관련이없는 경우에도 ComponentA와 ComponentB가 다시 렌더링됩니다. 나는 버튼 A를 클릭하면 a상태 변수 변경 <ComponentB />되고 a상태에 의존하지 않으므로 변경 되지 않은 상태로 props남아 있기 때문에 다시 렌더링 할 필요가 없다는 반응을 이해할 것이라고 생각 했습니다 . 그래서 저는이 코드가 틀렸고 다른 스타일로 작성해야한다고 생각하지만 이것을 알아낼 수 없습니다.

분명히 a영향을 미치지 않고 영향 <ComponentB />b미치지 않기 <ComponentA />때문에 각 구성 요소에 개별적으로 상태를 전달하지 않는 이유는 무엇입니까? 이렇게하면 각 구성 요소가 자체적으로 다시 렌더링 할 책임이 있습니다. 하지만 미래 ComponentA에에 의존 b하거나 ComponentB의존 한다면 a어떨까요? 상태를 공유하고 콜백 함수를 작성하고 상태를 props로 변환하고 그 반대로 변환 할 때마다 코드를 변경할 수 없습니다.

너무 많은 오버 헤드 코드 (예 : redux)없이 이러한 종류의 유연성을 제공하는 더 좋은 방법이 있습니까?

프라이

이것이 반응의 핵심 개념입니다. 구성 요소가 다시 렌더링되면 기본적으로 모든 하위 항목이 다시 렌더링됩니다. 렌더링 함수에서 값 비싼 계산을하지 않는 한 일반적으로 매우 빠르기 때문에 문제가되지 않습니다.

이스케이프 해치 React.memoshouldComponentUpdate클래스 수명주기 기능이 있지만 일반적으로 필요하지 않아야하며 조기 최적화는 유용하기보다 훨씬 더 해 롭습니다.

성능 문제가있는 경우이를 측정 한 다음 거기에서 발견 한 문제를 최적화하십시오. 그렇지 않으면 너무 많이 rerenders 땀을 흘리지 마십시오.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

useRef를 사용하여 반응에서 다시 렌더링을 피하는 방법은 무엇입니까?

분류에서Dev

React Native에서 API 호출을 사용하지 않고 구성 요소를 다시 렌더링하는 방법은 무엇입니까?

분류에서Dev

ReactJS-양식에서 다른 선택을 클릭 한 후 구성 요소를 다시 렌더링하는 방법은 무엇입니까?

분류에서Dev

원본 데이터를 다시 포맷 한 다음 Rails 4에서 중첩 된 JSON 요청을 렌더링하는 방법은 무엇입니까?

분류에서Dev

불필요한 GET을 피하고 서블릿을 통해 파일을 얻는 방법은 무엇입니까?

분류에서Dev

ReactJS에서 모델 변경시 다시 렌더링을 트리거하는 방법은 무엇입니까?

분류에서Dev

react native : 상태 변경시 하위 구성 요소 다시 렌더링을 중지하는 방법은 무엇입니까?

분류에서Dev

다른 get 요청에서 동일한 페이지를 렌더링하는 방법은 무엇입니까?

분류에서Dev

활성 탐색 링크에서 마우스 오버시 불필요한 추가 밑줄을 제거하는 방법은 무엇입니까?

분류에서Dev

메인 화면에서 렌더링 창을 다시 가져 오는 방법은 무엇입니까?

분류에서Dev

React 컴포넌트 내에서 삭제 된 하위 DOM 요소를 다시 렌더링하는 방법은 무엇입니까?

분류에서Dev

React에서 컴포넌트를 다시 렌더링하지 않는 방법은 무엇입니까?

분류에서Dev

부모의 상태가 변경 될 때 React에서 자식 구성 요소를 업데이트 (다시 렌더링)하는 방법은 무엇입니까?

분류에서Dev

React에서 API 데이터를 한 번만 요청하고 방문 할 때마다 페이지를 렌더링하지 않는 방법은 무엇입니까?

분류에서Dev

Blazor에서 버튼 클릭시 구성 요소를 렌더링하는 방법은 무엇입니까?

분류에서Dev

Composer가 예기치 않은 폴리 필을 설치합니다. 불필요한 경우 설치를 피하는 방법은 무엇입니까?

분류에서Dev

OutLook은 불필요한 공간을 렌더링합니다

분류에서Dev

Ruby on Rails에서 다양한 계정 유형에 대해 다른 양식을 렌더링하는 방법은 무엇입니까?

분류에서Dev

Nuxt.js에서 페이지를 다시 방문 할 때 구성 요소를 다시 렌더링하지 않는 방법은 무엇입니까?

분류에서Dev

Angularjs 지시문에서 HTML을 렌더링하는 방법은 무엇입니까?

분류에서Dev

Linux에서 프레임 버퍼의 렌더링 시간을 측정하는 방법은 무엇입니까?

분류에서Dev

Java에서 Microsoft Bot Framework로 마크 다운을 렌더링하는 방법은 무엇입니까?

분류에서Dev

코드 청크 내부에서 마크 다운을 렌더링하는 방법은 무엇입니까?

분류에서Dev

다른 HTML 페이지에서 HTML 부분을 렌더링하는 방법은 무엇입니까?

분류에서Dev

smarty 템플릿을 db에 저장 한 다음 yii2의 컨트롤러에서 렌더링하는 방법은 무엇입니까?

분류에서Dev

반응에서 루트 요소 내부의 모달을 렌더링하는 방법은 무엇입니까?

분류에서Dev

배열의 객체를 React의 다른 구성 요소로 렌더링하는 방법은 무엇입니까?

분류에서Dev

JQ를 사용하여 JSON에서 불필요한 항목을 제거하는 방법은 무엇입니까?

분류에서Dev

렌더링 메서드 내에서 구성 요소를 렌더링하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    useRef를 사용하여 반응에서 다시 렌더링을 피하는 방법은 무엇입니까?

  2. 2

    React Native에서 API 호출을 사용하지 않고 구성 요소를 다시 렌더링하는 방법은 무엇입니까?

  3. 3

    ReactJS-양식에서 다른 선택을 클릭 한 후 구성 요소를 다시 렌더링하는 방법은 무엇입니까?

  4. 4

    원본 데이터를 다시 포맷 한 다음 Rails 4에서 중첩 된 JSON 요청을 렌더링하는 방법은 무엇입니까?

  5. 5

    불필요한 GET을 피하고 서블릿을 통해 파일을 얻는 방법은 무엇입니까?

  6. 6

    ReactJS에서 모델 변경시 다시 렌더링을 트리거하는 방법은 무엇입니까?

  7. 7

    react native : 상태 변경시 하위 구성 요소 다시 렌더링을 중지하는 방법은 무엇입니까?

  8. 8

    다른 get 요청에서 동일한 페이지를 렌더링하는 방법은 무엇입니까?

  9. 9

    활성 탐색 링크에서 마우스 오버시 불필요한 추가 밑줄을 제거하는 방법은 무엇입니까?

  10. 10

    메인 화면에서 렌더링 창을 다시 가져 오는 방법은 무엇입니까?

  11. 11

    React 컴포넌트 내에서 삭제 된 하위 DOM 요소를 다시 렌더링하는 방법은 무엇입니까?

  12. 12

    React에서 컴포넌트를 다시 렌더링하지 않는 방법은 무엇입니까?

  13. 13

    부모의 상태가 변경 될 때 React에서 자식 구성 요소를 업데이트 (다시 렌더링)하는 방법은 무엇입니까?

  14. 14

    React에서 API 데이터를 한 번만 요청하고 방문 할 때마다 페이지를 렌더링하지 않는 방법은 무엇입니까?

  15. 15

    Blazor에서 버튼 클릭시 구성 요소를 렌더링하는 방법은 무엇입니까?

  16. 16

    Composer가 예기치 않은 폴리 필을 설치합니다. 불필요한 경우 설치를 피하는 방법은 무엇입니까?

  17. 17

    OutLook은 불필요한 공간을 렌더링합니다

  18. 18

    Ruby on Rails에서 다양한 계정 유형에 대해 다른 양식을 렌더링하는 방법은 무엇입니까?

  19. 19

    Nuxt.js에서 페이지를 다시 방문 할 때 구성 요소를 다시 렌더링하지 않는 방법은 무엇입니까?

  20. 20

    Angularjs 지시문에서 HTML을 렌더링하는 방법은 무엇입니까?

  21. 21

    Linux에서 프레임 버퍼의 렌더링 시간을 측정하는 방법은 무엇입니까?

  22. 22

    Java에서 Microsoft Bot Framework로 마크 다운을 렌더링하는 방법은 무엇입니까?

  23. 23

    코드 청크 내부에서 마크 다운을 렌더링하는 방법은 무엇입니까?

  24. 24

    다른 HTML 페이지에서 HTML 부분을 렌더링하는 방법은 무엇입니까?

  25. 25

    smarty 템플릿을 db에 저장 한 다음 yii2의 컨트롤러에서 렌더링하는 방법은 무엇입니까?

  26. 26

    반응에서 루트 요소 내부의 모달을 렌더링하는 방법은 무엇입니까?

  27. 27

    배열의 객체를 React의 다른 구성 요소로 렌더링하는 방법은 무엇입니까?

  28. 28

    JQ를 사용하여 JSON에서 불필요한 항목을 제거하는 방법은 무엇입니까?

  29. 29

    렌더링 메서드 내에서 구성 요소를 렌더링하는 방법은 무엇입니까?

뜨겁다태그

보관