Що таке React
Віртуальний DOM: React використовує віртуальний DOM, щоб покращити продуктивність. Замість оновлення всього дерева DOM при кожній зміні, React оновлює тільки ті частини, які змінилися. Це зменшує кількість операцій, пов’язаних з взаємодією з реальним DOM і забезпечує швидшу роботу додатків.
Компоненти: React працює за принципом компонентів. Кожен елемент інтерфейсу представляє собою компонент, який можна створити, настроїти і використовувати повторно.
Одностороння потік даних: Дані в React пересуваються в одному напрямку - від батьківських компонентів до дітей. Це спрощує управління станом додатку і дозволяє зберігати дані відокремлено від представлення.
JSX: React використовує JSX (JavaScript XML) для опису інтерфейсу. JSX дозволяє писати HTML-подібний код в JavaScript, що робить код більш зрозумілим і легким для розробки.
Що таке реактивність
Полягає в створенні програм, які реагують на зміни даних та автоматично оновлюють інтерфейс користувача без необхідності вручну керувати оновленнями. Ось ключові аспекти реактивності:
Чому реакт не зовсім реактивний
Що таке JSX і як він трансформується в html
SX (JavaScript XML) - це розширення JavaScript, яке дозволяє вбудовувати HTML-подібний код безпосередньо в JavaScript. При компіляції вашого React коду, JSX перетворюється на виклики JavaScript-функцій, які створюють віртуальний DOM (Document Object Model).
Ось приклад того, як JSX перетворюється на віртуальний DOM та, в кінцевому підсумку, на HTML:
const element = {
type: ‘h1’,
props: {
children: ‘Hello, World!’
}
};
Як працює Virtual DOM
4.Відмінності (diffing):
React визначає різниці між попереднім і новим віртуальним DOM, що допомагає знайти, які елементи і як саме змінилися.
Цей процес відбувається при кожному оновленні стану компонентів та забезпечує реактивність та ефективність React додатку.
Які оптимізації рендеренгу застосовує react
Як реакт відрізняє хук від функції
Реакт не “відрізняє” хук від функції на рівні розпізнавання самої функції. Замість цього, існують два ключові підходи, які використовуються для визначення та валідації хуків в реакт-компонентах:
Правила назви хуків: Кастомні хуки мають конвенційні назви, які починаються з “use”. Наприклад, useEffect, useState, useCustomHook, і так далі. Ця конвенція допомагає розпізнати, що функція призначена для використання як хук.
Лінтери та правила хуків (Hook Rules): Реакт використовує систему лінтингу (eslint rules), таку як eslint-plugin-react-hooks, для виявлення та валідації правильного використання хуків. Ці правила перевіряють, чи хуки викликаються на верхньому рівні компонента або іншого хука, і чи не викликаються вони всередині циклів, умов, або інших неприпустимих місць.
Ці дві практики в комбінації дозволяють реактові впізнати та валідувати хуки. Таким чином, коли ви створюєте функцію з ім’ям, яке починається з “use” і використовується відповідно до правил хуків, реакт припускає, що це може бути хуком, і застосовує до неї відповідні правила.
Як виконується монтування
Коли компонент вперше з’являється на екрані, ми називаємо це монтуванням. Це коли React створює екземпляр цього компонента вперше, ініціалізує його стан, запускає його хуки та додає елементи до DOM. Кінцевий результат — ми бачимо на екрані те, що відтворюємо в цьому компоненті.
Як виконується розмантування
Потім відбувається демонтування: це коли React виявляє, що компонент більше не потрібен. Таким чином, він виконує остаточне очищення, знищує екземпляр цього компонента та все, що з ним пов’язано, як-от стан компонента, і, нарешті, видаляє пов’язаний з ним елемент DOM.
Як виконується ре-рендер
І, нарешті, повторний рендеринг. Це коли React оновлює вже існуючий компонент новою інформацією. Порівняно з монтуванням повторне рендеринг є легким: React просто повторно використовує вже існуючий екземпляр, запускає хуки, виконує всі необхідні обчислення та оновлює існуючий елемент DOM новими атрибутами.
UseState
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 = > {
….
….
)};
};
useEffect
Асинхронный хук.
FLOW:
1. Реакт вызывет компонент один раз который возвращает ему JSX. При єтом когда проходит useEfect мы его регистрируем и говорим что вызови его тогда когда измениться значение в масиве значений.
Чтобы скинуть значения интервалов, таймаутов, подписок, чтобы удалить компонент в DOM-e используем return.
UseContext
Делает все тоже, что и редакс, только со своим синтаксисом.
создаем контекст:
const CastomContext = createContext({});
создаем функцию которая оборачивает Context.Provider:
export function Context() {…..
value = {….}
return (
< CastomContext.Provider value={contextValue}>
{props.children}
</ CastomContext.Provider>
)
}
cоздаем кастомный хук чтобы постоянно не исползовать useContext:
export function useCastomContext() {
const context = useContext(CastomContext);
if (context === undefined) {
throw new Error(
‘useCastomContext must be used with in a
ContextProvider. Wrap a parent component in
<ContextProvider> to fix this error.' );
}
return context;
}</ContextProvider>
И потом в любом компоненте мы вызываем useCastomContext() и деструктуризируем нужные нам значения.
const { dashboard, initialCategories } = useCastomContext();
UseReducer
UseReducer - Функция которая принимает текущее состояние нашего приложения и принимает action в зависимости от которого предпологается что функция вернет новое состояние.
ВОЗВРАЩАЕТ значение и функцию обновление.
ПРИНИМАЕТ нужный редюсер, и значение по умолчанию (initial state).
const [{ r, g, b }, dispatch] = useReducer(reducer, { r: 0, g: 150, b: 200 });
dispatch - функция которая прнимает action, payload, meta
React гарантує, що функція dispatch зберігає ідентичність і не змінюється під час повторних рендерів.
const limitRGB = (num) => (num < 0 ? 0 : num > 255 ? 255 : num);
const step = 50;
const reducer = (state, action) => {
switch (action.type) {
case ‘INCREMENT_R’:
return {
…state,
r: limitRGB(state.r + step),
};
case ‘DECREMENT_R’:
return {
…state,
r: limitRGB(state.r - step),
};
……
default:
return state;
}
};
export default function AppReducer() {
const [{ r, g, b }, dispatch] = useReducer(reducer, { r: 0, g: 150, b: 200 });
return (
<>
<h1 style={{ color: rgb(${r}, ${g}, ${b}) }}>
Hello CodeSandbox
</h1>
<div>
<span>r</span>
<button onClick={() => dispatch({ type: ‘INCREMENT_R’ })}>
+
</button>
<button onClick={() => dispatch({ type: ‘DECREMENT_R’ })}>
-
</button>
</div>
<div>….. </div>
<div>….. </div>
</>
);
}
useRef
Используется в двух случаях.
1. Когда нам нужно найти елемент в DOM дереве.
Пример:
сonst inputEl = useRef(null);
<input placeholder=’name’ ref={inputEl}>
Раньше в JS мы могли получить данный елемент через querySelecor() то сейчас мы
помечаем данные елемент, тем самым избегаем длиного поиска по всему DOM
деревую.
2. Для хранения статических значений в поле current мы можем хранить любое статическое значение. При чем при изминении данного значения стейт не перерендіривается.
Служит для запоминания значение без перередеринга.
** Если нужно запустить код когда Реакт присоединяет или отсоединяет Ref к узлу DOM мы можем использовать callbackRef
Оптимізація через “debounce”, бібліотека lodash.debounce
Використання debounce в React додатку може бути корисним в багатьох сценаріях, де потрібно зменшити частоту викликів функцій для оптимізації продуктивності та реагування на користувацькі дії. Ось деякі приклади:
Різниця між “setTimeout” та “Debounce”
setTimeout:
Debounce:
Debounce - це техніка, що затримує виклик функції до тих пір, поки не мине певний інтервал часу без нових викликів. Використовується для оптимізації і реагування на дії користувача, коли відомо, що може бути багато швидких подій.
Викликає функцію лише один раз після закінчення серії вхідних подій.
Якщо вам потрібно затримати виклик функції один раз після закінчення дії, то setTimeout може бути вибраним варіантом.
Якщо у вас є багато швидких подій, і ви хочете викликати функцію після закінчення серії подій, то debounce є кращим варіантом. Він дозволяє уникнути багатошвидкісних викликів і покращити продуктивність додатку.
Як працює bable в React
Babel - це транслятор (транспілятор) JavaScript, який дозволяє вам використовувати сучасний синтаксис JavaScript і транслювати його у код, який може розуміти більшість браузерів або інші середовища виконання JavaScript.
Основні принципи роботи Babel:
Одним із найбільших використань Babel є трансляція коду, написаного з використанням сучасних стандартів ECMAScript (ES6, ES7 і так далі), в код, який може бути виконаний в старіших браузерах або у середовищах, що не підтримують останні синтаксичні фішки.