⊗jsrtPmCpEPS 88 of 112 menu

Szülő állapotának szerkesztése gyermek komponensben Reactban

Most szerkesszük a termékeinket input mezőkkel. Ehhez a gyermek komponensben készítsünk egy gombot.

Az első kattintáskor a gombra ehelyett a termék neve és ára jelenjenek meg input mezők a szerkesztésükhöz, a második kattintáskor az input mezők helyett ismét a szövegek jelenjenek meg.

Végezzünk módosítást a termékek tömbjén, hozzáadva a isEdit tulajdonságot (a kosár funkciót pedig az egyszerűség kedvéért távolítsuk el):

const initProds = [ {id: id(), name: 'product1', cost: 100, isEdit: false}, {id: id(), name: 'product2', cost: 200, isEdit: false}, {id: id(), name: 'product3', cost: 300, isEdit: false}, ];

Product komponens

Készítsünk a termékben egy szerkesztés gombot:

function Product({ id, name, cost, isEdit }) { return <div> name: <span>{name}</span> cost: <span>{cost}</span> <button>edit</button> </div>; }

Tegyük meg, hogy a gombra kattintáskor meghívódjon egy toggleMode függvény, amit a szülő komponenstől kapunk:

function Product({ id, name, cost, isEdit, toggleMode }) { return <div> name: <span>{name}</span> cost: <span>{cost}</span> <button onClick={() => toggleMode(id)}> edit </button> </div>; }

Még nincs megvalósítva a toggleMode, de tudjuk, hogy a szülő komponensben lesz, paraméterként fogadja a termék id-ját és megváltoztatja a isEdit tulajdonságot ellenkezőjére.

Tegyük meg azt is, hogy a gomb szövege minden kattintáskor megváltozzon:

function Product({ id, name, cost, isEdit, toggleMode }) { return <div> name: <span>{name}</span> cost: <span>{cost}</span> <button onClick={() => toggleMode(id)}> {isEdit ? 'save': 'edit'} </button> </div>; }

Most tegyük meg, hogy a szerkesztési módban legyenek input mezők az adatokkal, a normál módban pedig span-ok:

function Product({ id, name, cost, isEdit, toggleMode }) { return <div> name: {isEdit ? <input value={name} /> : <span>{name}</span>} cost: {isEdit ? <input value={cost} /> : <span>{cost}</span>} <button onClick={() => toggleMode(id)}> {isEdit ? 'save': 'edit'} </button> </div>; }

Kössük az input mezőinkhez az onChange eseményt, amelyben meghívunk egy szülői editProd függvényt:

function Product({ id, name, cost, isEdit, toggleMode, editProd }) { return <div> name: { isEdit ? <input value={name} onChange={event => editProd(id, 'name', event)} /> : <span>{ name }</span> } cost: { isEdit ? <input value={cost} onChange={event => editProd(id, 'cost', event)} /> : <span>{ cost }</span> } <button onClick={() => toggleMode(id)}> {isEdit ? 'save': 'edit'} </button> </div>; }

Products komponens

Most menjünk a Products komponensbe. Valósítsuk meg benne a toggleMode függvényt:

function toggleMode(id) { setProds(prods.map(prod => { if (prod.id === id) { prod.isEdit = !prod.isEdit; } return prod; })); }

Valósítsuk meg benne a editProd függvényt is:

function editProd(id, field, event) { setProds(prods.map(prod => { if (prod.id === id) { prod[field] = event.target.value; } return prod; })); }

A termék elembe attribútumokként adjuk át a toggleMode és editProd függvényeinket:

const items = prods.map(prod => { return <Product key ={prod.id} id ={prod.id} name={prod.name} cost={prod.cost} isEdit={prod.isEdit} toggleMode={toggleMode} editProd={editProd} />; });

A Products komponens végső kódja a következő lesz:

function Products() { const [prods, setProds] = useState(initProds); function toggleMode(id) { setProds(prods.map(prod => { if (prod.id === id) { prod.isEdit = !prod.isEdit; } return prod; })); } function editProd(id, field, event) { setProds(prods.map(prod => { if (prod.id === id) { prod[field] = event.target.value; } return prod; })); } const result = prods.map(prod => { return <Product key ={prod.id} id ={prod.id} name={prod.name} cost={prod.cost} isEdit={prod.isEdit} toggleMode={toggleMode} editProd={editProd} />; }); return <div> {result} </div>; }

Gyakorlati feladatok

Végezd el a hasonló műveleteket a Users és User komponensekkel, amelyeket az előző leckékben készítettél.

Magyar
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
A weboldal működéséhez, elemzéshez és személyre szabáshoz sütiket használunk. Az adatfeldolgozás a Adatvédelmi irányelvek szerint történik.
összes elfogadása beállítás elutasítás