Redigering av forelder-state i barnekomponent i React
La oss nå redigere produktene våre ved hjelp av input-felter. For å gjøre dette, lager vi en knapp i barnekomponenten.
Ved første klikk på denne knappen, la det dukke opp input-felter for redigering i stedet for produktnavn og pris, og ved andre klikk la tekstene dukke opp igjen i stedet for input-feltene.
La oss endre arrayet med produkter ved å legge til
egenskapen isEdit (og for enkelhets skyld fjerner vi
handlingen med handlekurv):
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
La oss lage en knapp for redigering i produktet:
function Product({ id, name, cost, isEdit }) {
return <div>
name: <span>{name}</span>
cost: <span>{cost}</span>
<button>edit</button>
</div>;
}
La oss gjøre det slik at ved klikk på denne knappen
kalles en funksjon toggleMode,
som er sendt fra forelderkomponenten:
function Product({ id, name, cost, isEdit, toggleMode }) {
return <div>
name: <span>{name}</span>
cost: <span>{cost}</span>
<button onClick={() => toggleMode(id)}>
edit
</button>
</div>;
}
Foreløpig har vi ikke implementert toggleMode,
men vi vet at den vil ligge
i forelderkomponenten, ta inn id
til produktet som parameter og endre egenskapen isEdit
til produktet til den motsatte.
La oss også gjøre det slik at knappeteksten endres ved hvert klikk:
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>;
}
La oss nå gjøre det slik at i redigeringsmodus har vi input-felter med data, og i vanlig modus - spenn:
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>;
}
La oss knytte hendelsen onChange til input-feltene våre,
der vi vil kalle en forelderfunksjon
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
La oss nå gå til komponenten Products.
La oss implementere funksjonen toggleMode i den:
function toggleMode(id) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod.isEdit = !prod.isEdit;
}
return prod;
}));
}
La oss også implementere funksjonen editProd i den:
function editProd(id, field, event) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod[field] = event.target.value;
}
return prod;
}));
}
I taggen med produktet sender vi våre
funksjoner toggleMode og editProd som attributter:
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}
/>;
});
Den endelige koden for komponenten Products
blir som følger:
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>;
}
Praktiske oppgaver
Gjør de samme operasjonene med komponentene
Users og User, som du opprettet
i tidligere leksjoner.