Saya memiliki struktur berikut:
FormEditor
- memegang beberapa FieldEditor
FieldEditor
- mengedit bidang formulir dan menyimpan berbagai nilai tentang hal itu dalam keadaan itu
Ketika sebuah tombol diklik di dalam FormEditor, saya ingin dapat mengumpulkan informasi tentang bidang dari semua FieldEditor
komponen, informasi yang dalam keadaan mereka, dan memiliki semuanya di dalam FormEditor.
Saya mempertimbangkan untuk menyimpan informasi tentang bidang di luar FieldEditor
negara bagian dan meletakkannya FormEditor
di negara bagian sebagai gantinya. Namun, itu perlu FormEditor
mendengarkan setiap FieldEditor
komponennya saat mereka mengubah dan menyimpan informasi mereka dalam keadaan itu.
Tidak bisakah saya mengakses status anak-anak saja? Apakah ini ideal?
sumber
FieldEditor
secara terpisah, menyimpan statusnya dalamFormEditor
suara bagus. Jika ini masalahnya, mesinFieldEditor
virtual Anda akan dibuat berdasarkan yangprops
disahkan oleh editor formulir mereka, bukan milik merekastate
. Cara yang lebih kompleks namun fleksibel adalah membuat serializer yang melewati semua wadah anak-anak dan menemukan semuaFormEditor
instance di antara mereka dan membuat serial mereka menjadi objek JSON. Objek JSON dapat secara opsional bersarang (lebih dari satu tingkat) berdasarkan tingkat bersarang instance di editor formulir.Jawaban:
Jika Anda sudah memiliki penangan onChange untuk masing-masing FieldEditors, saya tidak melihat mengapa Anda tidak bisa hanya memindahkan status ke komponen FormEditor dan hanya meneruskan panggilan balik dari sana ke FieldEditor yang akan memperbarui negara induk. Itu sepertinya cara yang lebih React-y untuk melakukannya, bagiku.
Sesuatu di sepanjang garis ini mungkin:
Asli - versi pra-kait:
Tampilkan cuplikan kode
sumber
myAPI.SaveStuff(this.state);
. Jika Anda menguraikan lebih banyak, mungkin saya bisa memberikan jawaban yang lebih baik :)Tepat sebelum saya masuk ke detail tentang bagaimana Anda dapat mengakses status komponen anak, pastikan untuk membaca jawaban Markus-ipse mengenai solusi yang lebih baik untuk menangani skenario khusus ini.
Jika Anda memang ingin mengakses status anak-anak komponen, Anda dapat menetapkan properti yang dipanggil
ref
untuk setiap anak. Sekarang ada dua cara untuk mengimplementasikan referensi: MenggunakanReact.createRef()
dan ref callback.Menggunakan
React.createRef()
Saat ini cara yang direkomendasikan untuk menggunakan referensi pada Bereaksi 16.3 (Lihat dokumen untuk info lebih lanjut). Jika Anda menggunakan versi sebelumnya, lihat di bawah tentang referensi panggilan balik.
Anda harus membuat referensi baru di konstruktor komponen induk Anda dan kemudian memberikannya kepada anak melalui
ref
atribut.Untuk mengakses referensi semacam ini, Anda harus menggunakan:
Ini akan mengembalikan instance komponen yang dipasang sehingga Anda dapat menggunakannya
currentFieldEditor1.state
untuk mengakses keadaan.Hanya catatan singkat untuk mengatakan bahwa jika Anda menggunakan referensi ini pada simpul DOM bukan komponen (mis
<div ref={this.divRef} />
) Makathis.divRef.current
akan mengembalikan elemen DOM yang mendasarinya alih-alih instance komponen.Referensi Callback
Properti ini mengambil fungsi panggilan balik yang diberikan referensi ke komponen terlampir. Callback ini dijalankan segera setelah komponen dipasang atau dilepas.
Sebagai contoh:
Dalam contoh-contoh ini referensi disimpan pada komponen induk. Untuk memanggil komponen ini dalam kode Anda, Anda dapat menggunakan:
dan kemudian gunakan
this.fieldEditor1.state
untuk mendapatkan status.Satu hal yang perlu diperhatikan, pastikan komponen anak Anda telah dirender sebelum Anda mencoba mengaksesnya ^ _ ^
Seperti di atas, jika Anda menggunakan referensi ini pada simpul DOM alih-alih komponen (mis.
<div ref={(divRef) => {this.myDiv = divRef;}} />
) Makathis.divRef
akan mengembalikan elemen DOM yang mendasarinya alih-alih instance komponen.Informasi lebih lanjut
Jika Anda ingin membaca lebih lanjut tentang properti ref React, periksa halaman ini dari Facebook.
Pastikan Anda membaca bagian " Don't Overuse Refs " yang mengatakan bahwa Anda tidak boleh menggunakan anak itu
state
untuk "mewujudkan sesuatu".Semoga ini bisa membantu ^ _ ^
Sunting: Menambahkan
React.createRef()
metode untuk membuat referensi. Kode ES5 dihapus.sumber
this.refs.yourComponentNameHere
. Saya merasa bermanfaat untuk mengubah status melalui fungsi. Contoh:this.refs.textInputField.clearInput();
props
danstate
. Namun, mereka seharusnya tidak menjadi abstraksi Anda untuk mengalirkan data melalui aplikasi Anda. Secara default, gunakan aliran data Reaktif dan simpanref
untuk kasus penggunaan yang secara inheren non-reaktif.connected
komponen Redux ?Ini tahun 2020 dan banyak dari Anda akan datang ke sini mencari solusi yang sama tetapi dengan Hooks (Mereka hebat!) Dan dengan pendekatan terbaru dalam hal kebersihan kode dan sintaksis.
Jadi seperti jawaban sebelumnya telah menyatakan, pendekatan terbaik untuk masalah semacam ini adalah mempertahankan keadaan di luar komponen anak
fieldEditor
. Anda dapat melakukannya dengan berbagai cara.Yang paling "kompleks" adalah dengan konteks global (keadaan) yang dapat diakses dan dimodifikasi oleh orang tua dan anak-anak. Ini adalah solusi hebat ketika komponen sangat dalam di hierarki pohon dan jadi mahal untuk mengirim alat peraga di setiap tingkat.
Dalam hal ini saya pikir itu tidak layak, dan pendekatan yang lebih sederhana akan membawa kita hasil yang kita inginkan, hanya menggunakan yang kuat
React.useState()
.Pendekatan dengan kait React.useState (), jauh lebih sederhana daripada dengan komponen Class
Seperti yang dikatakan, kami akan menangani perubahan dan menyimpan data komponen anak
fieldEditor
kami di induk kamifieldForm
. Untuk melakukan itu, kami akan mengirimkan referensi ke fungsi yang akan menangani dan menerapkan perubahan padafieldForm
kondisi, Anda dapat melakukannya dengan:Catat itu
React.useState({})
akan mengembalikan array dengan posisi 0 menjadi nilai yang ditentukan pada panggilan (objek kosong dalam kasus ini), dan posisi 1 menjadi referensi ke fungsi yang mengubah nilai.Sekarang dengan komponen anak
FieldEditor
,, Anda bahkan tidak perlu membuat fungsi dengan pernyataan kembali, konstanta lean dengan fungsi panah akan dilakukan!Aaaa dan kita selesai, tidak lebih, hanya dengan dua komponen fungsional lendir ini kita memiliki tujuan akhir kita "mengakses"
FieldEditor
nilai anak kita dan memamerkannya di orangtua kita.Anda dapat memeriksa jawaban yang diterima dari 5 tahun yang lalu dan melihat bagaimana Hooks membuat React code leaner (By a lot!).
Semoga jawaban saya membantu Anda mempelajari dan memahami lebih lanjut tentang Hooks, dan jika Anda ingin memeriksa contoh yang berfungsi di sini, itu .
sumber
Sekarang Anda dapat mengakses status InputField yang merupakan anak dari FormEditor.
Pada dasarnya setiap kali ada perubahan dalam keadaan bidang input (anak) kami mendapatkan nilai dari objek acara dan kemudian meneruskan nilai ini ke Parent di mana dalam keadaan di Parent diatur.
Pada klik tombol kita hanya mencetak keadaan bidang Input.
Poin kuncinya di sini adalah bahwa kami menggunakan properti untuk mendapatkan id / nilai Field Input dan juga untuk memanggil fungsi yang ditetapkan sebagai atribut pada Field Input sementara kami menghasilkan field Input anak yang dapat digunakan kembali.
sumber
Seperti jawaban sebelumnya mengatakan, cobalah untuk memindahkan status ke komponen teratas dan memodifikasi status melalui panggilan balik yang diteruskan ke anak-anaknya.
Dalam hal ini Anda benar-benar perlu akses ke keadaan anak yang dinyatakan sebagai komponen fungsional (kait) Anda dapat mendeklarasikan ref dalam komponen induk, kemudian menyebarkannya sebagai ref atribut untuk anak tetapi Anda perlu menggunakan React.forwardRef dan kemudian hook useImperativeHandle untuk mendeklarasikan fungsi yang bisa Anda panggil di komponen induk.
Lihatlah contoh berikut:
Maka Anda harus bisa mendapatkan myState di komponen Induk dengan menelepon:
myRef.current.getMyState();
sumber