Saya mulai menggunakan Facebook React dalam proyek Backbone dan sejauh ini berjalan dengan sangat baik.
Namun, saya melihat beberapa duplikasi merayap ke kode React saya.
Misalnya, saya memiliki beberapa widget seperti formulir dengan status seperti INITIAL
, SENDING
dan SENT
. Ketika tombol ditekan, formulir perlu divalidasi, permintaan dibuat, dan kemudian status diperbarui. State disimpan di dalam React this.state
tentunya, bersama dengan nilai field.
Jika ini adalah tampilan Backbone, saya akan mengekstrak kelas dasar yang disebut FormView
tetapi kesan saya adalah bahwa Bereaksi tidak mendukung atau mendukung subkelas untuk berbagi logika tampilan (perbaiki saya jika saya salah).
Saya telah melihat dua pendekatan untuk menggunakan kembali kode di React:
- Mixins (seperti LinkedStateMixin yang dikirimkan dengan React);
- Komponen Penampung (seperti react-infinite-scroll ).
Apakah saya benar bahwa mixin dan container lebih disukai daripada warisan di React? Apakah ini keputusan desain yang disengaja? Apakah lebih masuk akal untuk menggunakan mixin atau komponen kontainer untuk contoh "widget formulir" saya dari paragraf kedua?
Berikut adalah inti dari FeedbackWidget
dan JoinWidget
dalam keadaan mereka saat ini . Mereka memiliki struktur yang mirip, beginSend
metode yang serupa dan keduanya perlu memiliki beberapa dukungan validasi (belum ada).
sumber
Jawaban:
Pada awalnya, saya mencoba menggunakan subkomponen untuk ini dan mengekstrak
FormWidget
danInputWidget
. Namun, saya mengabaikan pendekatan ini setengah jalan karena saya ingin kontrol yang lebih baik atas yang dihasilkaninput
dan statusnya.Dua artikel yang paling membantu saya:
Ternyata saya hanya perlu menulis dua mixin (berbeda):
ValidationMixin
danFormMixin
.Begini cara saya memisahkan mereka.
ValidationMixin
Mixin validasi menambahkan metode praktis untuk menjalankan fungsi validator Anda pada beberapa properti negara bagian Anda dan menyimpan properti "error'd" dalam
state.errors
larik sehingga Anda dapat menyorot kolom terkait.Sumber ( inti )
Pemakaian
ValidationMixin
memiliki tiga metode:validate
,hasError
danresetError
.Ini mengharapkan kelas untuk mendefinisikan
validators
objek, mirip denganpropTypes
:Ketika pengguna menekan tombol pengiriman, saya menelepon
validate
. Panggilan kevalidate
akan menjalankan setiap validator dan terisithis.state.errors
dengan array yang berisi kunci properti yang gagal validasi.Dalam
render
metode saya , saya gunakanhasError
untuk menghasilkan kelas CSS yang benar untuk bidang. Ketika pengguna menempatkan fokus di dalam lapangan, saya memanggilresetError
untuk menghapus sorotan kesalahan hinggavalidate
panggilan berikutnya .FormMixin
Form mixin menangani status formulir (dapat diedit, dikirim, dikirim). Anda dapat menggunakannya untuk menonaktifkan input dan tombol saat permintaan dikirim, dan untuk memperbarui tampilan Anda secara bersamaan saat permintaan dikirim.
Sumber ( inti )
Pemakaian
Ia mengharapkan komponen untuk menyediakan satu metode:,
sendRequest
yang harus mengembalikan janji Bluebird. (Sangat mudah untuk memodifikasinya agar berfungsi dengan Q atau library promise lainnya.)Ini memberikan metode kenyamanan seperti
isFormEditable
,isFormSubmitting
danisFormSubmitted
. Hal ini juga menyediakan metode untuk memulai permintaan:submitForm
. Anda dapat menyebutnya darionClick
penangan tombol formulir .sumber
FormInput
berbicara dengan pemiliknya melaluiformLink
.formLink
sepertivalueLink
, dan kembali dariFormMixin
'slinkValidatedState(name, validator)
metode.FormInput
mendapatkan nilainya dariformLink.value
dan memanggilformLink.requestBlur
danformLink.requestFocus
—mereka menyebabkan validasi masukFormMixin
. Akhirnya, untuk menyesuaikan komponen aktual yang digunakan untuk input, saya dapat meneruskannya keFormInput
:<FormInput component={React.DOM.textarea} ... />
done
di bluebird dan kodenya akan berfungsi seperti di Q (atau promise asli) - tentu saja bluebird lebih baik. Perhatikan juga bahwa sintaks di React berubah sejak jawabannya.Saya membangun SPA dengan React (dalam produksi sejak 1 tahun), dan saya hampir tidak pernah menggunakan mixin.
Satu-satunya kasus penggunaan yang saya miliki saat ini untuk mixin adalah ketika Anda ingin berbagi perilaku yang menggunakan metode siklus hidup React (
componentDidMount
dll). Masalah ini diselesaikan oleh Komponen Orde Tinggi yang dibicarakan Dan Abramov di tautannya (atau dengan menggunakan warisan kelas ES6).Mixin juga sering digunakan dalam kerangka kerja, untuk membuat API kerangka kerja tersedia untuk semua komponen, dengan menggunakan fitur konteks "tersembunyi" dari React. Ini tidak akan dibutuhkan lagi baik dengan warisan kelas ES6.
Sering kali, mixin digunakan, tetapi tidak terlalu dibutuhkan dan dapat diganti dengan lebih mudah dengan bantuan sederhana.
Sebagai contoh:
Anda dapat dengan mudah melakukan refactor
LinkedStateMixin
kode sehingga sintaksnya menjadi:Apakah ada perbedaan besar?
sumber