후크가있는 컴포넌트에서 불필요한 렌더링을 방지하는 방법

user12465675

안녕하세요 저는 감정 제공자 테마의 두 가지 테마를 가진 테마 제공자를 가지고 있습니다.

useTheme를 통해이 테마를 얻는 구성 요소 Header가 있습니다.

const Header = () => {
  const Theme = useTheme();
  const [text, setText] = useState('');
  console.log(Theme, 'this is header');
  const handleClick = () => {
    setText('');
  };
  return (
    <Container theme={Theme}>
      <Content theme={Theme} flexdirection={'column'}>
        <textarea
          onKeyPress={e => {
            if (e.key === 'Enter') {
              e.preventDefault();
            }
            if (e.key === 'Enter') {
              handleClick();
            }
          }}
          value={text}
          onChange={e => setText(e.target.value)}
          placeholder="Digite aqui sua mensagem"
        />
        <Top theme={Theme} />
        <NavBar theme={Theme} />
      </Content>
    </Container>
  );
};

그런 다음 내 테마를 어린이를위한 소품으로 전달합니다.

const NavBar = props => {
  console.log(props.theme, 'this is nav bar');
  return (
    <Nav>
      <ul>
        <li>
          <a href="#home">home</a>
        </li>
        <li>
          <a href="#homex">test</a>
        </li>
        <li>
          <a href="#homexv">test</a>
        </li>
      </ul>
    </Nav>
  );
};

그러나이 구성 요소에는 입력 할 때 렌더링 할 텍스트 필드가 있지만 내 테마는 gif에서와 같이 함께 렌더링됩니다.

여기에 이미지 설명 입력

테마를 제어하는 ​​방법은 다음과 같습니다.

export default function useAppTheme(defaultTheme = lightTheme) {
  const [theme, _setTheme] = useState(getInitialTheme);

  function getInitialTheme() {
    const savedTheme = localStorage.getItem('theme');
    if (savedTheme === 'dark' || savedTheme === 'light') {
      return JSON.parse(savedTheme) === 'dark' ? darkTheme : defaultTheme;
    } else {
      return defaultTheme;
    }
  }

  useEffect(() => {
    localStorage.setItem('theme', JSON.stringify(theme.type));
  }, [theme]);

  return {
    theme,
    setTheme: ({ setTheme, ...theme }) => {
      if (theme.type === 'dark') {
        return _setTheme(darkTheme);
      } else {
        return _setTheme(lightTheme);
      }
    },
  };
}

내 주요 구성 요소 :

