Kaedah componentDidUpdate()
adalah kaedah kitaran hayat dalam React yang dipanggil selepas komponen telah dikemas kini. Ia adalah sebahagian daripada kitaran hayat komponen kelas dan dipanggil hanya selepas DOM telah dikemas kini. Kaedah ini berguna untuk melaksanakan operasi yang bergantung kepada DOM yang baru dikemas kini, seperti mengambil data baru berdasarkan perubahan prop atau mengemas kini DOM sebagai tindak balas kepada perubahan prop atau negeri.
Kaedah componentDidUpdate()
mengambil dua parameter pilihan: prevProps
dan prevState
. Parameter ini boleh digunakan untuk membandingkan alat -alat dan keadaan sebelumnya dengan prop dan keadaan semasa, membolehkan anda mengesan perubahan tertentu yang mungkin mencetuskan kemas kini.
Berikut adalah contoh asas bagaimana componentDidUpdate()
digunakan dalam komponen kelas React:
<code class="jsx">class ExampleComponent extends React.Component { componentDidUpdate(prevProps, prevState) { // Perform side effects here based on prop or state changes } render() { return <div>{this.props.content}</div>; } }</code>
Kaedah componentDidUpdate()
dicetuskan oleh perubahan kepada alat atau keadaan komponen. Lebih khusus lagi, ia akan dipanggil selepas setiap render kecuali untuk membuat awal. Berikut adalah senario yang akan mencetuskan componentDidUpdate()
:
componentDidUpdate()
akan dipanggil.componentDidUpdate()
akan dipanggil.componentDidUpdate()
.this.forceUpdate()
dipanggil, ia akan menyebabkan komponen untuk membuat semula dan memanggil componentDidUpdate()
. Adalah penting untuk diperhatikan bahawa componentDidUpdate()
tidak akan dipanggil pada render awal komponen. Untuk persediaan awal atau pengambilan data, anda harus menggunakan componentDidMount()
sebaliknya.
componentDidUpdate()
adalah kaedah yang sangat baik untuk menguruskan kesan sampingan selepas komponen telah dikemas kini. Kesan sampingan adalah operasi seperti mengambil data, menetapkan pemasa, atau secara langsung memanipulasi DOM. Berikut adalah cara anda boleh menggunakan componentDidUpdate()
untuk menguruskan kesan sampingan ini:
Mengambil data berdasarkan perubahan prop : Jika anda ingin mengambil data apabila perubahan prop tertentu, anda boleh membandingkan alat semasa dengan alat -alat sebelumnya dalam componentDidUpdate()
dan mencetuskan panggilan API dengan sewajarnya.
<code class="jsx">class UserProfile extends React.Component { componentDidUpdate(prevProps) { if (this.props.userId !== prevProps.userId) { this.fetchUser(this.props.userId); } } fetchUser = (userId) => { // Make API call to fetch user data } render() { return <div>{this.props.user.name}</div>; } }</code>
Mengemas kini DOM sebagai tindak balas kepada perubahan keadaan : Jika anda perlu mengemas kini DOM berdasarkan perubahan keadaan, anda boleh melakukan kemas kini ini dalam componentDidUpdate()
.
<code class="jsx">class Timer extends React.Component { state = { seconds: 0 }; componentDidMount() { this.timerID = setInterval(() => this.tick(), 1000); } componentWillUnmount() { clearInterval(this.timerID); } tick() { this.setState(state => ({ seconds: state.seconds 1 })); } componentDidUpdate(prevProps, prevState) { if (this.state.seconds !== prevState.seconds) { // Update the DOM, for example: document.title = `Seconds: ${this.state.seconds}`; } } render() { return <div>Seconds: {this.state.seconds}</div>; } }</code>
Menguruskan Langganan : Jika komponen anda perlu menguruskan langganan ke sumber data yang perlu dikemas kini apabila prop atau perubahan keadaan, anda boleh mengendalikannya dalam componentDidUpdate()
.
<code class="jsx">class ChatRoom extends React.Component { componentDidMount() { this.subscribeToChatRoom(this.props.roomId); } componentDidUpdate(prevProps) { if (this.props.roomId !== prevProps.roomId) { this.unsubscribeFromChatRoom(prevProps.roomId); this.subscribeToChatRoom(this.props.roomId); } } componentWillUnmount() { this.unsubscribeFromChatRoom(this.props.roomId); } subscribeToChatRoom = (roomId) => { // Subscribe to the chat room } unsubscribeFromChatRoom = (roomId) => { // Unsubscribe from the chat room } render() { return <div>{/* Chat room UI */}</div>; } }</code>
Walaupun componentDidUpdate()
berkuasa untuk menguruskan kesan sampingan selepas kemas kini, terdapat senario di mana ia harus dielakkan atau digunakan dengan berhati -hati:
componentDidUpdate()
tidak boleh digunakan untuk operasi yang perlu berlaku pada permulaan awal. Gunakan componentDidMount()
untuk tugas -tugas tersebut, sebaliknya, sebagai componentDidUpdate()
tidak dipanggil selepas render awal. REDERS EXTERSIVE : Jika componentDidUpdate()
digunakan untuk menyebabkan kemas kini negeri tambahan atau render semula, ia boleh membawa kepada kemas kini yang tidak terhingga. Pastikan anda memasukkan syarat untuk mengelakkan kemas kini yang tidak perlu.
<code class="jsx">// Bad practice: Can cause infinite loop componentDidUpdate() { this.setState({ count: this.state.count 1 }); } // Good practice: Use conditions to prevent infinite loops componentDidUpdate(prevProps, prevState) { if (this.props.someProp !== prevProps.someProp) { this.setState({ count: this.state.count 1 }); } }</code>
componentDidUpdate()
boleh memberi kesan negatif terhadap prestasi, terutamanya dalam aplikasi besar. Pertimbangkan untuk menggunakan shouldComponentUpdate()
atau react.memo untuk mengoptimumkan rendering sebelum bergantung pada componentDidUpdate()
untuk melaksanakan operasi mahal. Komponen Fungsian : Dalam perkembangan reaksi moden, komponen fungsional dengan cangkuk lebih disukai berbanding komponen kelas. Daripada menggunakan componentDidUpdate()
, anda harus menggunakan cangkuk useEffect
, yang menawarkan lebih banyak fleksibiliti dan boleh lebih mudah dioptimumkan.
<code class="jsx">// Class component with componentDidUpdate class Example extends React.Component { componentDidUpdate(prevProps) { if (this.props.someProp !== prevProps.someProp) { // Perform side effect } } } // Functional component with useEffect function Example({ someProp }) { React.useEffect(() => { // Perform side effect }, [someProp]); return <div>Content</div>; }</code>
Dengan berhati -hati dengan senario ini, anda boleh menentukan dengan lebih berkesan apabila menggunakan componentDidUpdate()
dan bila memilih pendekatan alternatif.
Atas ialah kandungan terperinci Apakah ComponentDidUpdate ()? Bilakah ia dipanggil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!