Как браузер читает JSX?
Браузер не может напрямую прочитать и понять JSX, так как JSX - это расширение языка JavaScript, которое используется во фреймворке React для создания пользовательского интерфейса. JSX выглядит как комбинация JavaScript и HTML.
Чтобы браузер мог понять JSX, необходимо преобразовать его в обычный JavaScript. Этот процесс называется транспиляцией. Для этого обычно используются специальные инструменты или сборщики (например, Babel), которые преобразуют JSX в эквивалентный JavaScript код.
В примере выше JSX трансформируется в вызов
После транспиляции JSX в JavaScript, браузер может вычитать и исполнять этот JavaScript код для отображения веб-страницы пользователю.
#frontend #react #jsx
Браузер не может напрямую прочитать и понять JSX, так как JSX - это расширение языка JavaScript, которое используется во фреймворке React для создания пользовательского интерфейса. JSX выглядит как комбинация JavaScript и HTML.
Чтобы браузер мог понять JSX, необходимо преобразовать его в обычный JavaScript. Этот процесс называется транспиляцией. Для этого обычно используются специальные инструменты или сборщики (например, Babel), которые преобразуют JSX в эквивалентный JavaScript код.
const element = <h1>Hello, World!</h1>;
const element = React.createElement('h1', null, 'Hello, World!');
В примере выше JSX трансформируется в вызов
React.createElement
, который создает элемент с тегом h1
и содержанием "Hello, World!".После транспиляции JSX в JavaScript, браузер может вычитать и исполнять этот JavaScript код для отображения веб-страницы пользователю.
#frontend #react #jsx
Type Guards - это выражения, проверяющие тип в runtime. Они позволяют сузить тип переменной в блоке кода.
typeof проверяет тип значения во время выполнения. Если val - строка, выполняется первый блок, где доступны строковые методы. Иначе val считается числом, и доступны числовые методы.
function processValue(val: string | number) {
if (typeof val === "string") {
console.log(val.toUpperCase()); // val имеет тип string
} else {
console.log(val.toFixed(2)); // val имеет тип number
}
}
instanceof проверяет, является ли объект экземпляром определённого класса. Если animal - экземпляр Dog, вызывается bark(). В противном случае считается, что это Cat, и вызывается meow().
class Dog {
bark() {}
}
class Cat {
meow() {}
}
function makeSound(animal: Dog | Cat) {
if (animal instanceof Dog) {
animal.bark(); // animal имеет тип Dog
} else {
animal.meow(); // animal имеет тип Cat
}
}
isFish - это пользовательская функция-проверка типа. Она проверяет наличие метода swim. Если метод есть, функция возвращает true, и TypeScript считает pet объектом типа Fish. Иначе pet считается Bird.
interface Fish { swim: () => void; }
interface Bird { fly: () => void; }
function isFish(pet: Fish | Bird): pet is Fish {
return (pet as Fish).swim !== undefined;
}
function move(pet: Fish | Bird) {
if (isFish(pet)) {
pet.swim(); // pet имеет тип Fish
} else {
pet.fly(); // pet имеет тип Bird
}
}
#frontend #react #typescript
Please open Telegram to view this post
VIEW IN TELEGRAM
Разница между Context API и Redux
Context API и Redux решают схожие задачи, но применяются в разных ситуациях. Обе технологии используются для управления состоянием в React-приложениях, но подход к их применению и масштаб использования различен.
📌 Context API хорош для передачи статичных данных или тех, что редко изменяются. Однако он не рассчитан на сложное управление состоянием, особенно если его много, и если нужно отслеживать изменения.
📌 Redux нужен там, где важно чётко отслеживать все изменения состояния, легко тестировать и логировать эти изменения, а также предсказуемо управлять ими. Он даёт больше возможностей и контроля, но требует больше кода и сложнее в настройке по сравнению с Context API.
#redux #frontend #react #context
Context API и Redux решают схожие задачи, но применяются в разных ситуациях. Обе технологии используются для управления состоянием в React-приложениях, но подход к их применению и масштаб использования различен.
Context API в React удобен, когда нужно передать данные на несколько уровней глубже по иерархии компонентов, минуя промежуточные. Например, у вас есть тема оформления (светлая/тёмная), которая должна быть доступна на любом уровне приложения. Использовать props для передачи таких данных на каждом уровне неэффективно и приводит к "props drilling". Context API позволяет создать глобальный контекст для темы, к которому любой компонент может обратиться напрямую, не завися от промежуточных компонентов.
Redux стоит использовать, когда приложение сложное и нужно централизованное управление состоянием. Представьте крупное приложение с корзиной покупок, аутентификацией, и несколькими взаимодействующими страницами. Каждая часть приложения может нуждаться в доступе к общим данным и реагировать на их изменения. В Redux есть одно глобальное хранилище, где хранится все состояние приложения. Компоненты могут получать данные из этого хранилища и отправлять туда изменения через экшены.
#redux #frontend #react #context
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Отличие useMemo от useCallback
📌 useMemo():
- Кэширует результат выполнения функции между рендерами компонента.
- Возвращает закэшированное значение.
- Полезен для оптимизации вычислений и предотвращения ненужных перерасчётов.
📌 useCallback():
- Кэширует саму функцию между рендерами компонента.
- Возвращает мемоизированную версию функции.
- Полезен для предотвращения лишних ререндеров компонентов, когда функция используется в зависимостях других хуков.
Вкратце, useMemo кэширует вычисленное значение, а useCallback — кэширует функцию.
#react #memo #useMemo #useCallback
- Кэширует результат выполнения функции между рендерами компонента.
- Возвращает закэшированное значение.
- Полезен для оптимизации вычислений и предотвращения ненужных перерасчётов.
- Кэширует саму функцию между рендерами компонента.
- Возвращает мемоизированную версию функции.
- Полезен для предотвращения лишних ререндеров компонентов, когда функция используется в зависимостях других хуков.
Вкратце, useMemo кэширует вычисленное значение, а useCallback — кэширует функцию.
#react #memo #useMemo #useCallback
Please open Telegram to view this post
VIEW IN TELEGRAM
Менторство — самый эффективный способ обучения. В отличие от многих менторов, которые ограничиваются перепиской и предоставлением материалов, я глубоко вовлечен в процесс. Мой подход — развитие сообщества и постоянное улучшение обучения.
В IT нет такой конкуренции, как это часто изображают. Один из моих учеников за неделю прошел 5 скринингов, 3 из них привели к приглашению на технические собеседования, сейчас ожидаем фидбек от двух компаний. Диапазон зарплат — от 150 до 250 тысяч рублей. Он практикуется в Ехабе уже 1.5 месяца и посещает каждый день созвоны.
Моя программа охватывает 90% вопросов, которые могут задать на собеседовании. Ученики уверенно рассказывают о своем опыте и процессах, как отче наш. Зачем начинать с позиции джуна за 40 тысяч, если можно претендовать на мидл-уровень с зарплатой 200 тысяч? Это не фантазии — это реальность, которую я наблюдаю ежедневно, когда ребята получают офферы на 150к+.
Мой подход позволяет новичкам без опыта быть сильнее специалистов с 1-3 годами стажа. Мы изучаем полный стек, архитектуру, рабочие кейсы, а также прокачиваемся в Ехабе, работая в команде из 30 человек с ежедневными дейликами, канбан доской, планированием и ретроспективой.
К концу года каждый из вас, кто имеет базу, может найти работу с зарплатой от 150 тысяч. А новички смогут освоить стек, чтобы после Нового года приступить к поиску работы. Просто представьте, что вы работаете в сфере, которая вам нравится и получаете 150к. Это может стать правдой, если взять все в свои руки.
До конца августа сделаю скидку 10% на обучение. Это отличный шанс для тех, кто сомневался.
Сайт с ценами:
https://reactify.ru
Канал с полным обзором обучения:
@mentor_reactify
На канале также есть гайд — заходите и забирайте себе!
#mentor #react #frontend
В IT нет такой конкуренции, как это часто изображают. Один из моих учеников за неделю прошел 5 скринингов, 3 из них привели к приглашению на технические собеседования, сейчас ожидаем фидбек от двух компаний. Диапазон зарплат — от 150 до 250 тысяч рублей. Он практикуется в Ехабе уже 1.5 месяца и посещает каждый день созвоны.
Моя программа охватывает 90% вопросов, которые могут задать на собеседовании. Ученики уверенно рассказывают о своем опыте и процессах, как отче наш. Зачем начинать с позиции джуна за 40 тысяч, если можно претендовать на мидл-уровень с зарплатой 200 тысяч? Это не фантазии — это реальность, которую я наблюдаю ежедневно, когда ребята получают офферы на 150к+.
Мой подход позволяет новичкам без опыта быть сильнее специалистов с 1-3 годами стажа. Мы изучаем полный стек, архитектуру, рабочие кейсы, а также прокачиваемся в Ехабе, работая в команде из 30 человек с ежедневными дейликами, канбан доской, планированием и ретроспективой.
К концу года каждый из вас, кто имеет базу, может найти работу с зарплатой от 150 тысяч. А новички смогут освоить стек, чтобы после Нового года приступить к поиску работы. Просто представьте, что вы работаете в сфере, которая вам нравится и получаете 150к. Это может стать правдой, если взять все в свои руки.
До конца августа сделаю скидку 10% на обучение. Это отличный шанс для тех, кто сомневался.
Сайт с ценами:
https://reactify.ru
Канал с полным обзором обучения:
@mentor_reactify
На канале также есть гайд — заходите и забирайте себе!
#mentor #react #frontend
Какой будет порядок логов? И Что будет в этих логах?
#frontend #react
import React, { useEffect, useState } from 'react'
import ReactDOM from 'react-dom'
function App() {
const [state, setState] = useState(0)
console.log(state)
useEffect(() => {
setState(state => state + 1)
}, [])
useEffect(() => {
console.log(state)
setTimeout(() => {
console.log(state)
}, 100)
}, [])
return null
}
ReactDOM.render(<App/>, document.getElementById('root'))
#frontend #react
Render Props
Render Props в React — это паттерн для повторного использования логики между компонентами. Вместо того чтобы делать компоненты "умными" или использовать HOC (Higher-Order Components), компонент с Render Props использует функцию для рендеринга, передаваемую через проп.
Зачем нужно?
✔️ Повторное использование логики: Логику можно вынести в один компонент и использовать с разным UI.
✔️ Гибкость: Позволяет передавать любую JSX разметку, что делает компонент более универсальным.
#frontend #react
Render Props в React — это паттерн для повторного использования логики между компонентами. Вместо того чтобы делать компоненты "умными" или использовать HOC (Higher-Order Components), компонент с Render Props использует функцию для рендеринга, передаваемую через проп.
Зачем нужно?
#frontend #react
Please open Telegram to view this post
VIEW IN TELEGRAM
В этом видео мы подробно рассмотрим архитектуру Frontend-приложений, начиная с технологий и инструментов, заканчивая настройками и деплоем. Это будет комплексный обзор всех ключевых компонентов архитектуры: React, Redux, Storybook, Webpack, Docker, Nginx, CI/CD и других технологий.
В следующих видео мы детально разберем каждую технологию по отдельности и начнем пошаговое создание собственного приложения с нуля.
Видео уже на канале!
Я не оставляю ссылку, так как видео лучше продвигается, если заходить на него напрямую с YouTube. Это помогает улучшить его рейтинг и увеличить шансы на органическое продвижение.
#frontend #react #docker #cicd #deploy
Please open Telegram to view this post
VIEW IN TELEGRAM
Ранее React использовал механизм Stack Reconciler для обновления интерфейсов, что приводило к проблемам с производительностью. Одним из главных недостатков было невозможность приостановить и возобновить рендеринг, что могло вызывать "замораживание" интерфейса при выполнении тяжёлых операций. Чтобы устранить этот недостаток, начиная с React 16, была создана новая архитектура — React Fiber.
React Fiber — это переработанная структура внутреннего устройства React, которая управляет процессом рендеринга и согласования (reconciliation). Основное нововведение заключается в том, что теперь React разбивает весь процесс обновления на мелкие задачи, которые можно:
1. Приостанавливать.
2. Прерывать для выполнения более важных операций.
3. Возобновлять с того же места.
4. Отменять обновления, если компонент больше не нужен.
Эта архитектура помогает React быть более отзывчивым и гибким в работе с сложными интерфейсами.
Вместо использования традиционного стека для отслеживания состояния компонентов, Fiber создаёт связанную структуру данных для каждого элемента виртуального DOM. Это позволяет React двигаться вперед и назад по компонентному дереву, задавать приоритет задач и управлять состояниями на уровне узлов.
Каждый узел Fiber содержит:
- Тип компонента (функциональный, классовый или элемент DOM).
- Ссылки на дочерние, родительские и соседние узлы.
- Текущее состояние и приоритет выполнения.
Такой подход позволяет React выполнять задачи в соответствии с их приоритетом:
- Высокий приоритет: действия пользователя (клики, ввод текста).
- Низкий приоритет: обновление анимации или загрузка данных.
React Fiber использует две основные фазы рендеринга:
React создаёт новое дерево Fiber, вычисляя, какие изменения должны быть сделаны.
Эта фаза может прерываться и возобновляться.
Все изменения применяются к реальному DOM.
Происходит быстро и синхронно, чтобы интерфейс обновлялся без задержек.
- Time Slicing: React разбивает выполнение задач на короткие промежутки времени, чтобы не блокировать интерфейс.
- Асинхронный рендеринг: позволяет приостанавливать и возобновлять рендеринг компонентов.
- Гибкое управление задачами: React определяет, какие задачи выполнять первыми, а какие можно отложить, чтобы обеспечить плавное взаимодействие с пользователем.
#frontend #react
Please open Telegram to view this post
VIEW IN TELEGRAM
В React рендеринг — это процесс, при котором компонент заново отрисовывается на основе новых данных. Этот процесс происходит по нескольким причинам:
Если состояние компонента меняется, React автоматически запускает его ререндеринг. Например:
const CounterButton = () => {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
Click me {count} times
</button>
);
};
Когда мы вызываем setCount, значение count меняется, что приводит к ререндерингу компонента, чтобы отобразить обновлённое число.
Пропсы сами по себе не являются первичной причиной ререндеринга, а скорее следствием изменения состояния в родительском компоненте. Если состояние родителя обновляется, он перерисовывается и передает изменённые пропсы дочернему компоненту. Это приводит к ререндерингу дочернего компонента:
// Родительский компонент
const Parent = () => {
const [text, setText] = useState('Hello');
return (
<>
<Child message={text} />
<button onClick={() => setText('Hello, World!')}>Change Text</button>
</>
);
};
// Дочерний компонент
const Child = ({ message }) => <div>{message}</div>;
Когда setText меняет состояние text, компонент Parent перерисовывается, и передаёт новое значение пропса message в Child, что вызывает ререндеринг дочернего компонента.
Примечание: При использовании React.memo изменения пропсов действительно считаются причиной ререндеринга, если новый пропс отличается от предыдущего.
Если компонент использует контекст (useContext или <Context.Consumer>), и его значение меняется, то все компоненты, подписанные на этот контекст, будут перерисованы:
const ThemeContext = React.createContext('light');
const Parent = () => {
const [theme, setTheme] = useState('light');
return (
<ThemeContext.Provider value={theme}>
<Child />
<button onClick={() => setTheme('dark')}>Toggle Theme</button>
</ThemeContext.Provider>
);
};
const Child = () => {
const theme = useContext(ThemeContext);
return <div>Current theme: {theme}</div>;
};
Когда значение контекста theme изменяется (например, с 'light' на 'dark'), компонент Child ререндерится, чтобы отобразить новое значение темы.
Даже если состояние компонента и его пропсы остаются неизменными, он будет перерисован, если родительский компонент ререндерится (даже без видимых изменений). Это связано с тем, что дочерние компоненты автоматически ререндерятся вместе с родительским компонентом. Например:
const Parent = () => {
const [count, setCount] = useState(0);
return (
<>
<button onClick={() => setCount(count + 1)}>Increment</button>
<Child />
</>
);
};
const Child = () => <div>I'm a child</div>;
Здесь Child не зависит от состояния count, но каждый раз, когда Parent ререндерится, Child ререндерится тоже. Это можно предотвратить с помощью React.memo.
#react #frontend #memo #render
Please open Telegram to view this post
VIEW IN TELEGRAM