⊗jsrtPmHkUCb 16 of 47 menu

Reactдаги useCallback ишчиликни оптималлаштириш хуки

Ушбу дарсда биз куйидаги ишчиликни оптималлаштириш хукини useCallback кўриб чиқамиз.

useCallback хуки useMemo APIга ўхшайди, фарк шундаки, биринчиси экрангни қайта чизиш дақиқалари ўртасида қийматни кэшлайди, иккинчиси эса - коллбэкни. Бу бизга зарурат бўлмаганда қимматли функцияларни қайта ишга туширишга тўғри келмайди ва функцияни ўтказish фарзанд компонентларга ишлатилиши мумкин.

Келинг, мисолда янада батафсилрок тушунамиз. Аввало App компонентини яратамиз ва унда num стейтини ҳосил киламиз:

const [num, setNum] = useState(0);

Бизда тугма бўлсин, уни босганда num 1 га orthи ва num қийматини кўрсатадиган абзац бўлсин:

return ( <div> <button onClick={() => setNum(num + 1)}>click</button> <p>clicks: {num}</p> </div> );

Энди, фараз қилайлик, бизда App да яна бир рўйхат чиқарилади, уни бошқа tugma босилганда тўлдирамиз. Ушбу рўйхат элементларини сақлаш учун биз стейт items ни ҳосил киламиз:

const [items, setItems] = useState([]);

Сўнгра уларни қўшиш учун addItem функциясини ёзамиз:

function addItem() { setItems([...items, 'new item']); }

Энди рўйхат элементларини кўрсатиш учун код ёзамиз ва уни Items фарзанд компонентига чиқарамиз, у проплар шаклида элементлар массиви ва уларни қўшиш учун функция олади. Items қачон қайта чизилишини кўриш учун консолга чиқаришни унутмаймиз:

function Items({ items, addItem }) { const result = items.map((item, index) => { return <p key={index}>{item}</p>; }); console.log('Items render'); return ( <div> <h3>Our items</h3> {result} <button onClick={addItem}>add item</button> </div> ); } export default Items;

Items ни App компонентининг охирига жойлаштирамиз ва унга массив items ва элементларни қўшиш учун addItem функциясини ўтказамиз:

return ( <> <div> <button onClick={() => setNum(num + 1)}>click</button> <p>clicks: {num}</p> <br /> </div> <Items items={items} addItem={addItem} /> </> );

Энди tugmachalarni босайлик ва num orthишини ва рўйхатга янги элементлар қўшилишини кўрамиз. Консолни ochib, биз рўйхатимиз ҳар доим қайта чизилишини кўрамиз, ҳатто биз num ni orthирувчи tugmani босганда ҳам.

Агар бизда кичкина рўйхат бўлса, ҳаммаси жойида, аммо агар у катта бўлиши кутілса ва унда яна кўп нарса бўлса? Муаммо эмас - дейсиз, чунки ўтган дарсда биз memo API ни кўрдик, аynan компонентнинг кераксиз қайта чизилишини олдини олиш учун.

Шундай қилиб, келинг Items компонентимизни memo га ўрайлик ва ҳамма ишлар. Айтарли joyi, буни тўғридан-тўғри Items ни экспорт қилганда қилиш мумкин:

export default memo(Items);

memo ни импорт қилишни унутмаймиз:

import { memo } from 'react';

Энди консолни ochамиз ва tugmachalarni босамиз. Ҳамма ҳаракатlar бефойда! Биз компонентни мемолаштирдик, лекин 'click' tugmasi босилганда компонент Items барча вақтда қайта чизилиши давом этади.

Масала шундаки, ота-она компоненти қайта чизилганда, унинг функциялари янгидан яратилади - бу бизнинг Items га ўтказган функциямиз addItem га taаллуқли.

Аynan шу пайтда бизга useCallback хуки ёрдам беради. Келинг уни қўллаймиз. Аввало уни App га импорт қиламиз:

import { useCallback } from 'react';

Сўнгра oddй addItem функциясини эълон қилишни Function Expression га ўзгартирамиз, биринчи параметр sifatida useCallback учун бизнинг функциямизни колбэк кўринишида кўрсатамиз. Иккинчи параметр sifatida қавс ичида bogʻliqliklarni кўрсатамиз - функцияда ishtirok etadigan барча реактив ўзгарувчилар, bizning ҳолатимизда бу массив items:

const addItem = useCallback(() => { setItems(() => [...items, 'New item']); }, [items]);

Тайёр! Шу тариқа биз функцияни кэшладик. Янгидан tugmachalarni босамиз ва кўрамизки, энди 'click' tugmasi босилганда бизнинг фарзанд компонент қайта чизилмайди.

App компонентини яратинг, уңга матн bilan абзац joylashtiring. Бошланғич қиймати 'text' бўлган стейт ҳосил қилинг ва уни абзацда кўрсатинг. Абзац босилганда уңга матннинг охирига унглатиш белгиси қўшилсин.

Products фарзанд компонентини яратинг, уnda янги продукт қўшиш учун tugma бўлсин. Уни App да жойланг. Ота-она компонентида продуктлар массиви bilan стейт ҳосил қилинг ва янги продукт қўшиш учун функция яратинг. Уларни фарзандга проплар sifatida ўтказінг, унда ўтказілган массивни ul рўйхат шаклида кўрсатинг.

Products да консолга матн 'products render' ни чиқаринг. Products ни memo га ўранг. Абзац ва tugmani босинг. Ишонч ҳосил қилингки, абзац босилганда фарзанд компонент barobar қайта чизилишини.

Продуктларни қўшиш учун функцияни useCallback хукига ўраб, кэшланг. Абзац ва tugmani босинг. Ишонч ҳосил қилингки, абзац босилганда, фарзанд компонент энди кўпроқ қайта чизилмайди.

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