Struktur saya terlihat sebagai berikut:
Component 1
- |- Component 2
- - |- Component 4
- - - |- Component 5
Component 3
Komponen 3 harus menampilkan beberapa data tergantung pada keadaan Komponen 5. Karena alat peraga tidak dapat diubah, saya tidak bisa hanya menyimpannya dalam Komponen 1 dan meneruskannya, bukan? Dan ya, saya sudah membaca tentang redux, tetapi tidak ingin menggunakannya. Saya berharap bahwa mungkin untuk menyelesaikannya hanya dengan bereaksi. Apakah aku salah?
<MyChildComponent setState={(s,c)=>{this.setState(s, c)}} />
jika Anda akan menggunakan retasan ini, pastikan Anda mendukung panggilan balik.this.setState(p)
? Saya mencoba tanpa mereka dan tampaknya berhasil (Saya sangat baru untuk Bereaksi)Jawaban:
Untuk komunikasi anak-orang tua Anda harus melewati fungsi pengaturan negara dari orang tua ke anak, seperti ini
Dengan cara ini anak dapat memperbarui keadaan orang tua dengan panggilan fungsi yang diteruskan dengan alat peraga.
Tetapi Anda harus memikirkan kembali struktur komponen Anda, karena seperti yang saya pahami komponen 5 dan 3 tidak terkait.
Salah satu solusi yang mungkin adalah membungkusnya dalam komponen level yang lebih tinggi yang akan berisi keadaan komponen 1 dan 3. Komponen ini akan mengatur status level yang lebih rendah melalui alat peraga.
sumber
this.handler = this.handler.bind(this)
konstruktor,this
di dalamhandler
fungsi akan mereferensikan penutupan fungsi, bukan kelas. Jika tidak ingin mengikat semua fungsi Anda di konstruktor, ada dua cara lagi untuk mengatasinya dengan menggunakan fungsi panah. Anda bisa menulis handler klik sebagaionClick={()=> this.setState(...)}
, atau Anda dapat menggunakan inisialisasi properti bersama dengan fungsi panah seperti yang dijelaskan di sini babeljs.io/blog/2015/06/07/react-on-es6-plus di bawah "Fungsi panah"Saya menemukan solusi kerja berikut untuk meneruskan argumen fungsi onClick dari child ke komponen induk:
Versi dengan meneruskan metode ()
Lihatlah JSFIDDLE
Versi dengan melewatkan fungsi Panah
Lihatlah JSFIDDLE
sumber
<ChildB handleToUpdate = {handleToUpdate.bind(this)} />
Mengapa harus mengikat lagi?this
dipanggil di dalam anak,this
merujuk pada keadaan orang tua dan bukan anak. Ini adalah penutupan yang terbaik!Saya ingin mengucapkan terima kasih kepada jawaban yang paling banyak dipilih untuk memberi saya ide masalah saya sendiri pada dasarnya variasi dengan fungsi panah dan melewati param dari komponen anak:
Semoga ini bisa membantu seseorang.
sumber
this
fungsi tanda panah mengacu pada konteks induk (yaituParent
kelas).Saya suka jawaban mengenai fungsi lewat sekitar, itu teknik yang sangat berguna.
Di sisi lain Anda juga dapat mencapai ini menggunakan pub / sub atau menggunakan varian, operator, seperti Flux . Teorinya super sederhana, minta komponen 5 mengirim pesan yang komponen 3 dengarkan. Komponen 3 kemudian memperbarui keadaannya yang memicu render. Ini membutuhkan komponen stateful, yang, tergantung pada sudut pandang Anda, mungkin atau mungkin tidak anti-pola. Saya menentang mereka secara pribadi dan lebih suka sesuatu yang lain mendengarkan pengiriman dan mengubah status dari atas-ke-bawah (Redux melakukan ini, tetapi menambahkan terminologi tambahan).
Bundel pengirim dengan Flux sangat sederhana, ia hanya mendaftarkan panggilan balik dan memanggil mereka ketika ada pengiriman, melewati isi pada pengiriman (dalam contoh singkat di atas tidak ada
payload
dengan pengiriman, hanya sebuah id pesan). Anda dapat mengadaptasi ini ke pub / sub tradisional (mis. Menggunakan EventEmitter dari acara, atau versi lain) dengan sangat mudah jika itu lebih masuk akal bagi Anda.sumber
var Dispatcher = require( 'flux' ).Dispatcher
Saya menemukan solusi kerja berikut untuk meneruskan argumen fungsi onClick dari child ke komponen induk dengan param:
kelas induk:
kelas anak:
sumber
param1
hanya ditampilkan pada konsol tidak dapat menetapkan itu selalu ditugaskantrue
Ketika Anda perlu berkomunikasi antara anak ke orang tua di tingkat bawah, maka lebih baik memanfaatkan konteks . Dalam komponen induk, tentukan konteks yang dapat dipanggil oleh anak seperti
Anda dapat menemukan proyek Demo di repo
sumber
Tampaknya kita hanya bisa meneruskan data dari orangtua ke anak karena reaksi mempromosikan Aliran Data Searah, tetapi untuk membuat pembaruan orangtua itu sendiri ketika sesuatu terjadi dalam "komponen anak" -nya, kita biasanya menggunakan apa yang disebut "fungsi panggilan balik".
Dalam contoh ini kita dapat membuat data pass dari SubChild -> Child -> Parent dengan meneruskan fungsi ke Child langsungnya.
sumber
Saya telah menggunakan jawaban teratas dari halaman ini berkali-kali, tetapi ketika mempelajari Bereaksi, saya telah menemukan cara yang lebih baik untuk melakukan itu, tanpa mengikat dan tanpa fungsi inline di dalam alat peraga.
Lihat saja di sini:
Kuncinya ada di fungsi panah:
Anda dapat membaca lebih lanjut di sini . Semoga ini bermanfaat bagi seseorang =)
sumber
-Kita dapat membuat ParentComponent dan dengan metode handleInputChange untuk memperbarui status ParentComponent. Impor komponen ChildComponent dan kami melewati dua alat peraga dari komponen induk ke anak, ie.handleInputChange, fungsi dan jumlah.
Sekarang kita buat file ChildComponent dan simpan sebagai ChildComponent.jsx. Komponen ini tidak memiliki kewarganegaraan karena komponen anak tidak memiliki status. Kami menggunakan pustaka jenis prop untuk memeriksa jenis props.
sumber
Jika skenario yang sama ini tidak menyebar di mana-mana Anda dapat menggunakan konteks Bereaksi, khususnya jika Anda tidak ingin memperkenalkan semua overhead yang diperkenalkan oleh perpustakaan manajemen negara. Plus, lebih mudah dipelajari. Tapi hati-hati, Anda bisa menggunakannya secara berlebihan dan mulai menulis kode yang buruk. Pada dasarnya Anda mendefinisikan komponen Wadah (yang akan menampung dan mempertahankan bagian keadaan itu untuk Anda) membuat semua komponen tertarik untuk menulis / membaca bagian data anak-anaknya (tidak harus anak langsung)
https://reactjs.org/docs/context.html
Anda juga bisa menggunakan Bereaksi polos dengan benar.
lulus doSomethingAbout5 hingga Komponen 1
Jika ini masalah umum, Anda harus mulai berpikir memindahkan seluruh keadaan aplikasi ke tempat lain. Anda memiliki beberapa opsi, yang paling umum adalah:
https://redux.js.org/
https://facebook.github.io/flux/
Pada dasarnya, alih-alih mengelola status aplikasi pada komponen Anda, Anda mengirim perintah ketika sesuatu terjadi untuk mendapatkan status diperbarui. Komponen menarik status dari wadah ini juga sehingga semua data terpusat. Ini tidak berarti tidak bisa menggunakan keadaan lokal lagi, tapi itu topik yang lebih maju.
sumber
jadi, jika Anda ingin memperbarui komponen induk,
Di sini onChange adalah atribut dengan metode "handler" yang terikat pada instance itu. kami melewati penangan metode ke komponen kelas Anak, untuk menerima melalui properti onChange dalam argumen properti.
Atribut onChange akan ditetapkan dalam objek props seperti ini:
dan diteruskan ke komponen anak
Jadi komponen Child dapat mengakses nilai nama dalam objek props seperti props.onChange ini
Ini dilakukan melalui penggunaan render props.
Sekarang komponen Child memiliki tombol "Klik" dengan event onclick diatur untuk memanggil metode handler yang diteruskan melalui onChnge dalam objek argumen propsnya. Jadi sekarang this.props.onChange in Child memegang metode output di kelas Induk Referensi dan kredit: Bits and Pieces
sumber
Ini caraku melakukannya.
sumber
Sebagian besar jawaban yang diberikan di atas adalah untuk desain berbasis React.Component. Jika Anda menggunakan
useState
pemutakhiran terbaru dari React library, ikuti jawaban inisumber
sumber