⊗jsrtPmCpEPS 88 of 112 menu

Redigering av forelder-state i barnekomponent i React

La oss nå redigere produktene våre ved hjelp av input-felter. For å gjøre dette, lager vi en knapp i barnekomponenten.

Ved første klikk på denne knappen, la det dukke opp input-felter for redigering i stedet for produktnavn og pris, og ved andre klikk la tekstene dukke opp igjen i stedet for input-feltene.

La oss endre arrayet med produkter ved å legge til egenskapen isEdit (og for enkelhets skyld fjerner vi handlingen med handlekurv):

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

Komponent Product

La oss lage en knapp for redigering i produktet:

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

La oss gjøre det slik at ved klikk på denne knappen kalles en funksjon toggleMode, som er sendt fra forelderkomponenten:

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

Foreløpig har vi ikke implementert toggleMode, men vi vet at den vil ligge i forelderkomponenten, ta inn id til produktet som parameter og endre egenskapen isEdit til produktet til den motsatte.

La oss også gjøre det slik at knappeteksten endres ved hvert klikk:

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

La oss nå gjøre det slik at i redigeringsmodus har vi input-felter med data, og i vanlig modus - spenn:

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

La oss knytte hendelsen onChange til input-feltene våre, der vi vil kalle en forelderfunksjon 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>; }

Komponent Products

La oss nå gå til komponenten Products. La oss implementere funksjonen toggleMode i den:

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

La oss også implementere funksjonen editProd i den:

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

I taggen med produktet sender vi våre funksjoner toggleMode og editProd som attributter:

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

Den endelige koden for komponenten Products blir som følger:

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

Praktiske oppgaver

Gjør de samme operasjonene med komponentene Users og User, som du opprettet i tidligere leksjoner.

Norsk
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Vi bruker informasjonskapsler for nettstedets funksjonalitet, analyse og personalisering. Behandling av data foregår i henhold til Personvernerklæringen.
godta alle tilpass avvis