Redaktimi i state-it të prindit në komponentin fëmijë në React
Tani le të redaktojmë produktet tona duke përdorur input-et. Për këtë, në komponentin fëmijë të krijojmë një buton.
Gjë me gjë, në shtypjen e parë të këtij butoni le të shfaqen input-e për redaktimin e tyre në vend të emrit dhe çmimit të produktit, kurse në shtypjen e dytë, në vend të input-eve, të shfaqen përsëri tekstet.
Të bëjmë një ndryshim në array-in me produkte, duke shtuar
vetinë isEdit (dhe për thjeshtësi, punën me shportën
do ta heqim):
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},
];
Komponenti Product
Të krijojmë një buton për redaktim në produkt:
function Product({ id, name, cost, isEdit }) {
return <div>
name: <span>{name}</span>
cost: <span>{cost}</span>
<button>edit</button>
</div>;
}
Të bëjmë që me klikim në këtë buton
të thirret një funksion toggleMode,
i transmetuar nga komponenti prind:
function Product({ id, name, cost, isEdit, toggleMode }) {
return <div>
name: <span>{name}</span>
cost: <span>{cost}</span>
<button onClick={() => toggleMode(id)}>
edit
</button>
</div>;
}
Edhe pse nuk kemi ende implementimin e toggleMode,
ne e dimë se ai do të vendoset
në komponentin-prind, do të pranojë si parametër
id e produktit dhe do të ndryshojë vetinë isEdit
të produktit në të kundërtën.
Të bëjmë gjithashtu që teksti i butonit të ndryshojë me çdo shtypje:
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>;
}
Tani le të bëjmë që në modalitetin e redaktimit të kemi input-e me të dhënat, kurse në modalitetin normal - span-e:
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>;
}
Të lidhim me input-et tona ngjarjen onChange,
ku do të thirrim një funksion të caktuar prindëror
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>;
}
Komponenti Products
Tani le të kalojmë në komponentin Products.
Të implementojmë në të funksionin toggleMode:
function toggleMode(id) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod.isEdit = !prod.isEdit;
}
return prod;
}));
}
Gjithashtu të implementojmë në të funksionin editProd:
function editProd(id, field, event) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod[field] = event.target.value;
}
return prod;
}));
}
Në tag-un e produktit si atribute t'ia transmetojmë
funksionet tona toggleMode dhe 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}
/>;
});
Kodi përfundimtar i komponentit Products
do të jetë si më poshtë:
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>;
}
Detyra praktike
Përsëritni operacione të ngjashme me komponentët
Users dhe User, të krijuar nga ju
në mësimet e mëparshme.