> 웹 프론트엔드 > JS 튜토리얼 > 렌더링하는 동안 잘못된 setState() 호출과 가능한 해결 방법이 있습니다!

렌더링하는 동안 잘못된 setState() 호출과 가능한 해결 방법이 있습니다!

Barbara Streisand
풀어 주다: 2025-01-04 06:58:34
원래의
900명이 탐색했습니다.

Bad setState() call and possible solution while rendering!

경고: 다른 구성 요소(BookingConfirmationModal)를 렌더링하는 동안 구성 요소(Bookings)를 업데이트할 수 없습니다. BookingConfirmationModal 내에서 잘못된 setState() 호출을 찾으려면 설명된 대로 스택 추적을 따르세요!

React 애플리케이션에서는 이런 끔찍한 오류가 자주 발생합니다. 이 오류는 하위 구성 요소인 다른 구성 요소(BookingConfirmationModal)를 렌더링하는 동안 대부분 상위 구성 요소인 구성 요소(Bookings)의 상태를 수정하려고 시도하고 아마도 setState() 함수를 전달했을 때 발생합니다. 소품으로요. 그러나 이로 인해 애플리케이션 UI에서 예상치 못한 동작과 불일치가 발생할 수 있습니다.

이 블로그에서는 이 오류를 이해하고, 소스를 디버깅하고, React 프로젝트에서 이 오류가 다시 발생하지 않도록 효과적인 솔루션을 구현하는 과정을 안내해 드리겠습니다.

오류 이해

React의 렌더링 프로세스는 효율적이고 예측 가능하도록 설계되었습니다. 구성 요소의 상태나 소품이 변경되면 React는 다시 렌더링 프로세스를 시작합니다. 이 프로세스 동안 React는 구성 요소 트리를 탐색하여 필요에 따라 구성 요소를 업데이트하고 다시 렌더링합니다. "렌더링하는 동안 상태를 업데이트할 수 없습니다" 오류의 핵심 문제는 예측 가능한 렌더링 순서를 위반하는 것입니다. 구성 요소가 자체 렌더링 단계에서 다른 구성 요소의 상태를 수정하려고 하면 렌더링 주기가 중단되어 다음과 같은 결과가 발생할 수 있습니다.

  • 무한 루프: 상태 업데이트로 인해 지속적인 재렌더링이 발생하여 잠재적으로 애플리케이션이 충돌할 수 있습니다.
  • 일관되지 않은 UI: 의도한 상태 변경이 UI에 정확하게 반영되지 않을 수 있습니다.
  • 데이터 경합: 여러 구성 요소가 동일한 상태를 동시에 수정하려고 시도하여 예측할 수 없는 결과를 초래할 수 있습니다.

가능한 원인

  • 렌더링 단계의 상태 업데이트: 가장 가능성이 높은 원인은 렌더링 메서드 내에서 또는 BookingConfirmationModal의 렌더링 프로세스 중에 setState를 호출하는 것입니다.

  • 렌더링의 부작용: 렌더 메서드에서 직접 부작용(예: 데이터 가져오기 또는 상태 업데이트)을 수행할 수 있으므로 피해야 합니다.

해결책

이 문제를 해결하려면 렌더링 단계 중에 상태 업데이트가 발생하지 않는지 확인해야 합니다! 취할 수 있는 몇 가지 단계는 다음과 같습니다.

  • 상태 업데이트를 useEffect로 이동: 일부 조건에 따라 상태를 업데이트해야 하는 경우 useEffect 후크를 사용하여 구성 요소가 렌더링된 후 업데이트를 수행합니다.
import React, { useEffect } from 'react';

const BookingConfirmationModal = ({ someProp }) => {
  useEffect(() => {
    // Perform state updates here
    // Example: setState(someValue);
  }, [someProp]); // Add dependencies if needed

  return (
    <div>
      {/* Your component JSX */}
    </div>
  );
};
로그인 후 복사
  • 렌더링 시 직접 상태 업데이트 방지: 렌더링 메서드나 렌더링 중에 호출되는 함수 내에서 setState를 직접 호출하지 않는지 확인하세요.

  • 조건부 상태 업데이트 확인: 상태를 업데이트하는 조건부 논리가 있는 경우 렌더링 단계에서 실행되지 않는지 확인하세요.

  • useMemo를 확인하세요. useMemo를 사용했다면 이를 제거하고 대신 하위 구성 요소에서 useEffect를 사용하여 실행되도록 하세요. 구성 요소가 마운트되거나 상위 구성 요소로 useMemo 이동된 후. 그러면 경고가 해결됩니다.

가능한 해결책은 다음과 같습니다.

import { useState, useEffect } from "react";
import BookingConfirmationModal from "./BookingConfirmationModal";

function App() {
  const [showModal, setShowModal] = useState(false);
  // other code

  return (
    <div>
      <h1>This is app</h1>
      <button onClick={() => setShowModal(true)}>Show Modal</button>
      {showModal ? <Testing BookingConfirmationModal={setTestingState} /> : null}
    </div>
  );
}

export default App;

// BookingConfirmationModal.jsx
const BookingConfirmationModal= ({ setTestingState }) => {

  useEffect(()=> {
    setTestingState(false)
   }, [setIsModalVisible]) //or other required dependencies

  return (
    <div>
      <button onClick={() => setTestingState(false)}>Close Modal</button>
      // other codes
    </div>
  );
};

export default BookingConfirmationModal;
로그인 후 복사

즐거운 코딩하세요!

제안하고 싶은 사항:-

Linkedin Twitter에서 저를 찾아보세요

labib.ahmed.372@gmail.com으로 이메일을 보내주세요

위 내용은 렌더링하는 동안 잘못된 setState() 호출과 가능한 해결 방법이 있습니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