⊗jsrtPmHkAMe 15 of 47 menu

API memo в React

Преди да разгледаме следващата кука, трябва да споменем и за полезното API memo, което ни помага да избегнем повторно рендериране на компонент, ако неговите пропси останат непроменени.

Нека разгледаме това с пример. Ще създадем компонент App, в който ще има два инпут полета, в които, да предположим, се въвеждат име и фамилия:

return ( <div> <label> name: <input value={name} onChange={(e) => setName(e.target.value)} /> </label> <br /> <label> surname: <input value={surn} onChange={(e) => setSurn(e.target.value)} /> </label> </div> );

Добавяме в началото на компонента стейтове за тях:

const [name, setName] = useState(''); const [surn, setSurn] = useState('');

Нека направим и детски компонент Child.js, нека той извежда поздрав, в който ще се показва въведеното име. Също така в конзолата ще се извежда низ 'child render' при всяко рендериране на този компонент:

function Child({ name }) { console.log('child render'); return <h3>Hello {name}!</h3>; }

Добавяме Child в верстката на основния компонент след последния инпут и ще му подаваме като пропс името:

<Child name={name} />

Импортираме го в основния компонент:

import Child from './Child';

А сега нека отворим конзолата и да въвеждаме име и фамилия в полетата. Тук ще видим, че дори при въвеждане на символи в полето за фамилия, нашият детски компонент ще се прерисува всеки път. Няма проблеми, все пак имаме малък компонент. Но представете си, ако този компонент показваше голямо количество данни и в същото време, се прерисуваше всеки път.

А сега нека обвием детския компонент в memo и да видим как ще се промени рендерирането. Първо импортираме в него memo:

import { memo } from 'react';

След това създаваме нова променлива и ѝ присвояваме нашия Child, обвит в memo. Ще получим следното функционално изражение:

const Child = memo( function Child({ name }) { console.log('child render'); return <h3>Hello {name}!</h3>; });

Отваряме конзолата и отново въвеждаме име и фамилия в полетата. Сега виждаме, че при въвеждане на фамилия, нашият детски компонент не се прерисува.

Трябва да помним, че това няма да работи, ако при непроменени пропси се променят стейтове, използвани от компонента или контекст, който използва промени.

Вземете кода на компонента App, който направихме в този урок, оставете в него само първия инпут. Създайте React компонент Text, съдържащ абзац с текст 'long text' и го разположете в App след инпута.

В компонента Text добавете ред console.log('text render');. Уверете се, че при въвеждане на символи в инпута компонентът Text се прерисува всеки път.

А сега обвийте компонента Text в memo. Уверете се, че при въвеждане на символи в инпута компонентът Text не се прерисува повторно.

Български
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
Ние използваме бисквитки за работата на сайта, анализ и персонализация. Обработката на данни се извършва в съответствие с Политика за поверителност.
приемам всички настройки отхвърляне