Szülő állapotának szerkesztése gyermek komponensben Reactban
Most szerkesszük a termékeinket input mezőkkel. Ehhez a gyermek komponensben készítsünk egy gombot.
Az első kattintáskor a gombra ehelyett a termék neve és ára jelenjenek meg input mezők a szerkesztésükhöz, a második kattintáskor az input mezők helyett ismét a szövegek jelenjenek meg.
Végezzünk módosítást a termékek tömbjén, hozzáadva
a isEdit tulajdonságot
(a kosár funkciót pedig az egyszerűség kedvéért távolítsuk el):
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},
];
Product komponens
Készítsünk a termékben egy szerkesztés gombot:
function Product({ id, name, cost, isEdit }) {
return <div>
name: <span>{name}</span>
cost: <span>{cost}</span>
<button>edit</button>
</div>;
}
Tegyük meg, hogy a gombra kattintáskor
meghívódjon egy toggleMode függvény,
amit a szülő komponenstől kapunk:
function Product({ id, name, cost, isEdit, toggleMode }) {
return <div>
name: <span>{name}</span>
cost: <span>{cost}</span>
<button onClick={() => toggleMode(id)}>
edit
</button>
</div>;
}
Még nincs megvalósítva a toggleMode,
de tudjuk, hogy a szülő komponensben lesz,
paraméterként fogadja a termék id-ját
és megváltoztatja a isEdit tulajdonságot
ellenkezőjére.
Tegyük meg azt is, hogy a gomb szövege minden kattintáskor megváltozzon:
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>;
}
Most tegyük meg, hogy a szerkesztési módban legyenek input mezők az adatokkal, a normál módban pedig span-ok:
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>;
}
Kössük az input mezőinkhez az onChange eseményt,
amelyben meghívunk egy szülői
editProd függvényt:
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>;
}
Products komponens
Most menjünk a Products komponensbe.
Valósítsuk meg benne a toggleMode függvényt:
function toggleMode(id) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod.isEdit = !prod.isEdit;
}
return prod;
}));
}
Valósítsuk meg benne a editProd függvényt is:
function editProd(id, field, event) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod[field] = event.target.value;
}
return prod;
}));
}
A termék elembe attribútumokként adjuk át
a toggleMode és editProd függvényeinket:
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}
/>;
});
A Products komponens végső kódja
a következő lesz:
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>;
}
Gyakorlati feladatok
Végezd el a hasonló műveleteket a
Users és User komponensekkel,
amelyeket az előző leckékben készítettél.