Di bagian terjemahan React tutorial hari ini, kita akan berbicara tentang properti komponen. Ini adalah salah satu konsep terpenting yang tercermin dalam perpustakaan ini.

→ 
Bagian 1: ikhtisar kursus, alasan popularitas React, ReactDOM dan JSX→ 
Bagian 2: komponen fungsional→ 
Bagian 3: file komponen, struktur proyek→ 
Bagian 4: komponen induk dan anak→ 
Bagian 5: mulai bekerja pada aplikasi TODO, dasar-dasar gaya→ 
Bagian 6: tentang beberapa fitur kursus, JSX dan JavaScript→ 
Bagian 7: gaya inline→ 
Bagian 8: terus bekerja pada aplikasi TODO, terbiasa dengan sifat-sifat komponen→ 
Bagian 9: properti komponen→ 
Bagian 10: Workshop bekerja dengan properti komponen dan gaya→ 
Bagian 11: pembuatan markup dinamis dan metode susunan peta→ 
Bagian 12: lokakarya, pekerjaan tahap ketiga pada aplikasi TODO→ 
Bagian 13: komponen berbasis kelas→ 
Bagian 14: lokakarya tentang komponen berbasis kelas, status komponen→ 
Bagian 15: bengkel kesehatan komponen→ 
Bagian 16: tahap keempat dari pengerjaan aplikasi TODO, penanganan acara→ 
Bagian 17: tahap kelima bekerja pada aplikasi TODO, memodifikasi status komponen→ 
Bagian 18: tahap keenam dari pengerjaan aplikasi TODO→ 
Bagian 19: metode siklus hidup komponenBagian 20: pelajaran pertama dalam rendering bersyarat→ 
Bagian 21: pelajaran kedua dan lokakarya tentang rendering bersyarat→ 
Bagian 22: tahap ketujuh bekerja pada aplikasi TODO, mengunduh data dari sumber eksternal→ 
Bagian 23: pelajaran pertama tentang bekerja dengan formulir→ 
Bagian 24: Pelajaran Bentuk Kedua→ 
Bagian 25: Workshop bekerja dengan formulir→ 
Bagian 26: arsitektur aplikasi, pola Container / Komponen→ 
Bagian 27: proyek kursusPelajaran 19. Properti Komponen dalam Bereaksi
→ 
AsliBuat proyek baru menggunakan 
create-react-app dan ubah kode beberapa file standar dari folder 
src .
Berikut adalah kode untuk file 
index.js :
 import React from "react" import ReactDOM from "react-dom" import "./index.css" import App from "./App" ReactDOM.render(<App />, document.getElementById("root")) 
Berikut adalah gaya yang dijelaskan dalam file 
index.css :
 body { margin: 0; } .contacts { display: flex; flex-wrap: wrap; } .contact-card { flex-basis: 250px; margin: 20px; } .contact-card > img { width: 100%; height: auto; } .contact-card > h3 { text-align: center; } .contact-card > p { font-size: 12px; } 
Berikut adalah kode yang ditemukan di file 
App.js :
 import React from "react" function App() {   return (       <div className="contacts">           <div className="contact-card">               <img align="center" src="http://placekitten.com/300/200"/>               <h3><font color="#3AC1EF">▍Mr. Whiskerson</font></h3>               <p>Phone: (212) 555-1234</p>               <p>Email: mr.whiskaz@catnap.meow</p>           </div>                     <div className="contact-card">               <img align="center" src="http://placekitten.com/400/200"/>               <h3><font color="#3AC1EF">▍Fluffykins</font></h3>               <p>Phone: (212) 555-2345</p>               <p>Email: fluff@me.com</p>           </div>                     <div className="contact-card">               <img align="center" src="http://placekitten.com/400/300"/>               <h3><font color="#3AC1EF">▍Destroyer</font></h3>               <p>Phone: (212) 555-3456</p>               <p>Email: ofworlds@yahoo.com</p>           </div>                     <div className="contact-card">               <img align="center" src="http://placekitten.com/200/100"/>               <h3><font color="#3AC1EF">▍Felix</font></h3>               <p>Phone: (212) 555-4567</p>               <p>Email: thecat@hotmail.com</p>           </div>       </div>   ) } export default App 
