⊗jsrtPmCpEPS 88 of 112 menu

Рэдагаванне стэйта бацькі ў даччыным кампаненце ў React

Давайце цяпер будзем рэдагаваць нашы прадукты з дапамогай інпутаў. Для гэтага ў даччыным кампаненце зробім кнопку.

Па першым націсканні на гэтую кнопку хай замест назвы і цаны з прадуктам з'явяцца інпуты для іх рэдагавання, а па другім націсканні замест інпутаў зноў з'явяцца тэксты.

Унясем змену ў масіў з прадуктамі, дадаўшы ўласцівасць isEdit (а працу з кошыкам для прастаты прыбярэм):

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

Зробім у прадукце кнопку для рэдагавання:

function Product({ id, name, cost, isEdit }) { return <div> name: <span>{name}</span> cost: <span>{cost}</span> <button>edit</button> </div>; }

Зробім так, каб па кліку на гэтую кнопку выклікалася некаторая функцыя toggleMode, перададзеная з бацькоўскага кампанента:

function Product({ id, name, cost, isEdit, toggleMode }) { return <div> name: <span>{name}</span> cost: <span>{cost}</span> <button onClick={() => toggleMode(id)}> edit </button> </div>; }

Пакуль у нас няма рэалізацыі toggleMode, але мы ведаем, што яна будзе размяшчацца ў кампаненце-бацьку, параметрам прымаць id прадукту і змяняць уласцівасць isEdit прадукту на процілеглае.

Зробім таксама так, каб тэкст кнопкі мяняўся кожнае націсканне:

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>; }

Давайце цяпер зробім так, каб у рэжыме рэдагавання ў нас былі інпуты з данымі, а ў звычайным рэжыме - спены:

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>; }

Прывязам да нашых інпутаў падзею onChange, у якой будзем выклікаць некаторую бацькоўскую функцыю 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>; }

Кампанент Products

Давайце цяпер перайдзем у кампанент Products. Рэалізуем у ім функцыю toggleMode:

function toggleMode(id) { setProds(prods.map(prod => { if (prod.id === id) { prod.isEdit = !prod.isEdit; } return prod; })); }

Таксама рэалізуем у ім функцыю editProd:

function editProd(id, field, event) { setProds(prods.map(prod => { if (prod.id === id) { prod[field] = event.target.value; } return prod; })); }

У тэг з прадуктам атрыбутамі перададзім нашы функцыі toggleMode і 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} />; });

Канчатковы код кампанента Products атрымаецца наступным:

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>; }

Практычныя задачы

Прадзейніце аналагічныя аперацыі з кампанентамі Users і User, створанымі вамі ў папярэдніх уроках.

Беларуская
AfrikaansAzərbaycanБългарскиবাংলাČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Мы выкарыстоўваем cookie для працы сайта, аналітыкі і персаналізацыі. Апрацоўка дадзеных адбываецца згодна Палітыкай канфідэнцыяльнасці.
прыняць усе наладзіць адхіліць