⊗jsrtPmCpEPS 88 of 112 menu

Tėvinio komponento būsenos redagavimas vaikiniame komponente React

Dabar redaguokime savo produktus naudodami įvesties laukus. Tam vaikiniame komponente sukurkime mygtuką.

Paspaudus pirmą kartą šį mygtuką, vietoj pavadinimo ir kainos su produktu tegul atsiranda įvesties laukai jų redagavimui, o paspaudus antrą kartą vietoj įvesties laukų vėl atsiranda tekstai.

Atlikime pakeitimą produktų masyve, pridėdami savybę isEdit (o darbą su krepšeliu dėl paprastumo pašalinkime):

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}, ];

Komponentas Product

Produkte sukurkime redagavimo mygtuką:

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

Padarykime taip, kad paspaudus šį mygtuką būtų iškviesta kokia nors funkcija toggleMode, perduota iš tėvinio komponento:

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

Kol kas neturime toggleMode realizacijos, bet žinome, kad ji bus talpinama tėviniame komponente, parametru priims produkto id ir pakeis savybę isEdit produkto į priešingą.

Taip pat padarykime, kad mygtuko tekstas keistųsi kiekvienu paspaudimu:

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>; }

Dabar padarykime taip, kad redagavimo režime mūsų turėtų būti įvesties laukai su duomenimis, o įprastame režime - span elementai:

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>; }

Priskirkime mūsų įvesties laukams įvykį onChange, kuriame iškviessime kažkokią tėvinę funkciją editProd:

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>; }

Komponentas Products

Dabar pereikime į komponentą Products. Jame realizuokime funkciją toggleMode:

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

Taip pat jame realizuokime funkciją editProd:

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

Į produkto tagą atributais perduokime mūsų funkcijas toggleMode ir editProd:

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} />; });

Galutinis komponento Products kodas gausis toks:

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>; }

Praktinės užduotys

Atlikite analogiškus veiksmus su komponentais Users ir User, kuriuos sukūrėte ankstesnėse pamokose.

Lietuvių
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Mes naudojame slapukus svetainės veikimui, analizei ir personalizavimui. Duomenų apdorojimas vyksta pagal Privatumo politiką.
priimti visus nustatyti atšaukti