⊗jsrtPmCpEPS 88 of 112 menu

Vanhemman komponentin tilan muokkaus lapsikomponentissa Reactissa

Muokataan nyt tuotteitamme input-kenttien avulla. Tehdään tätä varten lapsikomponenttiin painike.

Ensimmäisellä painalluksella tämän painikkeen kohdalla tuotteen nimen ja hinnan sijaan ilmestyvät input-kentät niiden muokkaamista varten, ja toisella painalluksella input-kenttien tilalle tulevat taas tekstit.

Tehdään muutos tuotetaulukkoon lisäämällä ominaisuus isEdit (ja poistetaan ostoskorin käsittely yksinkertaisuuden vuoksi):

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

Komponentti Product

Tehdään tuotteeseen painike muokkausta varten:

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

Tehdään niin, että tätä painiketta klikattaessa kutsutaan jotain funktiota toggleMode, joka on välitetty vanhempakomponentista:

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

Meillä ei ole vielä toggleMode:n toteutusta, mutta tiedämme, että se sijaitsisi vanhempakomponentissa, ottaisi parametrina id:n tuotteesta ja muuttaisi isEdit-ominaisuuden tuotteesta vastakkaiseksi.

Tehdään myös niin, että painikkeen teksti muuttuu jokaisella painalluksella:

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

Tehdään nyt niin, että muokkaustilassa meillä on input-kentät tiedoilla, ja normaalitilassa - span-elementit:

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

Liitetään input-kenttiimme tapahtuma onChange, jossa kutsutaan jotain vanhemman funktiota 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>; }

Komponentti Products

Siirrytään nyt komponenttiin Products. Toteutetaan siihen funktio toggleMode:

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

Toteutetaan myös siihen funktio editProd:

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

Tuotteen tagiin välitetään attribuutteina meidän funktiot toggleMode ja 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} />; });

Komponentin Products lopullinen koodi on seuraava:

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

Käytännön tehtävät

Tee samanlaiset toimenpiteet komponenteille Users ja User, jotka loit aiemmissa oppitunneissa.

Suomi
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Käytämme evästeitä verkkosivuston toiminnalle, analytiikalle ja personoinnille. Tietojen käsittely tapahtuu Tietosuojakäytännön mukaisesti.
hyväksy kaikki mukauta hylkää