export default function App() {
  const { theme, setTheme } = useAppTheme();

  useEffect(() => {
    console.log('rendering app');
  });

  return (
    <ThemeProvider theme={theme}>
      <GlobalStyle />
      <div className="App">
        <Header />
        <button
          css={css`
            background: red;
            width: 100px;
            height: 50px;
            border-radius: 10px;
          `}
          onClick={() =>
            setTheme(
              theme.type === 'dark' ? { type: 'light' } : { type: 'dark' },
            )
          }
        >
          a
        </button>
      </div>
    </ThemeProvider>
안살 알리

내가 이해했듯이 코드가 예상대로 작동합니다. 다음과 같이 설명 할 수있을 것 같습니다.

Header상태 업데이트 ( setTextonChange 호출 )로 인해 다시 렌더링됩니다 . 컴포넌트가 다시 렌더링되면 모든 하위 컴포넌트는 다시 렌더링해야합니다 (props가 변경되지 않더라도). 또는 구성 요소를 사용 shouldComponentUpdate하거나 사용하여이 다시 렌더링에서 옵트 아웃 할 수 있습니다 . 여기서 볼 수 있듯이 상태 기능 구성 요소 일 뿐이며 모든 상태 업데이트시 다시 렌더링됩니다. 자세한 내용은 여기 를 참조하십시오.PureComponentmemoized function(al)NavBar

React.memo다음과 같이이 문제를 해결할 수 있습니다 .

const NavBar = React.memo(props => {
  console.log(props.theme, 'this is nav bar');
  return (
    <Nav>
      <ul>
        <li>
          <a href="#home">home</a>
        </li>
        <li>
          <a href="#homex">test</a>
        </li>
        <li>
          <a href="#homexv">test</a>
        </li>
      </ul>
    </Nav>
  );
});

이제 소품이 실제로 변경되지 않는 한 구성 요소가 다시 렌더링되지 않습니다.

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

매개 변수 컴포넌트가 React Router를 사용하여 ReactJS에서 렌더링 될 때 HOC 컴포넌트의 불필요한 재 렌더링을 피할 수있는 방법

분류에서Dev

입력 된 컴포넌트를 일반 컴포넌트 내부에 렌더링하는 간단한 방법

분류에서Dev

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

분류에서Dev

React에서 한 컴포넌트의 기능을 다른 컴포넌트로 재사용하는 방법

분류에서Dev

컴포넌트에서 렌더링되는 함수로 소품을 가져 오는 방법

분류에서Dev

아이템 목록에 따라 React Hooks, 기능 구성 요소 및 기능으로 불필요한 재 렌더링을 방지하는 방법

분류에서Dev

다른 컴포넌트를 호출 한 후 컴포넌트에서 상태를 유지하는 방법

분류에서Dev

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

분류에서Dev

Reactjs 반응 컴포넌트를 문자열에 삽입 한 다음 렌더링하는 방법

분류에서Dev

React에서 컴포넌트가 렌더링 된 횟수를 테스트하는 방법은 무엇입니까?

분류에서Dev

컴포넌트 태그 도우미로 렌더링 된 컴포넌트의 값에 바인딩하는 방법

분류에서Dev

React : 컨테이너 내에서 다른 컴포넌트를 다시 렌더링하지 않고 컴포넌트를 다른 컴포넌트에 렌더링하는 방법은 무엇입니까?

분류에서Dev

컴포넌트가 렌더링되는 슬롯 이름을 얻는 방법

분류에서Dev

다른 React 컴포넌트에서 렌더링 된 요소에 액세스하는 방법은 무엇입니까?

분류에서Dev

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

분류에서Dev

Angular 9 : 컴포넌트를 다시 렌더링하는 방법

분류에서Dev

Ember 컴포넌트를 같은 라인에 렌더링하는 방법

분류에서Dev

컴포넌트 결합에 반응하여 조건부 렌더링을 수행하는 방법

분류에서Dev

React에서 폼을 컴포넌트로 사용하는 방법

분류에서Dev

React에서 재귀 컴포넌트를 렌더링하는 방법은 무엇입니까?

분류에서Dev

React에서 불안정한 부모 속성을 렌더링하는 방법

분류에서Dev

vueJs에서 복잡한 Json을 렌더링하는 방법

분류에서Dev

Linux에서 불필요한 파일을 정리하는 방법

분류에서Dev

다른 컴포넌트에서 한 컴포넌트의 메소드를 호출하는 방법 [Angular]

분류에서Dev

React의 다른 컴포넌트에서 한 컴포넌트의 상태를 설정하는 방법

분류에서Dev

동일한 컴포넌트에서 사용자 컴포넌트를 여러 번 사용하는 방법

분류에서Dev

이미 렌더링 된 ReactJS 컴포넌트를 해당 컴포넌트 외부에서 업데이트하는 올바른 접근 방식

분류에서Dev

React의 다른 컴포넌트에서 다른 컴포넌트로 onClick 값을 할당하는 방법

분류에서Dev

함수 컴포넌트에서 클래스 컴포넌트로 소품을 전달하는 방법

Related 관련 기사

  1. 1

    매개 변수 컴포넌트가 React Router를 사용하여 ReactJS에서 렌더링 될 때 HOC 컴포넌트의 불필요한 재 렌더링을 피할 수있는 방법

  2. 2

    입력 된 컴포넌트를 일반 컴포넌트 내부에 렌더링하는 간단한 방법

  3. 3

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

  4. 4

    React에서 한 컴포넌트의 기능을 다른 컴포넌트로 재사용하는 방법

  5. 5

    컴포넌트에서 렌더링되는 함수로 소품을 가져 오는 방법

  6. 6

    아이템 목록에 따라 React Hooks, 기능 구성 요소 및 기능으로 불필요한 재 렌더링을 방지하는 방법

  7. 7

    다른 컴포넌트를 호출 한 후 컴포넌트에서 상태를 유지하는 방법

  8. 8

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

  9. 9

    Reactjs 반응 컴포넌트를 문자열에 삽입 한 다음 렌더링하는 방법

  10. 10

    React에서 컴포넌트가 렌더링 된 횟수를 테스트하는 방법은 무엇입니까?

  11. 11

    컴포넌트 태그 도우미로 렌더링 된 컴포넌트의 값에 바인딩하는 방법

  12. 12

    React : 컨테이너 내에서 다른 컴포넌트를 다시 렌더링하지 않고 컴포넌트를 다른 컴포넌트에 렌더링하는 방법은 무엇입니까?

  13. 13

    컴포넌트가 렌더링되는 슬롯 이름을 얻는 방법

  14. 14

    다른 React 컴포넌트에서 렌더링 된 요소에 액세스하는 방법은 무엇입니까?

  15. 15

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

  16. 16

    Angular 9 : 컴포넌트를 다시 렌더링하는 방법

  17. 17

    Ember 컴포넌트를 같은 라인에 렌더링하는 방법

  18. 18

    컴포넌트 결합에 반응하여 조건부 렌더링을 수행하는 방법

  19. 19

    React에서 폼을 컴포넌트로 사용하는 방법

  20. 20

    React에서 재귀 컴포넌트를 렌더링하는 방법은 무엇입니까?

  21. 21

    React에서 불안정한 부모 속성을 렌더링하는 방법

  22. 22

    vueJs에서 복잡한 Json을 렌더링하는 방법

  23. 23

    Linux에서 불필요한 파일을 정리하는 방법

  24. 24

    다른 컴포넌트에서 한 컴포넌트의 메소드를 호출하는 방법 [Angular]

  25. 25

    React의 다른 컴포넌트에서 한 컴포넌트의 상태를 설정하는 방법

  26. 26

    동일한 컴포넌트에서 사용자 컴포넌트를 여러 번 사용하는 방법

  27. 27

    이미 렌더링 된 ReactJS 컴포넌트를 해당 컴포넌트 외부에서 업데이트하는 올바른 접근 방식

  28. 28

    React의 다른 컴포넌트에서 다른 컴포넌트로 onClick 값을 할당하는 방법

  29. 29

    함수 컴포넌트에서 클래스 컴포넌트로 소품을 전달하는 방법

뜨겁다태그

보관