⊗jsrtPmCpChPS 87 of 112 menu

React'те ата-эненин стейтин бала компонентте өзгөртүү

Акыркы сабакта бизде маалыматтар менен стейт ата-эне компонентте сакталган, ал эми бала компоненттер бул маалыматтарды пропс катары алган.

Эми биз өнүмдөрүбүздү өзгөртүүнү каалайбыз деп коёлу. Мисалы, биздин өнүмдү себетке коюучу баскычты жасайлы. Башында өнүмдөрүбүздүн массивине өнүм себетте же жок экенин көрсөткөн inCart талаасын кошолу:

const initProds = [ {id: id(), name: 'product1', cost: 100, inCart: false}, {id: id(), name: 'product2', cost: 200, inCart: false}, {id: id(), name: 'product3', cost: 300, inCart: false}, ];

Products компоненттинде өнүм менен тегге дагы бир inCart атрибутун кошолу:

function Products() { const [prods, setProds] = useState(initProds); const items = prods.map(prod => { return <Product key ={prod.id} name ={prod.name} cost ={prod.cost} inCart={prod.inCart} />; }); return <div> {items} </div>; }

Келгиле, бала Product компонентте себет жөнүндө маалыматты чыгарууну жана себетке кошуу үчүн баскычты жасайлы:

function Product({ id, name, cost, inCart }) { return <div> аты: <span>{name}</span>, баасы: <span>{cost}</span>, <span>{inCart ? 'себетте' : 'себетте эмес'}</span> <button>себетке</button> </div>; }

Кошууну ишке ашыруу

React эрежелери боюнча компонент өз пропстарын өзгөртүшү керек эмес. Бул бала компонент өзүн өзү пропсту inCart өзгөртүп себетке сала албайт дегенди билдирет. Бул туура эмес.

Ата-эне компоненттен өзүнүн prods стейтин өзгөртүп, белгилүү бир өнүмдү себетке салууну сурануу туура болот.

Келгиле, бул кантип жасаларын карап көрөлү.

Ата-эне компонентте addToCart функциясын жасайбыз, ал параметр катары өнүмдүн idсин кабыл алат жана ошол өнүм үчүн inCart касиетин true кылып өзгөртөт:

function addToCart(id) { setProds(prods.map(prod => { if (prod.id === id) { prod.inCart = true; } return prod; })); }

Өнүм менен тегке биз түзгөн функциябызды бере турган атрибутту, ошондой эле өнүмдүн idсин бере турган атрибутту кошолу:

const items = prods.map(prod => { return <Product key ={prod.id} id ={prod.id} name ={prod.name} cost ={prod.cost} inCart ={prod.inCart} addToCart={addToCart} />; });

Көрүп тургандай, компоненттердин пропстарына белгилүү бир маалыматтарды гана эмес, функцияларды да берсе болот.

Products классынын жыйынтык коду төмөнкүдөй болот:

function Products() { const [prods, setProds] = useState(initProds); function addToCart(id) { setProds(prods.map(prod => { if (prod.id === id) { prod.inCart = true; } return prod; })); } const items = prods.map(prod => { return <Product key ={prod.id} id ={prod.id} name ={prod.name} cost ={prod.cost} inCart ={prod.inCart} addToCart={addToCart} />; }); return <div> {items} </div>; }

Эми бала класста бизде addToCart функциясы жеткиликтүү болот. Бул функцияны баскычка чыкылдоо менен чакырып, ага параметр катары өнүмдүн idсин өткөрөлү:

function Product({ id, name, cost, inCart, addToCart }) { return <div> аты: <span>{name}</span>, баасы: <span>{cost}</span>, <span>{inCart ? 'себетте' : 'себетте эмес'}</span> <button onClick={() => addToCart(id)}>себетке</button> </div>; }

Баскычка чыкылдоо менен баладагы функция ата-энедеги функцияны чакырат, ал ата-эненин стейтин өзгөртөт. Ата-эненин стейтинин өзгөрүшү кайрарендерингди чакырып, биздин өнүмдү өзгөргөн пропсту өткөрүп кайра сызат.

Мурунку сабактан 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 файлдарын колдонобуз. Маалыматтарды иштетүү Маалыматты коргоо саясаты боюнча жүргүзүлөт.
баарын кабыл алуу ыңгайлаштыруу четке кагуу