⊗jsrtPmCpMVS 90 of 112 menu

Mode Kerja melalui State Komponen Anak di React

Misalkan array produk kita sekarang terlihat seperti berikut:

const initProds = [ {id: id(), name: 'prod1', cost: 'cost1', catg: 'catg1'}, {id: id(), name: 'prod2', cost: 'cost2', catg: 'catg2'}, {id: id(), name: 'prod3', cost: 'cost3', catg: 'catg3'}, ];

Mari kita tampilkan produk-produk ini dalam bentuk tabel HTML. Sekaligus kita buat agar ketika sel tabel mana pun diklik, muncul input untuk mengedit di sel tersebut. Untuk menyelesaikan tugas ini, kita akan membuat 3 komponen.

Komponen Products akan menyimpan state produk dan menggunakan komponen Product untuk menampilkan produk. Komponen Product pada gilirannya juga akan menggunakan komponen ProductField untuk menampilkan field tertentu produk (nama, harga, kategori).

Komponen ProductField akan menampilkan teks field, atau input untuk mengeditnya. Mode edit atau tampil ini biarkan diatur oleh state komponen ini sendiri.

Artinya, kita tidak akan menyimpan mode di state induk. Di sana akan sangat tidak nyaman, karena kita harus menentukan mode untuk setiap field produk, yang akan mengubah state kita menjadi seperti ini:

const initProds = [ [ {field: 'name', value: 'prod1', isEdit: false}, {field: 'cost', value: 'cost1', isEdit: false}, {field: 'catg', value: 'catg1', isEdit: false}, ], [ {field: 'name', value: 'prod2', isEdit: false}, {field: 'cost', value: 'cost2', isEdit: false}, {field: 'catg', value: 'catg2', isEdit: false}, ], [ {field: 'name', value: 'prod3', isEdit: false}, {field: 'cost', value: 'cost3', isEdit: false}, {field: 'catg', value: 'catg3', isEdit: false}, ], ]

Namun, kita tidak akan membuat state seperti itu, tetapi membiarkan state yang sebelumnya. Setiap instance komponen ProductField dengan menggunakan state-nya sendiri akan mengatur mode: baik edit maupun tampil.

Dengan demikian, komponen induk akan menyimpan state dengan data, dan komponen cucu kita akan menerima data ini melalui props dan sekaligus memiliki state sendiri untuk mengubah modenya.

Jadi, mari kita implementasikan yang telah dijelaskan.

Komponen Products

function Products() { const [prods, setProds] = useState(initProds); function changeField(id, field, event) { setProds(prods.map(prod => { if (prod.id === id) { prod[field] = event.target.value; } return prod; })); } const rows = prods.map(prod => { return <Product key ={prod.id} id ={prod.id} name={prod.name} cost={prod.cost} catg={prod.catg} changeField={changeField} />; }); return <div> <table> <tbody> {rows} </tbody> </table> </div>; }

Komponen Product

function Product({ id, name, cost, catg, changeField }) { return <tr> <ProductField id={id} text={name} type="name" changeField={changeField} /> <ProductField id={id} text={cost} type="cost" changeField={changeField} /> <ProductField id={id} text={catg} type="catg" changeField={changeField} /> </tr>; }

Komponen ProductField

function ProductField({ id, text, type, changeField }) { const [isEdit, setIsEdit] = useState(false); return <td> { isEdit ? <input value={text} onChange={event => changeField(id, type, event)} onBlur={() => setIsEdit(false)} /> : <span onClick={() => setIsEdit(true)}>{text}</span> } </td>; }

Tugas Praktis

Lakukan operasi serupa dengan komponen Users dan User, yang telah Anda buat dalam pelajaran sebelumnya.

Indonesia
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Kami menggunakan cookie untuk operasi situs, analitik, dan personalisasi. Pemrosesan data dilakukan sesuai dengan Kebijakan Privasi.
terima semua atur tolak