Uređivanje stanja roditelja u child komponentu u React-u
Sada hajde da uređujemo naše proizvode pomoću input polja. Da bismo to uradili, u child komponenti ćemo napraviti dugme.
Neka se pritiskom na ovo dugme umesto imena i cene proizvoda pojave input polja za njihovo uređivanje, a drugim pritiskom umesto input polja opet se pojave tekstovi.
Unesimo promenu u niz sa proizvodima, dodajući
osobinu isEdit (a rad sa korpom
ćemo ukloniti radi jednostavnosti):
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},
];
Komponenta Product
Napravićemo u proizvodu dugme za uređivanje:
function Product({ id, name, cost, isEdit }) {
return <div>
name: <span>{name}</span>
cost: <span>{cost}</span>
<button>edit</button>
</div>;
}
Učinićemo tako da pritiskom na ovo dugme
se pozove određena funkcija toggleMode,
prosledjena iz roditeljske komponente:
function Product({ id, name, cost, isEdit, toggleMode }) {
return <div>
name: <span>{name}</span>
cost: <span>{cost}</span>
<button onClick={() => toggleMode(id)}>
edit
</button>
</div>;
}
Još uvek nemamo implementaciju za toggleMode,
ali znamo da će se ona nalaziti
u komponenti-roditelju, kao parametar primati
id proizvoda i menjati osobinu isEdit
proizvoda na suprotnu.
Učinićemo takođe da se tekst dugmeta menja svakim pritiskom:
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>;
}
Sada hajde da učinimo tako da u režimu uređivanja imamo input polja sa podacima, a u običnom režimu - span elemente:
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>;
}
Povežimo naše input polja sa događajem onChange,
u kojem ćemo pozivati određenu roditeljsku
funkciju 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>;
}
Komponenta Products
Sada hajde da pređemo u komponentu Products.
Implementirajmo u njemu funkciju toggleMode:
function toggleMode(id) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod.isEdit = !prod.isEdit;
}
return prod;
}));
}
Takođe implementirajmo u njemu funkciju editProd:
function editProd(id, field, event) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod[field] = event.target.value;
}
return prod;
}));
}
U tag sa proizvodom prosledićemo naše
funkcije toggleMode i editProd kao atribute:
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}
/>;
});
Konačni kod komponente Products
će biti sledeći:
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>;
}
Praktični zadaci
Uradite slične operacije sa komponentama
Users i User, koje ste kreirali
u prethodnim lekcijama.