Banyak bahasa templat memiliki pernyataan "slot" atau "menghasilkan", yang memungkinkan untuk melakukan semacam inversi kontrol untuk membungkus satu templat di dalam templat yang lain.
Angular memiliki opsi "transclude" .
Rails memiliki pernyataan hasil . Jika React.js memiliki pernyataan hasil, akan terlihat seperti ini:
var Wrapper = React.createClass({
render: function() {
return (
<div className="wrapper">
before
<yield/>
after
</div>
);
}
});
var Main = React.createClass({
render: function() {
return (
<Wrapper><h1>content</h1></Wrapper>
);
}
});
Output yang diinginkan:
<div class="wrapper">
before
<h1>content</h1>
after
</div>
Sayangnya, React.js tidak memiliki <yield/>
. Bagaimana cara menetapkan komponen Wrapper untuk mencapai hasil yang sama?
Jawaban:
Mencoba:
Lihat Beberapa Komponen: Anak - Anak dan Jenis Alat Peraga Anak-anak dalam dokumen untuk informasi lebih lanjut.
sumber
Menggunakan
children
Ini juga dikenal sebagai
transclusion
di Angular.children
adalah prop khusus di Bereaksi dan akan berisi apa yang ada di dalam tag komponen Anda (di sini<App name={name}/>
ada di dalamWrapper
, jadi itu adalahchildren
Perhatikan bahwa Anda tidak perlu menggunakan
children
, yang unik untuk komponen, dan Anda juga dapat menggunakan alat peraga normal jika Anda mau, atau mencampur alat peraga dan anak-anak:Ini sederhana dan bagus untuk banyak usecases, dan saya akan merekomendasikan ini untuk sebagian besar aplikasi konsumen.
render alat peraga
Dimungkinkan untuk meneruskan fungsi render ke komponen, pola ini umumnya disebut
render prop
, danchildren
penyangga sering digunakan untuk menyediakan panggilan balik itu.Pola ini tidak dimaksudkan untuk tata letak. Komponen pembungkus umumnya digunakan untuk menahan dan mengelola beberapa keadaan dan menyuntikkannya dalam fungsi render-nya.
Contoh penghitung:
Anda bisa menjadi lebih mewah dan bahkan menyediakan objek
Perhatikan bahwa Anda tidak perlu menggunakannya
children
, ini adalah masalah selera / API.Sampai hari ini, banyak perpustakaan menggunakan render props (React context, React-motion, Apollo ...) karena orang cenderung menemukan API ini lebih mudah daripada HOC. react-powerplug adalah kumpulan komponen render-prop sederhana. Reaksi-adopsi membantu Anda melakukan komposisi.
Komponen Tingkat Tinggi (HOC).
Sebuah Tingkat Tinggi Komponen / HOC umumnya merupakan fungsi yang mengambil komponen dan mengembalikan komponen baru.
Menggunakan Komponen Orde Tinggi dapat lebih berkinerja daripada menggunakan
children
ataurender props
, karena pembungkus dapat memiliki kemampuan untuk hubungan pendek rendering selangkah lebih maju denganshouldComponentUpdate
.Di sini kita gunakan
PureComponent
. Saat merender ulang aplikasi, jikaWrappedApp
prop nama tidak berubah dari waktu ke waktu, pembungkusnya memiliki kemampuan untuk mengatakan "Saya tidak perlu merender karena props (sebenarnya, nama) sama seperti sebelumnya". Denganchildren
solusi berbasis di atas, bahkan jika pembungkusnyaPureComponent
, itu tidak terjadi karena elemen anak-anak diciptakan kembali setiap kali orangtua membuat, yang berarti pembungkus kemungkinan akan selalu merender ulang, bahkan jika komponen yang dibungkus adalah murni. Ada plugin babel yang dapat membantu mengurangi ini dan memastikanchildren
elemen konstan dari waktu ke waktu.Kesimpulan
Komponen Tingkat Tinggi dapat memberi Anda kinerja yang lebih baik. Ini tidak terlalu rumit tetapi pada awalnya terlihat tidak ramah.
Jangan bermigrasi seluruh basis kode Anda ke HOC setelah membaca ini. Ingatlah bahwa pada jalur kritis aplikasi Anda, Anda mungkin ingin menggunakan HOC alih-alih pembungkus runtime karena alasan kinerja, terutama jika pembungkus yang sama digunakan berkali-kali, ada baiknya mempertimbangkan menjadikannya HOC.
Redux pada awalnya menggunakan pembungkus runtime
<Connect>
dan kemudian beralih ke HOCconnect(options)(Comp)
karena alasan kinerja (secara default, pembungkus itu murni dan digunakanshouldComponentUpdate
). Ini adalah ilustrasi sempurna dari apa yang ingin saya soroti dalam jawaban ini.Catatan jika suatu komponen memiliki API render-prop, umumnya mudah untuk membuat HOC di atasnya, jadi jika Anda seorang penulis lib, Anda harus menulis API render prop terlebih dahulu, dan akhirnya menawarkan versi HOC. Inilah yang Apollo lakukan dengan
<Query>
komponen render-prop, dangraphql
HOC menggunakannya.Secara pribadi, saya menggunakan keduanya, tetapi ketika ragu saya lebih suka HOC karena:
compose(hoc1,hoc2)(Comp)
) dibandingkan dengan membuat alat peragaSaya tidak ragu menggunakan / membuat versi HOC dari alat favorit saya:
Context.Consumer
compSubscribe
graphql
HOC dari Apollo sebagai gantiQuery
render propMenurut pendapat saya, kadang-kadang membuat alat peraga membuat kode lebih mudah dibaca, kadang-kadang kurang ... Saya mencoba menggunakan solusi yang paling pragmatis sesuai dengan kendala yang saya miliki. Terkadang keterbacaan lebih penting daripada penampilan, kadang tidak. Pilih dengan bijak dan jangan ikuti tren 2018 untuk mengubah segalanya menjadi render-props.
sumber
Selain jawaban Sophie, saya juga menemukan kegunaan dalam mengirimkan tipe komponen anak, melakukan sesuatu seperti ini:
sumber
delegate
, bagaimana Anda menemukannya?