Menu

Props React: Mengirim Data ke Komponen dengan Contoh

Props adalah input sebuah komponen React: nilai yang dikirim induk ke komponen anak sebagai atribut JSX. Pelajari cara mengirim props dan memakai destructuring, mengatur nilai default, mengirim fungsi, spread props, dan kenapa props bersifat read only.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Props adalah input sebuah komponen React. Induk mengirimnya sebagai atribut di JSX, <UserCard name="Ada" online={true} />, dan komponen anak menerimanya sebagai satu objek, yang biasanya kamu ambil dengan destructuring di parameter fungsi. Props memungkinkan satu komponen menampilkan data yang berbeda setiap kali kamu memakainya.

UserCard yang sama merender tiga orang yang berbeda. Perhatikan yang terakhir: atribut tanpa nilai, online, berarti online={true}. Tambahkan kartu keempat dengan nama dan peranmu sendiri.

Mengirim dan membaca props

Kirim string dengan tanda kutip, dan nilai lainnya dengan kurung kurawal: angka, boolean, array, objek, fungsi, bahkan JSX.

<Product
    title="Desk lamp"
    price={39.5}
    inStock={false}
    tags={['light', 'office']}
    seller={{ name: 'Lumen', rating: 4.8 }}
/>

React mengumpulkan semua atribut ke dalam satu objek dan mengirimnya sebagai argumen pertama komponen. Kamu bisa membacanya sebagai props, atau langsung mengambil field yang kamu butuhkan di daftar parameter:

function Product(props) {
    return <h3>{props.title}</h3>;
}

function Product({ title, price, seller }) {
    return <h3>{title}, ${price} from {seller.name}</h3>;
}

Kedua versi menerima objek yang sama. Destructuring adalah gaya yang umum karena signature fungsinya jadi mendaftar persis props mana yang dipakai komponen itu.

Nilai default

Beri prop nilai default dengan nilai default destructuring JavaScript, = value. Nilai ini berlaku saat induk tidak mengirim prop itu, atau mengirim undefined. Nilai ini tidak berlaku untuk null, 0, false, atau '', yang merupakan nilai sungguhan.

Tiga tombol pertama kembali ke nilai default-nya di tempat prop tidak dikirim atau bernilai undefined. Tombol terakhir mengirim null, jadi size benar-benar bernilai null, dan pencariannya tidak menemukan padding. Ganti size={null} menjadi size="small" untuk memperbaikinya.

Kode lama mengatur nilai default dengan property statis, Button.defaultProps = { size: 'medium' }. React 19 menghapus defaultProps untuk function component: JSX mengabaikannya pada fungsi, tanpa peringatan. Fitur ini masih berjalan di class component. Pakai nilai default destructuring.

Mengirim fungsi sebagai props

Data mengalir ke bawah: induk mengirim props ke anak-anaknya, tidak pernah sebaliknya. Saat komponen anak perlu memberi tahu induk bahwa sesuatu terjadi, induk mengirim sebuah fungsi, dan komponen anak memanggilnya. Menurut konvensi, props seperti ini dinamai onSomething.

Rating tidak menyimpan apa pun. Ia menampilkan value yang diterimanya dan melaporkan klik lewat onRate. State-nya tinggal di App, yang mengirimnya kembali ke bawah. Kirim onRate={setRating} secara langsung alih-alih handleRate, dan hasilnya tetap berjalan: setter juga sebuah fungsi. Memindahkan state ke induk bersama seperti ini disebut lifting state up.

Spread props

Saat kamu sudah punya objek yang key-nya sesuai dengan props sebuah komponen, sebarkan dengan {...object} alih-alih menulis setiap atribut. Sintaks rest melakukan kebalikannya di daftar parameter: ambil beberapa props berdasarkan nama, kumpulkan sisanya, lalu teruskan.

Avatar kedua menyebarkan person lalu mengatur color: saat prop yang sama muncul dua kali, yang belakangan menang, jadi taruh nilai pengganti setelah spread. TextField menyimpan label untuk dirinya sendiri dan langsung meneruskan type, placeholder, dan maxLength ke <input>. Pakai spread untuk wrapper seperti ini; di tempat lain, menuliskan props secara eksplisit membuat lebih mudah melihat apa yang diterima sebuah komponen.

Props bersifat read only

