Apakah Bereaksi ulang membuat semua komponen dan sub komponen setiap kali setState
dipanggil?
Jika demikian, mengapa? Saya pikir idenya adalah bahwa Bereaksi hanya memberikan sesedikit yang diperlukan - ketika keadaan berubah.
Dalam contoh sederhana berikut, kedua kelas merender lagi ketika teks diklik, terlepas dari kenyataan bahwa keadaan tidak berubah pada klik berikutnya, karena penangan onClick selalu menetapkan nilai state
yang sama:
this.setState({'test':'me'});
Saya akan berharap bahwa rendering hanya akan terjadi jika state
data telah berubah.
Berikut kode contohnya, sebagai JS Fiddle , dan cuplikan yang disematkan:
var TimeInChild = React.createClass({
render: function() {
var t = new Date().getTime();
return (
<p>Time in child:{t}</p>
);
}
});
var Main = React.createClass({
onTest: function() {
this.setState({'test':'me'});
},
render: function() {
var currentTime = new Date().getTime();
return (
<div onClick={this.onTest}>
<p>Time in main:{currentTime}</p>
<p>Click me to update time</p>
<TimeInChild/>
</div>
);
}
});
ReactDOM.render(<Main/>, document.body);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react-dom.min.js"></script>
[1]: http://jsfiddle.net/fp2tncmb/2/
javascript
reactjs
Taman Brad
sumber
sumber
setState()
bahkan dengan data dummy memang menyebabkan elemen untuk membuat berbeda sehingga saya akan mengatakan ya. Benar-benar harus mencoba untuk me-render kembali objek Anda ketika sesuatu mungkin telah berubah karena jika tidak demo Anda - dengan asumsi itu adalah perilaku yang dimaksudkan - tidak akan berhasil!shouldComponentUpdate
metode Anda sendiri , yang saya asumsikan versi sederhananya sudah harus dimasukkan dalam Bereaksi itu sendiri. Kedengarannya seperti versi default yang disertakan dalam reaksi hanya mengembalikantrue
- yang memaksa komponen untuk merender ulang setiap saat.Jawaban:
Secara default - ya.
Ada metode boolean shouldComponentUpdate (objek nextProps, objek nextState) , setiap komponen memiliki metode ini dan bertanggung jawab untuk menentukan "haruskah komponen diperbarui (jalankan fungsi render )?" setiap kali Anda mengubah negara atau lulus baru alat peraga dari komponen induk.
Anda dapat menulis implementasi Anda sendiri dari metode shouldComponentUpdate untuk komponen Anda, tetapi implementasi default selalu mengembalikan true - artinya selalu menjalankan kembali fungsi render.
Kutipan dari dokumen resmi http://facebook.github.io/react/docs/component-specs.html#updating-shouldcomponentupdate
Bagian selanjutnya dari pertanyaan Anda:
Ada dua langkah yang dapat kita sebut "render":
Virtual DOM renders: ketika metode render dipanggil, ia mengembalikan struktur dom virtual baru dari komponen. Seperti yang saya sebutkan sebelumnya, metode render ini dipanggil selalu ketika Anda memanggil setState () , karena shouldComponentUpdate selalu mengembalikan true secara default. Jadi, secara default, tidak ada optimasi di sini di Bereaksi.
Render DOM asli: Bereaksi mengubah node DOM nyata di browser Anda hanya jika diubah di Virtual DOM dan sesedikit yang diperlukan - ini adalah fitur React yang hebat yang mengoptimalkan mutasi DOM nyata dan membuat Bereaksi cepat.
sumber
setState
jika Anda mendeteksi ada perbedaan? Jika demikian, bagaimana melakukan yang terbaik - membandingkan string json, membangun dan membandingkan hash objek, ...?Tidak, Bereaksi tidak merender segalanya saat status berubah.
Setiap kali komponen kotor (kondisinya berubah), komponen itu dan anak-anaknya dirender kembali. Ini, sampai batas tertentu, adalah untuk membuat ulang sesedikit mungkin. Satu-satunya waktu ketika render tidak dipanggil adalah ketika beberapa cabang dipindahkan ke root lain, di mana secara teoritis kita tidak perlu merender ulang apa pun. Dalam contoh Anda,
TimeInChild
adalah komponen turunan dariMain
, sehingga komponen tersebut juga akan ditampilkan ulang saat statusMain
perubahan.Bereaksi tidak membandingkan data status. Ketika
setState
dipanggil, itu menandai komponen sebagai kotor (yang berarti perlu dirender ulang). Yang penting untuk dicatat adalah bahwa meskipunrender
metode komponen disebut, DOM yang asli hanya diperbarui jika output berbeda dari pohon DOM saat ini (alias berbeda antara pohon DOM Virtual dan pohon DOM dokumen). Dalam contoh Anda, meskipunstate
data tidak berubah, waktu perubahan terakhir terjadi, membuat Virtual DOM berbeda dari DOM dokumen, karenanya mengapa HTML diperbarui.sumber
render()
metode ini harus "murni" - independen dari keadaan luar.some branch is moved to another root
? Apa yang kau sebutbranch
? Apa yang kau sebutroot
?what does it mean some branch is moved to another root? What do you call branch? What do you call root?
Meskipun dinyatakan dalam banyak jawaban lain di sini, komponennya harus:
menerapkan
shouldComponentUpdate
untuk membuat hanya ketika keadaan atau properti berubahberalih ke memperluas PureComponent , yang sudah mengimplementasikan
shouldComponentUpdate
metode secara internal untuk perbandingan yang dangkal.Berikut adalah contoh yang menggunakan
shouldComponentUpdate
, yang hanya berfungsi untuk kasus penggunaan sederhana dan tujuan demonstrasi. Saat ini digunakan, komponen tidak lagi merender sendiri pada setiap klik, dan diberikan saat pertama kali ditampilkan, dan setelah itu diklik sekali.sumber
Iya. Itu memanggil metode render () setiap kali kita memanggil setState sebagai gantinya ketika "shouldComponentUpdate" mengembalikan false.
sumber
Alasan lain untuk "pembaruan yang hilang" dapat menjadi alasan berikut:
Jika itu masalahnya maka Anda dapat menghindari pengaturan negara selama pembaruan, Anda harus memeriksa nilai parameter keadaan seperti ini
Solusi lain adalah menambahkan properti yang diinisialisasi ke negara, dan mengaturnya di pertama kalinya (jika negara diinisialisasi ke nilai non null.)
sumber
Tidak Semua Komponen.
itu
state
dalam penampilan komponen seperti sumber air terjun negara dari seluruh APP.Jadi perubahan terjadi dari mana setState dipanggil. Pohon itu
renders
lalu dipanggil dari sana. Jika Anda telah menggunakan komponen murni, makarender
akan dilewati.sumber