渲染时错误的 setState() 调用以及可能的解决方案!
警告:在呈现其他组件(`BookingConfirmationModal`)时无法更新组件(`Bookings`)。要找到`BookingConfirmationModal`内错误的 setState() 调用,请按照所述跟踪堆栈!
在 React 应用程序中,您经常会遇到这个可怕的错误。当您尝试修改组件(Bookings)的状态时,就会出现此错误,该组件主要是父组件,而它正在渲染另一个组件(BookingConfirmationModal),该组件是子组件,并且您可能已将 setState() 函数作为 prop 传递给它。然而,这可能会导致应用程序的 UI 出现意外行为和不一致。
在这篇博客中,我将尝试指导您理解此错误、调试其来源并实施有效的解决方案,以防止它再次发生在您的 React 项目中。
理解错误
React 的渲染过程旨在高效且可预测。当组件的状态或属性发生变化时,React 会启动重新渲染过程。在此过程中,React 会遍历组件树,根据需要更新和重新渲染组件。“渲染时无法更新状态”错误的核心问题在于违反了这种可预测的渲染顺序。当一个组件试图在其自身的渲染阶段修改另一个组件的状态时,它会扰乱渲染周期并可能导致:
可能的原因
解决方案
要解决此问题,您应该确保在渲染阶段不会发生状态更新!您可以采取以下几个步骤:
import React, { useEffect } from 'react'; const BookingConfirmationModal = ({ someProp }) => { useEffect(() => { // Perform state updates here // Example: setState(someValue); }, [someProp]); // Add dependencies if needed return ({/* Your component JSX */}); };
一个可能的解决方案是 -
import { useState, useEffect } from "react"; import BookingConfirmationModal from "./BookingConfirmationModal"; function App() { const [showModal, setShowModal] = useState(false); // other code return (); } export default App; // BookingConfirmationModal.jsx const BookingConfirmationModal= ({ setTestingState }) => { useEffect(()=> { setTestingState(false) }, [setIsModalVisible]) //or other required dependencies return (This is app
{showModal ?: null} // other codes); }; export default BookingConfirmationModal;