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):
jsxconst 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:
jsxfunction 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:
jsxfunction 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:
jsxfunction 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:
jsxfunction 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:
jsxfunction 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:
jsxfunction toggleMode(id) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod.isEdit = !prod.isEdit;
}
return prod;
}));
}
Prav tako implementirajmo v njem funkcijo editProd:
jsxfunction 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:
jsxconst 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:
jsxfunction 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.