Bagaimana Bereaksi Komponen Tanpa Kewarganegaraan 0,14 akan menawarkan peningkatan kinerja tanpa shouldComponentUpdate?

8

Pertanyaan ini telah berputar-putar di kepala saya sejak saya membaca catatan rilis (dan hype terkait lainnya) sekitar React 0,14 - Saya penggemar React dan saya pikir komponen stateless ( https: //facebook.github. io / react / blog / 2015/09/10 / react-v0.14-rc1.html # stateless-function-components ) adalah ide bagus, baik untuk kemudahan menulis komponen seperti itu dan untuk mengekspresikan dalam kode maksud bahwa ini komponen harus "murni" dalam hal rendering secara konsisten untuk data alat peraga yang sama.

Pertanyaannya adalah: bagaimana mungkin React untuk mengoptimalkan fungsi komponen stateless ini tanpa menjadi babi utuh dan berasumsi bahwa referensi alat peraga tidak hanya abadi karena mereka tidak boleh dimanipulasi di dalam komponen, tetapi juga bahwa mereka tidak akan pernah bisa berubah di luar siklus hidup komponen? Alasan bahwa komponen "reguler" (alias komponen stateful - dengan kata lain, komponen yang melewati seluruh siklus hidup; componentWillMount, getInitialState, dll.) Memiliki fungsi opsional "shouldComponentUpdate" karena Bereaksi tidak berasumsi bahwa semua alat peraga dan referensi negara sepenuhnya tidak dapat diubah. Setelah komponen diberikan, sifat-sifat tertentu dari referensi alat peraga dapat berubah dan dengan demikian contoh "alat peraga" yang sama mungkin memiliki konten yang berbeda di kemudian hari. Ini adalah sebagian alasan mengapa ada banyak kegembiraan atas penggunaan struktur yang sepenuhnya tidak dapat diubah dan mengapa dikatakan bahwa menggunakan Om dengan React dapat menawarkan keuntungan kinerja yang luar biasa; karena struktur yang tidak dapat diubah yang digunakan di sana menjamin bahwa setiap instance dari objek apa pun tidak akan pernah dapat dimutasi, maka sebaiknya ComponentUpdate dapat melakukan pemeriksaan kesetaraan referensi yang sangat murah pada alat peraga dan negara (http://swannodette.github.io/2013/12/17/the-future-of-javascript-mvcs/ ).

Saya sudah mencoba mencari tahu informasi lebih lanjut tentang ini tetapi belum punya tempat. Saya tidak dapat membayangkan peningkatan kinerja apa yang dapat dilakukan di sekitar komponen tanpa kewarganegaraan tanpa menganggap bahwa data alat peraga akan terdiri dari jenis yang tidak dapat diubah .. mungkin beberapa analisis awal dari jenis alat peraga yang tidak dapat diubah untuk mencoba menebak apakah "alat peraga" dan "tanaman berikutnya" mewakili data yang sama?

Saya hanya ingin tahu apakah ada yang punya informasi orang dalam atau wawasan yang mencerahkan tentang hal ini. Jika Bereaksi memang mulai menuntut agar jenis alat peraga "sepenuhnya tidak berubah" (izinkan perbandingan perbandingan kesetaraan untuk mengonfirmasi bahwa data tidak berubah) maka saya pikir itu akan menjadi langkah maju yang hebat, tetapi itu juga bisa menjadi perubahan besar.

Dan Roberts
sumber

Jawaban:

4

Ada masalah github dalam proyek reaksi tentang hal ini.

Menurut komentar masalah github ini :

Untuk komponen yang kompleks, mendefinisikan shouldComponentUpdate (mis. Render murni) umumnya akan melebihi manfaat kinerja komponen stateless. Kalimat dalam dokumen tersebut mengisyaratkan beberapa optimasi di masa depan yang telah kami rencanakan, di mana kami tidak akan mengalokasikan instance internal untuk komponen fungsional stateless (kami hanya akan memanggil fungsi). Kami juga mungkin tidak terus memegang alat peraga, dll. Optimalisasi kecil. Kami tidak berbicara tentang detail dalam dokumen karena optimisasi belum benar-benar dilaksanakan (komponen stateless membuka pintu bagi optimasi ini).

dan dari balasan lain dari kolaborator yang sama:

Ada diskusi tentang memiliki flag pureRender yang bisa Anda atur pada fungsi tersebut, atau memungkinkannya untuk berpartisipasi dalam siklus hidup shouldUpdate, tetapi itu saat ini tidak diterapkan. Saat ini, fungsi stateless tidak dapat murni-render.

akhirnya dari komentar ini kami mendapatkan jawaban untuk pertanyaan Anda:

kami tidak melakukan render murni secara default, tetapi kami dapat memberikan cara bagi Anda untuk ikut serta di masa mendatang.

Jadi kita harus melihat bagaimana mereka akan membiarkan kita memilih 'pureRender' :)

Siamore
sumber