Beginilah tampilan aplikasi ini di browser.
Halaman aplikasi di browserSetelah menganalisis kode dan tampilan aplikasi, kita dapat menyimpulkan bahwa alangkah baiknya menggunakan komponen khusus untuk menampilkan kartu dengan informasi tentang hewan. Sekarang elemen-elemen ini dibentuk melalui komponen 
App . Mengingat apa yang kita bicarakan di kelas sebelumnya, Anda dapat melangkah lebih jauh - pikirkan komponen universal yang dapat dikustomisasi dengan mengirimkan atribut atau properti ke dalamnya.
Dalam aplikasi kami ada kartu dengan gambar kucing, nama dan informasi kontak pemiliknya (atau mungkin sendiri) - telepon dan alamat email. Untuk membuat komponen yang nantinya akan menjadi dasar untuk semua kartu tersebut, Anda dapat mengambil salah satu fragmen markup yang dikembalikan oleh komponen 
App . Sebagai contoh - ini:
 <div className="contact-card">   <img align="center" src="http://placekitten.com/300/200"/>   <h3><font color="#3AC1EF">▍Mr. Whiskerson</font></h3>   <p>Phone: (212) 555-1234</p>   <p>Email: mr.whiskaz@catnap.meow</p> </div> 
App mengembalikan empat blok tersebut, yang masing-masing dapat digunakan untuk membuat komponen independen, tetapi pendekatan ini tidak cocok untuk kita. Oleh karena itu, kami akan membuat satu komponen yang akan menjadi dasar dari semua kartu yang ditampilkan oleh aplikasi. Untuk melakukan ini, buat file komponen baru di folder 
src - 
ContactCard.js dan masukkan kode yang mengembalikan elemen 
<div> yang dikembalikan oleh komponen 
App , kode yang diberikan di atas. Berikut adalah kode untuk komponen 
ContactCard :
 import React from "react" function ContactCard() {   return (       <div className="contact-card">           <img align="center" src="http://placekitten.com/300/200"/>           <h3><font color="#3AC1EF">▍Mr. Whiskerson</font></h3>           <p>Phone: (212) 555-1234</p>           <p>Email: mr.whiskaz@catnap.meow</p>       </div>   ) } export default ContactCard 
Jelas bahwa jika Anda membuat beberapa instance dari komponen ini, maka semuanya akan berisi data yang sama, karena data ini di-kode dalam kode komponen. Dan kami ingin itu, ketika membuat contoh berbeda dari komponen ini, kami dapat menyesuaikan data yang ditampilkan olehnya. Intinya adalah bahwa komponen tersebut dapat melewati properti tertentu, yang kemudian dapat ia gunakan.
Kami bekerja dengan komponen fungsional, yang merupakan fungsi JS biasa, di mana, berkat perpustakaan Bereaksi, konstruksi khusus dapat digunakan. Seperti yang Anda ketahui, fungsi dapat mengambil argumen, meskipun mereka dapat digunakan tanpa argumen. 
ContactCard komponen 
ContactCard kami, dalam bentuk yang sekarang ada, dapat berupa fungsi sederhana sehingga, tanpa menerima apa pun, cukup kembalikan jumlah dari dua angka:
 function addNumbers() {   return 1 + 1 } 
Ini dapat digunakan untuk mengetahui jumlah angka 1 dan 1, tetapi, misalnya, untuk menambahkan 1 dan 2, menggunakan fungsi yang tidak menerima input apa pun, kita harus menulis fungsi baru. Sangat jelas bahwa pendekatan ini akan menyebabkan ketidaknyamanan yang sangat besar jika Anda perlu menambahkan angka yang berbeda, jadi dalam situasi seperti itu akan lebih bijaksana untuk membuat fungsi universal untuk menambahkan angka yang mengambil dua angka dan mengembalikan jumlahnya:
 function addNumbers(a, b) {   return a + b } 
Apa fungsi yang dikembalikan akan tergantung pada argumen apa yang diteruskan ke sana ketika dipanggil. Dengan membuat komponen Bereaksi, kita dapat melakukan dengan cara yang persis sama.
Kami mengimpor komponen 
App.js ContactCard dan mengembalikan empat 
ContactCard , tanpa menghapus kode yang membentuk kartu pada halaman aplikasi untuk saat ini:
 import React from "react" import ContactCard from "./ContactCard" function App() {   return (       <div className="contacts">           <ContactCard />           <ContactCard />           <ContactCard />           <ContactCard />           <div className="contact-card">               <img align="center" src="http://placekitten.com/300/200"/>               <h3><font color="#3AC1EF">▍Mr. Whiskerson</font></h3>               <p>Phone: (212) 555-1234</p>               <p>Email: mr.whiskaz@catnap.meow</p>           </div>                     <div className="contact-card">               <img align="center" src="http://placekitten.com/400/200"/>               <h3><font color="#3AC1EF">▍Fluffykins</font></h3>               <p>Phone: (212) 555-2345</p>               <p>Email: fluff@me.com</p>           </div>                     <div className="contact-card">               <img align="center" src="http://placekitten.com/400/300"/>               <h3><font color="#3AC1EF">▍Destroyer</font></h3>               <p>Phone: (212) 555-3456</p>               <p>Email: ofworlds@yahoo.com</p>           </div>                     <div className="contact-card">               <img align="center" src="http://placekitten.com/200/100"/>               <h3><font color="#3AC1EF">▍Felix</font></h3>               <p>Phone: (212) 555-4567</p>               <p>Email: thecat@hotmail.com</p>           </div>       </div>   ) } export default App 
Sekarang mari kita bekerja pada kode yang digunakan untuk instantiate komponen 
ContactCard . Dengan membuat elemen HTML biasa, kita dapat menyesuaikan atribut mereka yang memengaruhi perilaku dan penampilan mereka. Nama-nama atribut ini dikodekan oleh standar. Dalam hal komponen, Anda dapat menggunakan pendekatan yang sama persis, dengan satu-satunya perbedaan adalah bahwa kami menciptakan sendiri nama atribut, dan memutuskan sendiri bagaimana mereka akan digunakan dalam kode komponen.
Masing-masing kartu berisi empat informasi, yang, dari kartu ke kartu, dapat berubah. Ini adalah gambar kucing dan namanya, serta alamat telepon dan email. Biarkan nama kucing terkandung di properti 
name , alamat gambar di properti 
imgURL , telepon di properti 
phone , dan alamat email di properti 
email .
Kami menyetel properti ini ke instance komponen 
ContactCard dan, saat kami mentransfer data dari kode yang sudah ada di 
App , kami akan menghapus fragmen yang sesuai. Akibatnya, kode komponen 
App akan terlihat seperti ini:
 import React from "react" import ContactCard from "./ContactCard" function App() {   return (       <div className="contacts">           <ContactCard               name="Mr. Whiskerson"               imgUrl="http://placekitten.com/300/200"               phone="(212) 555-1234"               email="mr.whiskaz@catnap.meow"           />                     <ContactCard               name="Fluffykins"               imgUrl="http://placekitten.com/400/200"               phone="(212) 555-2345"               email="fluff@me.com"           />                     <ContactCard               name="Destroyer"               imgUrl="http://placekitten.com/400/300"               phone="(212) 555-3456"               email="ofworlds@yahoo.com"           />                     <ContactCard               name="Felix"               imgUrl="http://placekitten.com/200/100"               phone="(212) 555-4567"               email="thecat@hotmail.com"           />                 </div>   ) } export default App 
Benar, hanya transfer properti ke komponen tidak cukup untuk digunakan di dalamnya. Halaman, yang akan dibentuk oleh komponen 
App atas, akan berisi empat kartu identik, data yang diatur dalam kode komponen 
ContactCard , yang belum tahu apa yang harus dilakukan dengan properti yang ditransfer ke dalamnya.
Data kartu hardcoded dalam kode, komponen tidak dapat bekerja dengan properti yang diteruskan ke sanaJadi sekarang saatnya untuk berbicara tentang bagaimana komponen 
ContactCard dapat bekerja dengan properti yang diteruskan ke dalamnya ketika ia dipakai.
Kami melanjutkan untuk menyelesaikan masalah ini dengan menunjukkan, ketika mendeklarasikan fungsi 
ContactCard , ia menerima parameter 
props . Dalam hal ini, kode komponen akan terlihat seperti ini:
 import React from "react" function ContactCard(props) {   return (       <div className="contact-card">           <img align="center" src="http://placekitten.com/300/200"/>           <h3><font color="#3AC1EF">▍Mr. Whiskerson</font></h3>           <p>Phone: (212) 555-1234</p>           <p>Email: mr.whiskaz@catnap.meow</p>       </div>   ) } export default ContactCard 
Sebenarnya, parameter ini bisa disebut apa saja yang Anda suka, tetapi dalam Bereaksi itu biasa menyebutnya 
props , dan properti yang kita bicarakan di sini sering disebut hanya "props".
Parameter 
props adalah objek. Properti objek ini adalah properti yang diteruskan ke komponen saat instantiated. Misalnya, di objek properti kami akan ada properti properti. 
props.name berisi nama kucing yang diteruskan ke komponen saat ia dipakai. Selain itu, ia akan memiliki properti 
props.imgUrl , 
props.phone , 
props.email . Untuk memverifikasi ini, tambahkan perintah 
console.log(props) di awal fungsi 
ContactCard .
 import React from "react" function ContactCard(props) {   console.log(props)   return (       <div className="contact-card">           <img align="center" src="http://placekitten.com/300/200"/>           <h3><font color="#3AC1EF">▍Mr. Whiskerson</font></h3>           <p>Phone: (212) 555-1234</p>           <p>Email: mr.whiskaz@catnap.meow</p>       </div>   ) } export default ContactCard 