Sebuah komponen tidak boleh mengubah props-nya sendiri. Props milik induknya, dan objek yang sama bisa dipakai bersama. Perlakukan props seperti argumen fungsi yang tidak boleh kamu ubah:

function Counter({ count }) {
    count = count + 1; // wrong: changes a local copy, the parent never sees it
    return <p>{count}</p>;
}

function Profile(props) {
    props.name = 'Someone else'; // wrong: in development React freezes props, so this throws a TypeError
    return <p>{props.name}</p>;
}

Props tetap berubah seiring waktu. Saat induk merender lagi dengan nilai baru, komponen anak menerima objek props baru dan merender dengannya:

Temperature tidak pernah mengubah celsius. Ia menghitung fahrenheit darinya di setiap render. Geser slider-nya, dan state milik induk berubah, jadi komponen anak mendapat prop baru. Jika komponen anak butuh nilai yang bisa diubahnya sendiri, nilai itu adalah state, bukan prop.

Props vs state

Props dan state sama-sama nilai JavaScript biasa yang memengaruhi apa yang dirender komponen, dan perubahan pada salah satunya membuat komponen dirender lagi. Perbedaannya ada pada siapa pemilik nilainya.

PropsState
AsalnyaInduk, sebagai atribut JSXKomponen itu sendiri, dari useState atau useReducer
Bisakah komponen mengubahnyaTidak, bersifat read onlyYa, lewat setter-nya
Penggunaan umumMengatur komponen: label, ukuran, data yang ditampilkanMengingat sesuatu yang berubah: teks input, menu yang terbuka

Nilai yang sama sering kali menjadi keduanya. Di contoh suhu di atas, celsius adalah state di App dan prop di Temperature. Pemiliknya menyimpannya sebagai state dan mengirimnya ke bawah sebagai prop, bersama fungsi untuk mengubahnya saat komponen anak membutuhkannya.

Sebuah prop bisa menampung nilai apa pun, termasuk JSX dan komponen. Mengirim elemen seperti icon={<StarIcon />} memungkinkan induk mengisi sebuah slot di komponen anak, ide yang sama dengan children tetapi dengan nama pilihanmu.

Prop children

Apa pun yang kamu taruh di antara tag pembuka dan penutup sebuah komponen datang sebagai prop bernama children. Begitulah cara membuat wrapper seperti kartu, panel, dan layout yang tidak tahu isinya sejak awal:

Halaman children membahas cara mengirim beberapa slot dan bekerja dengan children secara aman.

Key bukan props

key terlihat seperti atribut, tetapi React menyimpannya untuk dirinya sendiri guna mencocokkan item list di antara render. Komponen tidak pernah menerimanya:

Konsol menampilkan props.key sebagai undefined dan props.id dengan nilai yang sebenarnya. Saat komponen anak butuh identifier-nya, kirim sekali lagi dengan nama lain, seperti yang dilakukan id di sini. Build development juga memberi peringatan saat kamu membaca props.key; pratinjau berjalan seperti build production, jadi kamu hanya melihat undefined.

Pertanyaan yang sering diajukan

Apa itu props di React?

Props (kependekan dari properties) adalah argumen sebuah komponen. Induk mengirimnya sebagai atribut JSX, <Avatar size={48} />, dan komponen anak menerimanya sebagai satu objek, biasanya dengan destructuring: function Avatar({ size }).

Bagaimana cara mengatur nilai default untuk sebuah prop?

Pakai nilai default destructuring: function Button({ size = 'medium' }). Nilai default berlaku saat prop tidak dikirim atau bernilai undefined. React 19 menghapus defaultProps untuk function component; class component masih mendukungnya.

Bisakah komponen anak mengubah props-nya?

Tidak. Props bersifat read only. Untuk mengubah apa yang ditampilkan komponen anak, induk mengirim props baru; agar komponen anak bisa meminta perubahan, induk mengirim fungsi seperti onChange dan komponen anak memanggilnya.

Apa perbedaan props dan state?

Props datang dari induk dan tidak bisa diubah oleh komponen anak. State milik komponen itu sendiri dan berubah lewat setter-nya. Sebuah nilai sering menjadi state di induk dan prop di komponen anaknya.

Kenapa props.key bernilai undefined?

key (seperti ref di React versi lama) dipakai React sendiri untuk melacak item list dan tidak dikirim ke komponen. Jika komponen anak butuh nilainya, kirim lagi dengan nama lain, misalnya <Row key={id} id={id} />.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai