Apakah ada pendekatan sistematis untuk men-debug apa yang menyebabkan komponen untuk merender ulang di Bereaksi? Saya meletakkan console.log sederhana () untuk melihat berapa banyak waktu render, tetapi saya mengalami kesulitan mencari tahu apa yang menyebabkan komponen untuk membuat beberapa kali yaitu (4 kali) dalam kasus saya. Apakah ada alat yang ada yang menunjukkan timeline dan / atau semua komponen merender dan memesan pohon?
156
shouldComponentUpdate
untuk menonaktifkan pembaruan komponen otomatis dan kemudian memulai jejak Anda dari sana. Informasi lebih lanjut dapat ditemukan di sini: facebook.github.io/react/docs/optimizing-performance.htmlJawaban:
Jika Anda ingin cuplikan singkat tanpa ketergantungan eksternal apa pun, saya merasa ini berguna
Berikut adalah kait kecil yang saya gunakan untuk melacak pembaruan ke komponen fungsi
sumber
setState
metode (dalam komponen kelas) dengansetState(...args) { super.setState(...args) }
dan kemudian menetapkan breakpoint di debugger Anda yang kemudian dapat Anda peroleh. untuk melacak kembali ke pengaturan fungsi negara.useTraceUpdate
setelah saya mendefinisikannya saat Anda menulisnya?function MyComponent(props) { useTraceUpdate(props); }
dan itu akan masuk setiap kali props berubahthis.state
tidak ditentukan.Berikut adalah beberapa contoh yang komponen Bereaksi akan dirender ulang.
this.setState()
dalam komponen. Hal ini akan memicu metode siklus hidup komponen berikutshouldComponentUpdate
>componentWillUpdate
>render
>componentDidUpdate
props
. Akan memicu inicomponentWillReceiveProps
>shouldComponentUpdate
>componentWillUpdate
>render
>componentDidUpdate
(connect
metodereact-redux
pemicu ini bila ada perubahan berlaku di toko Redux)this.forceUpdate
yang mirip denganthis.setState
Anda dapat meminimalkan rerender komponen Anda dengan menerapkan pemeriksaan di dalam Anda
shouldComponentUpdate
dan mengembalikanfalse
jika tidak perlu.Cara lain adalah dengan menggunakan
React.PureComponent
atau komponen stateless. Komponen murni dan stateless hanya di-render ketika ada perubahan pada propsnya.sumber
shouldComponentUpdate
, atau memperluasReact.PureComponent
, untuk menegakkan hanya rendering ulang pada perubahan.const MyComponent = (props) => <h1>Hello {props.name}</h1>;
(itu adalah komponen stateless). Ini akan merender ulang setiap kali komponen induk dirender kembali.Jawaban @ jpdelatorre sangat bagus dalam menyoroti alasan umum mengapa komponen Bereaksi dapat di-render ulang.
Saya hanya ingin menyelam sedikit lebih dalam ke satu contoh: ketika alat peraga berubah . Pemecahan masalah apa yang menyebabkan komponen Bereaksi untuk di-render adalah masalah yang umum, dan dalam pengalaman saya banyak kali melacak masalah ini melibatkan menentukan alat peraga mana yang berubah .
Bereaksi komponen yang di-render setiap kali mereka menerima alat peraga baru. Mereka dapat menerima alat peraga baru seperti:
<MyComponent prop1={currentPosition} prop2={myVariable} />
atau jika
MyComponent
terhubung ke toko redux:Kapan saja nilai dari
prop1
,prop2
,prop3
, atauprop4
perubahanMyComponent
akan kembali membuat. Dengan 4 alat peraga, tidak terlalu sulit untuk melacak alat peraga mana yang berubah dengan meletakkanconsole.log(this.props)
pada awalrender
blok itu. Namun dengan komponen yang lebih rumit dan lebih banyak alat peraga metode ini tidak dapat dipertahankan.Berikut ini adalah pendekatan yang berguna (menggunakan lodash untuk kenyamanan) untuk menentukan perubahan prop mana yang menyebabkan komponen dirender ulang:
Menambahkan potongan ini ke komponen Anda dapat membantu mengungkap pelakunya yang menyebabkan perenderan ulang yang dipertanyakan, dan sering kali ini membantu menjelaskan data yang tidak perlu yang disalurkan ke komponen.
sumber
UNSAFE_componentWillReceiveProps(nextProps)
dan sudah usang. "Daur hidup ini sebelumnya bernamacomponentWillReceiveProps
. Nama itu akan terus bekerja sampai versi 17." Dari dokumentasi Bereaksi .Tidak ada yang aneh telah memberikan jawaban itu tetapi saya merasa sangat berguna, terutama karena perubahan alat peraga hampir selalu sangat bersarang.
Fanboys kait:
"Old" - fanboys sekolah:
PS Saya masih lebih suka menggunakan HOC (komponen pesanan lebih tinggi) karena kadang-kadang Anda telah merusak alat peraga Anda di bagian atas dan solusi Yakub tidak cocok dengan baik
Penafian: Tidak ada afiliasi apa pun dengan pemilik paket. Hanya mengklik puluhan kali di sekitar untuk mencoba melihat perbedaan pada objek yang bersarang secara mendalam adalah rasa sakit di.
sumber
Sekarang ada pengait untuk ini tersedia di npm:
https://www.npmjs.com/package/use-trace-update
(Pengungkapan, saya menerbitkannya) Pembaruan: Dikembangkan berdasarkan kode Jacob Rask
sumber
Menggunakan kait dan komponen fungsional, bukan hanya penyangga perubahan dapat menyebabkan rerender. Apa yang mulai saya gunakan adalah log yang agak manual. Saya banyak membantu saya. Anda mungkin menemukan itu berguna juga.
Saya tempel bagian ini di file komponen:
Di awal metode saya menyimpan referensi WeakMap:
Kemudian setelah setiap panggilan "mencurigakan" (alat peraga, kait) saya menulis:
sumber
Jawaban di atas sangat membantu, kalau-kalau ada yang mencari metode specfic untuk mendeteksi penyebab rerender maka saya menemukan perpustakaan ini redux-logger sangat membantu.
Yang bisa Anda lakukan adalah menambahkan perpustakaan dan mengaktifkan pembedaan antar negara (ada di dokumen) seperti:
Dan tambahkan middleware di toko.
Kemudian masukkan
console.log()
fungsi render dari komponen yang ingin Anda uji.Kemudian Anda dapat menjalankan aplikasi Anda dan memeriksa log konsol. Di mana pun ada log tepat sebelum itu akan menunjukkan perbedaan antara negara
(nextProps and this.props)
dan Anda dapat memutuskan apakah render benar-benar diperlukan di sanaIni akan mirip dengan gambar di atas bersama dengan tombol diff.
sumber