Ini akan membawa objek 
props diterima oleh komponen ke konsol.
Objek alat peraga konsolDi sini Anda dapat melihat output dari empat objek dari 
ContactCard.js . Ada begitu banyak dari mereka karena kami membuat empat contoh komponen 
ContactCard .
Semua ini memberi kita kesempatan untuk digunakan dalam kode komponen, alih-alih nilai-nilai hard-coded, apa yang diteruskan ke sana saat membuat instance-nya, tersedia dalam bentuk 
props objek 
props .
Bagaimana jika kita mencoba menggunakan properti 
props.imgUrl ini:
 <img align="center" src=props.imgUrl/> 
Sekilas, konstruksi seperti itu mungkin berhasil, tetapi ingat bahwa di sini kita perlu menggunakan entitas dari JavaScript dalam kode JSX. Kami berbicara tentang bagaimana hal ini dilakukan di salah satu kelas sebelumnya. Yaitu, dalam kasus kami, properti objek harus dilampirkan dalam kurung:
 <img align="center" src={props.imgUrl}/> 
Kami memproses elemen-elemen lain yang dikembalikan oleh komponen dengan cara yang sama, setelah itu kodenya akan mengambil bentuk berikut:
 import React from "react" function ContactCard(props) {   return (       <div className="contact-card">           <img align="center" src={props.imgUrl}/>           <h3><font color="#3AC1EF">▍{props.name}</font></h3>           <p>Phone: {props.phone}</p>           <p>Email: {props.email}</p>       </div>   ) } export default ContactCard 
Harap perhatikan bahwa di bidang untuk menampilkan telepon dan alamat email, kami meninggalkan teks 
Phone: and 
Email: dengan spasi mengikutinya, karena teks-teks ini digunakan di semua komponen. Jika sekarang Anda melihat halaman aplikasi, Anda akan melihat bahwa itu berisi empat kartu yang berbeda.
Halaman dibentuk menggunakan komponen universalKomponen kami hanya menerima empat properti. Bagaimana jika suatu komponen harus lulus, misalnya, 50 properti? Mungkin melewati masing-masing properti seperti garis terpisah, seperti yang dilakukan dalam komponen 
App , akan merepotkan. Dalam kasus seperti itu, Anda dapat menggunakan cara lain untuk mentransfer properti ke komponen. Terdiri dari fakta bahwa saat membuat turunan komponen, ia tidak ditransfer daftar properti, tetapi objek dengan properti. Begini tampilannya pada contoh komponen pertama:
 import React from "react" import ContactCard from "./ContactCard" function App() {   return (       <div className="contacts">           <ContactCard               contact={{                 name: "Mr. Whiskerson",                 imgUrl: "http://placekitten.com/300/200",                 phone: "(212) 555-1234",                 email: "mr.whiskaz@catnap.meow"               }}           />                     <ContactCard               name="Fluffykins"               imgUrl="http://placekitten.com/400/200"               phone="(212) 555-2345"               email="fluff@me.com"           />                     <ContactCard               name="Destroyer"               imgUrl="http://placekitten.com/400/300"               phone="(212) 555-3456"               email="ofworlds@yahoo.com"           />                     <ContactCard               name="Felix"               imgUrl="http://placekitten.com/200/100"               phone="(212) 555-4567"               email="thecat@hotmail.com"           />                 </div>   ) } export default App 
