React Flashcards
Що таке React
Віртуальний DOM: React використовує віртуальний DOM, щоб покращити продуктивність. Замість оновлення всього дерева DOM при кожній зміні, React оновлює тільки ті частини, які змінилися. Це зменшує кількість операцій, пов’язаних з взаємодією з реальним DOM і забезпечує швидшу роботу додатків.
Компоненти: React працює за принципом компонентів. Кожен елемент інтерфейсу представляє собою компонент, який можна створити, настроїти і використовувати повторно.
Одностороння потік даних: Дані в React пересуваються в одному напрямку - від батьківських компонентів до дітей. Це спрощує управління станом додатку і дозволяє зберігати дані відокремлено від представлення.
JSX: React використовує JSX (JavaScript XML) для опису інтерфейсу. JSX дозволяє писати HTML-подібний код в JavaScript, що робить код більш зрозумілим і легким для розробки.
Що таке реактивність
Полягає в створенні програм, які реагують на зміни даних та автоматично оновлюють інтерфейс користувача без необхідності вручну керувати оновленнями. Ось ключові аспекти реактивності:
- Декларативність: Реактивні програми зазвичай використовують декларативний підхід для опису структури та логіки додатку. Замість імперативного коду, де ви описуєте, як досягти певного стану, ви вказуєте, як повинен виглядати бажаний стан, і система сама забезпечує його досягнення.
- Автоматичні оновлення: Реактивність дозволяє створювати залежності між даними та відображенням. Коли дані змінюються, відображення автоматично оновлюються, щоб відобразити актуальний стан. Немає потреби вручну керувати оновленнями.
- Двосторонні зв’язки: Реактивність дозволяє встановлювати двосторонні зв’язки між даними та відображенням. Якщо дані змінюються в додатку, вони автоматично оновлюються в інтерфейсі, і навпаки. Це полегшує взаємодію користувача з додатком.
- Спостережувані дані (Observable Data): Реактивність часто використовує концепцію спостережуваних даних, які можна спостерігати на зміни. Це дозволяє компонентам автоматично реагувати на зміни в цих даних.
- Реактивні бібліотеки і фреймворки: У Frontend розробці існують багато бібліотек і фреймворків, які спеціалізуються на реактивному програмуванні. Наприклад, бібліотека RxJS для роботи з потоками подій або фреймворки, такі як Vue.js та Angular, які надають реактивний підхід для розробки інтерфейсів.
- Асинхронність: Реактивність також допомагає керувати асинхронними операціями, такими як запити до сервера або обробка подій. Вона спрощує роботу з асинхронним кодом та дозволяє зручно взаємодіяти з асинхронними даними.
Чому реакт не зовсім реактивний
- Оновлення за запитом (Request-Driven Updates): У React оновлення відбуваються за запитом, а не автоматично. Ви повинні визначити, коли і яким чином виконувати оновлення, навіть якщо React автоматично порівнює віртуальний DOM. В інших реактивних фреймворках, таких як Vue.js, зміни даних спричиняють автоматичне оновлення відображення.
- Часткова реактивність: React визначає реактивність для кожного компонента, а не для всього додатку в цілому. Це дозволяє контролювати точно, які частини додатку повинні бути реактивними. У реактивних фреймворках ця реактивність може бути більш загальною.
- Імперативна логіка: В React ви можете використовувати імперативну логіку, коли це необхідно. Ви можете вручну керувати DOM-елементами за допомогою React, хоча це може не бути найкращою практикою.
- Фокус на Virtual DOM: React активно використовує Virtual DOM для ефективного оновлення фактичного DOM, але ця частина підходу не завжди відображається в термінах реактивності.
Що таке JSX і як він трансформується в html
SX (JavaScript XML) - це розширення JavaScript, яке дозволяє вбудовувати HTML-подібний код безпосередньо в JavaScript. При компіляції вашого React коду, JSX перетворюється на виклики JavaScript-функцій, які створюють віртуальний DOM (Document Object Model).
Ось приклад того, як JSX перетворюється на віртуальний DOM та, в кінцевому підсумку, на HTML:
- JSX код:
const element = <h1>Hello, World!</h1>; - Перетворення в віртуальний DOM (JSX вище перетворюється на віртуальний DOM, подібний до об’єкта):
const element = {
type: ‘h1’,
props: {
children: ‘Hello, World!’
}
};
- React використовує цей віртуальний DOM для оновлення фактичного DOM на стороні браузера. На цьому етапі віртуальний DOM вставляється у фактичний DOM, і ви бачите текст “Hello, World!” в вашому браузері:
Як працює Virtual DOM
- Початковий рендеринг:
Під час початкового рендерингу React створює віртуальний DOM - це віртуальне представлення поточного стану вашого додатку.
Віртуальний DOM - це дерево об’єктів JavaScript, яке відображає структуру вашого інтерфейсу та стан кожного компонента. - Зміни стану:
Коли стан React компонентів змінюється (наприклад, через взаємодію користувача або завантаження нових даних), React не оновлює фактичний DOM напряму.
Замість цього, React генерує новий віртуальний DOM зі зміненими даними та порівнює його з попереднім віртуальним DOM. - Реконсиліація віртуального DOM:
Порівнюючи попередній і новий віртуальний DOM, React визначає, які частини сторінки змінилися.
Цей процес порівняння відомий як реконсиліація (reconciliation).
4.Відмінності (diffing):
React визначає різниці між попереднім і новим віртуальним DOM, що допомагає знайти, які елементи і як саме змінилися.
- Створення пакету змін:
Після визначення різниць React створює пакет змін (reconciliation diff) - це набір інструкцій для оновлення реального DOM так, щоб він відображав зміни віртуального DOM. - Паралельна обробка та мінімізація операцій:
React використовує оптимізації, такі як паралельна обробка та мінімізація операцій (batching), щоб впоратися з оновленнями більш ефективно. - Оновлення фактичного DOM:
Нарешті, React оновлює фактичний DOM лише за допомогою змін, які були обчислені під час реконсиліації та створення пакету змін.
Це дозволяє уникнути зайвих операцій та мінімізувати затрати на оновлення DOM.
Завершення циклу рендерингу:
Цей процес відбувається при кожному оновленні стану компонентів та забезпечує реактивність та ефективність React додатку.
Які оптимізації рендеренгу застосовує react
- Паралельна обробка (Concurrent Mode):
В React 18 та більших версіях введений режим під назвою “Concurrent Mode”, який дозволяє React працювати в паралельному режимі. Це означає, що React може виконувати багато різних завдань одночасно, включаючи обробку оновлень компонентів, обробку подій користувача та інші операції, без блокування головного потоку браузера. - Мінімізація операцій:
React використовує віртуальний DOM для мінімізації операцій, які потрібно виконати для оновлення фактичного DOM. Після порівняння попереднього і нового віртуальних DOM, React визначає найменший набір операцій, необхідних для оновлення, і виконує лише ці операції. - Batching (пакетування операцій):
React також використовує підхід до пакетування операцій. Замість того, щоб безпосередньо оновлювати DOM після кожної окремої зміни, він групує багато операцій в одну і виконує їх одноразово. Це допомагає уникнути зайвих оновлень та зберігає відповідність інтерфейсу в незмінному стані до завершення пакету. - Операції пріоритетів:
Concurrent Mode в React дозволяє визначити пріоритети операцій. Наприклад, операції, пов’язані з користувачем (наприклад, кліки), можуть мати вищий пріоритет, ніж інші операції. Це дозволяє React реагувати на дії користувача миттєво, навіть якщо в процесі обробки були запущені інші задачі. - Suspense (відстрочка):
React також використовує “Suspense” для управління асинхронним завантаженням даних. Завдяки цій функції, ви можете зупиняти виконання компонента до завершення завантаження даних, забезпечуючи більш плавні взаємодії та зменшення
Як реакт відрізняє хук від функції
Реакт не “відрізняє” хук від функції на рівні розпізнавання самої функції. Замість цього, існують два ключові підходи, які використовуються для визначення та валідації хуків в реакт-компонентах:
Правила назви хуків: Кастомні хуки мають конвенційні назви, які починаються з “use”. Наприклад, useEffect, useState, useCustomHook, і так далі. Ця конвенція допомагає розпізнати, що функція призначена для використання як хук.
Лінтери та правила хуків (Hook Rules): Реакт використовує систему лінтингу (eslint rules), таку як eslint-plugin-react-hooks, для виявлення та валідації правильного використання хуків. Ці правила перевіряють, чи хуки викликаються на верхньому рівні компонента або іншого хука, і чи не викликаються вони всередині циклів, умов, або інших неприпустимих місць.
Ці дві практики в комбінації дозволяють реактові впізнати та валідувати хуки. Таким чином, коли ви створюєте функцію з ім’ям, яке починається з “use” і використовується відповідно до правил хуків, реакт припускає, що це може бути хуком, і застосовує до неї відповідні правила.
Як виконується монтування
Коли компонент вперше з’являється на екрані, ми називаємо це монтуванням. Це коли React створює екземпляр цього компонента вперше, ініціалізує його стан, запускає його хуки та додає елементи до DOM. Кінцевий результат — ми бачимо на екрані те, що відтворюємо в цьому компоненті.
Як виконується розмантування
Потім відбувається демонтування: це коли React виявляє, що компонент більше не потрібен. Таким чином, він виконує остаточне очищення, знищує екземпляр цього компонента та все, що з ним пов’язано, як-от стан компонента, і, нарешті, видаляє пов’язаний з ним елемент DOM.
Як виконується ре-рендер
І, нарешті, повторний рендеринг. Це коли React оновлює вже існуючий компонент новою інформацією. Порівняно з монтуванням повторне рендеринг є легким: React просто повторно використовує вже існуючий екземпляр, запускає хуки, виконує всі необхідні обчислення та оновлює існуючий елемент DOM новими атрибутами.
UseState
- Это асинхронная функция которая возвращает массив данных, и функцию которая меняет эти данные.
- Используем только в компонентах, либо в других хуках,
- Не используем useState:
- для статических данных;
- в циклах и условиях; - Передаем фиксированное значение, или если значение меняется от предыдущего предпочтительнее передавать функцию useState((actual) => actual + 1)). Этот нюанс связан с асинхронной логикой, так как при использовании setInterval или setTimeout может вернуть не корректное значение.
UseMemo
- Это функция которая принимает функцию колбэк (которая создает объект), или сам объект. Вторым параметром масив зависимостей при изминении которых, создаваемый объект в колбэке перерисуется.
const createContextValue = () => {
return {
initialCategories,
categories,
viewOptions,
currentCategory,
currentBrand,
setCurrentBrand,
isDashboardLoading,
};
};
const contextValue = useMemo(
() => createContextValue(),
[
dashboard,
initialCategories,
categories,
viewOptions,
currentCategory,
currentBrand,
isDashboardLoading,
]
);
return (
<MyContext.Provider value={contextValue}>
<Outlet></Outlet>
</MyContext.Provider>
);
}
useCollback
- Это функция которая принимает функцию колбэк . Вторым параметром масив зависимостей при изминении которых, пересоздается данная функция. (Если не меняются значения, то функция всегда возвращается одна и та же.)
- Данный хук хорошо работает в двух случаях:
2.1. Когда в useEffect-е в масиве зависимостей есть функция и чтобы данная функция не пересоздавалась создается useCallback.
2.2 В связке с функцией memo().
Когда есть функция которая добавляет todo (addTodo). И есть компонент в который мы передаем данные знаечния. То функцию addTodo мы обарачиваем в useCallback а компонент в который мы передаем функцию addTodo делаем как memo();
const addTodo = uaeCallback( (newTodo) => setTodos( (todos) => […todos, newTodo]), []);
<NewTodo addTodo={addTodo}/>
NewTodo
export const NewTodo = memo(({addTodo}) => { …. }
Lazy, Suspense
При загрузке АРР все файлы компилятся в один файл bundle.js. Чтобы облегчить данный файл и вынести часть логики в другой файл (сделать так чтобы например страница Abou Us - компилилась только в том случае когда мы перейдем на данную страницу ) нужно завернуть импорт в lazy() а созданый компонент в Suspense.
const Homepage = lazy( () => import(‘./routes/HomePage);
const About = lazy(() => import(‘./routes/About’));
<Router>
<Suspense fallback={<div>Завантаження...</div>}>
<Routes>
<Route path="/" element={<Homepage></Homepage>} />
<Route path="/about" element={<About></About>} />
</Routes>
</Suspense>
</Router>
useTransition\useDeferredValue
useTransition:
Когда у нас есть input и на каждом вводе символа производится запрос на сервер и происходит сортировка, поиск елемента. При слабом компютере когда посимвольно мы будем удалять слово в поиске (в input-е) символ будет удалятся а контент будет менятся с большой задержкой. Чтобы улучшить данный вариант мы можем использовать:
startTransition - принимает функцию в середине которой может быть сколько угодно сетСтейтов.
isPending - булевое значение которое может показывать спинер.
const [isPending, startTransition] = useTransition();
const handleSearch = (e) => {
startTransition( () => { setSearch(e.target.value)}
};
useDeferredValue:
Делает тоже самое только для всего prop:
function Comments({entites=[]}) {
const value = useDeferredValue(entities);
value.map(component = > {
….
….
)};
};