Urejanje stanja starša v podrejenem komponentu v React
Zdaj pa uredimo naše produkte z uporabo vnosnih polj. Za to naredimo gumb v podrejenem komponentu.
Ob prvem kliku na ta gumb naj se namesto imena in cene produkta prikažejo vnosna polja za njihovo urejanje, ob drugem kliku pa naj se namesto vnosnih polj spet prikažejo besedila.
Naredimo spremembo v polju s produkti tako, da dodamo
lastnost isEdit (delo z košarico
pa za enostavnost odstranimo):
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
Naredimo gumb za urejanje v produktu:
function Product({ id, name, cost, isEdit }) {
return <div>
name: <span>{name}</span>
cost: <span>{cost}</span>
<button>edit</button>
</div>;
}
Naredimo tako, da ob kliku na ta gumb
prikliče neko funkcijo toggleMode,
posredovano iz starševskega komponenta:
function Product({ id, name, cost, isEdit, toggleMode }) {
return <div>
name: <span>{name}</span>
cost: <span>{cost}</span>
<button onClick={() => toggleMode(id)}>
edit
</button>
</div>;
}
Trenutno še nimamo implementacije toggleMode,
vendar vemo, da se bo nahajala
v starševskem komponentu, kot parameter sprejela
id produkta in spremenila lastnost isEdit
produkta v nasprotno.
Naredimo tudi tako, da se besedilo gumba spreminja ob vsakem kliku:
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>;
}
Zdaj pa naredimo tako, da so v načinu urejanja na voljo vnosna polja s podatki, v običajnem načinu pa razponi:
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 z našimi vnosnimi polji dogodek onChange,
v katerem bomo klicali neko starševsko
funkcijo 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
Pojdimo zdaj v komponent Products.
Implementirajmo v njem funkcijo toggleMode:
function toggleMode(id) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod.isEdit = !prod.isEdit;
}
return prod;
}));
}
Prav tako implementirajmo v njem funkcijo editProd:
function editProd(id, field, event) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod[field] = event.target.value;
}
return prod;
}));
}
V oznako z produktom preko atributov posredujemo naše
funkcije toggleMode in 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}
/>;
});
Končna koda komponenta Products
bo naslednja:
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čne naloge
Izvedite podobne operacije s komponenti
Users in User, ki ste jih ustvarili
v prejšnjih lekcijah.