Ini bukan untuk mengatakan bahwa pendekatan ini secara signifikan mengurangi jumlah kode yang digunakan untuk menggambarkan instance komponen. Faktanya adalah bahwa sifat-sifat yang diteruskan ke komponen masih sulit dikodekan dalam kode, meskipun kami hanya meneruskan satu komponen ke komponen. Keuntungan dari pendekatan ini dapat dirasakan dalam situasi di mana data untuk komponen diperoleh dari beberapa sumber eksternal. Misalnya, dari file JSON.
Selama modifikasi kode komponen 
App digunakan untuk membuat instance pertama dari komponen 
ContactCard , operasi aplikasi yang benar terganggu. Beginilah tampilan halamannya sekarang.
Kerusakan aplikasiBagaimana ini bisa diperbaiki? Untuk memahami hal ini, akan berguna untuk menganalisis apa yang terjadi dengan menggunakan perintah 
console.log(props) .
Analisis objek alat peragaSeperti yang Anda lihat, objek 
props dari komponen pertama berbeda dari objek yang sama dari komponen kedua dan selanjutnya.
Dalam komponen 
ContactCard kami menggunakan objek 
props berdasarkan asumsi bahwa ia memiliki 
name , 
imgUrl , dan properti lainnya. Di sini, komponen pertama hanya menerima satu properti - 
contact . Ini mengarah pada fakta bahwa objek 
props hanya memiliki satu properti - 
contact , yang merupakan objek, dan kode komponen tidak memberikan pekerjaan dengan struktur seperti itu.
Mengubah komponen kita menjadi model dengan menggunakan hanya satu properti dari objek 
contact mengandung properti lain cukup sederhana. Untuk melakukan ini, misalnya, untuk mengakses properti 
name , cukup menggunakan konstruk formulir 
props.contact.name dalam kode komponen. Desain serupa memungkinkan kita bekerja dengan baik dengan properti lain yang kita butuhkan.
Mari mendaur ulang kode komponen, dengan mempertimbangkan transfernya dari satu 
contact objek-properti yang mengandung properti lain:
 import React from "react" function ContactCard(props) {   console.log(props)   return (       <div className="contact-card">           <img align="center" src={props.contact.imgUrl}/>           <h3><font color="#3AC1EF">▍{props.contact.name}</font></h3>           <p>Phone: {props.contact.phone}</p>           <p>Email: {props.contact.email}</p>       </div>   ) } export default ContactCard 
Komponen pertama sekarang harus ditampilkan secara normal, tetapi kami tidak akan melihat ini pada tahap proyek ini, karena sistem akan memberi tahu kami banyak kesalahan yang terkait dengan fakta bahwa beberapa contoh komponen 
ContactCard dibuat dalam komponen 
App tidak menerima properti- objek 
contact . Saat menjalankan kode, properti ini 
undefined akan 
undefined . Akibatnya, upaya dilakukan untuk merujuk ke properti tertentu dari nilai yang 
undefined , yang mengarah ke kesalahan. Kami akan memperbaikinya dengan memproses kode komponen 
App bertanggung jawab untuk pembentukan komponen 
ContactCard :
 import React from "react" import ContactCard from "./ContactCard" function App() {   return (       <div className="contacts">           <ContactCard               contact={{                 name: "Mr. Whiskerson",                 imgUrl: "http://placekitten.com/300/200",                 phone: "(212) 555-1234",                 email: "mr.whiskaz@catnap.meow"               }}           />                     <ContactCard               contact={{                 name: "Fluffykins",                 imgUrl: "http://placekitten.com/400/200",                 phone: "(212) 555-2345",                 email: "fluff@me.com"               }}           />                     <ContactCard               contact={{                 name: "Destroyer",                 imgUrl: "http://placekitten.com/400/300",                 phone: "(212) 555-3456",                 email: "ofworlds@yahoo.com"               }}           />                     <ContactCard               contact={{                 name: "Felix",                 imgUrl: "http://placekitten.com/200/100",                 phone: "(212) 555-4567",                 email: "thecat@hotmail.com"               }}           />                 </div>   ) } export default App 
Sekarang halaman aplikasi akan terlihat sama seperti sebelumnya.
Seperti biasa, Anda disarankan untuk bereksperimen dengan konsep yang telah Anda pelajari hari ini untuk lebih memahami mereka. Misalnya, Anda dapat bekerja dengan kode, menambahkan properti baru yang diteruskan ke komponen, dan mencoba menggunakannya dalam komponen.
Ringkasan
Hari ini kami memperkenalkan konsep properti yang dapat diteruskan ke komponen Bereaksi untuk mengendalikan perilaku dan penampilan mereka. Properti ini menyerupai atribut elemen HTML, tetapi, dengan menggunakan properti dalam komponen, pemrogram memutuskan sendiri arti apa yang mereka miliki dan apa yang harus dilakukan dengan elemen tersebut di dalam komponen. Lain kali Anda akan mendapat pelajaran praktis tentang bekerja dengan properti komponen dan gaya.
Pembaca yang budiman! Bagaimana Anda bereksperimen dengan kode untuk contoh hari ini untuk lebih memahami sifat-sifat komponen Bereaksi?