Telegram Web
🖥 Ручной триггер события click в ReactJS: пример кода

Если в двух словах, то для того чтобы в ReactJS вручную инициировать события клика, используйте ref, представляющий ссылку на соответствующий элемент, и вызовите в контексте этого элемента метод click(). Пример:
import React, { useRef } from 'react';

function MyButton() {
const btnRef = useRef();

// Функция для симуляции клика
const simulateClick = () => {
btnRef.current?.click();
};

return (
<>
<button ref={btnRef} onClick={() => alert('Кликнуто!')}>Кликните меня</button>
<button onClick={simulateClick}>Симуляция клика</button>
</>
);
}

В этом примере с использованием хука `useRef` создаётся ссылка btnRef на первую кнопку, затем функцией `simulateClick` вызывается метод `click()` у btnRef.current, что имитирует клик по этой кнопке.


Более детально

Использование refs: ключ к DOM. В то время как в React основным является декларативный подход к управлению DOM, в ряде случаев необходим прямой доступ к DOM-элементам. Предоставить такую возможность позволяют refs. Для функциональных компонентов используется хук useRef, для классовых — React.createRef.


Особенности вызова событий вручную. При решении вручную инициировать события следует учесть ряд нюансов:

Лексическое окружение: в классовых компонентах для сохранения контекста this используйте стрелочные функции.

Хранение refs: в классовых компонентах refs обычно присваиваются как свойства класса.

Вложенность компонентов: проверьте корректность расположения элементов в render-методе компонента.

Предотвращение стандартного поведения: чтобы контролировать стандартную реакцию на события, используйте e.preventDefault().

📎 Читать подробнее

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤‍🔥321
🖥 Разбираемся с ошибкой о уникальных ключах в React.js

В React рекомендуется использовать уникальные идентификаторы как ключи для дочерних элементов массива. Это делает более эффективным сохранение состояния компонентов и оптимизирует процесс перерендеринга. Если ваши списки не будут изменяться в будущем, то применение индексов как ключей неприемлемо. Использование уникальных ID, связанных с данными, обеспечивает бесперебойное обновление и способствует предотвращению ошибок при управлении состоянием и интерфейсом.
// используем уникальные ID 
const todoItems = todos.map(todo => <li key={todo.id}>{todo.task}</li>);

// если список не статический, не используйте индексы в качестве ключей
const menuItems = menu.map((dish, index) => <li key={index}>{dish.name}</li>);



Пару простых советов по поводу ключей:

В погоне за "идеальным" ключом. При обновлении компонентов ориентируйтесь на уникальные и стабильные ключи. Откажитесь от использования индексов массива, которые могут вызвать проблемы с производительностью. И забудьте о Math.random(), так как случайные значения не соответствуют принципам работы алгоритма React.

Чудеса управления ключами. Ставьте явные ключи каждому элементу в массиве. Это важно для эффективного обновления DOM. В методе .map() ключи следует присваивать на самом верхнем уровне элемента, чтобы обеспечить плавную работу компонента при рендеринге.

Запасной вариант: ручное создание ключей. Если уникальное свойство недоступно, вам пригодится создание уникальных идентификаторов вручную. Для этого подойдут библиотеки, такие как react-key-index или uuid, предлагающие надёжные методы генерации ключей.

📎 Читать подробнее

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱5👍43👎1🥴1
🖥 Адаптивный рендер в ReactJS для мобильных и ПК

Чтобы распознать, с какого устройства открывается ваше приложение — с мобильного или с десктопа — в ReactJS, воспользуйтесь window.matchMedia:
const isMobile = window.matchMedia("(max-width: 768px)").matches;


Значение isMobile примет значение true для экранов шириной меньше 768px — это показатель мобильных устройств. Параметр max-width можно настроить согласно вашим требованиям к адаптивности. В дальнейшем isMobile позволит наладить поведение приложения в зависимости от размера экрана.


Настройте React-компоненты так, чтобы они были чувствительны к изменению размеров экрана. Это особенно важно, когда пользователи переворачивают свои мобильные устройства или изменяют размеры окна браузера на десктопе:
import React, { useState, useEffect } from 'react';

// Хук useDeviceDetect для определения типа устройства
const useDeviceDetect = () => {
const [isMobile, setIsMobile] = useState(window.innerWidth < 768);

useEffect(() => {
// Отслеживаем изменение размера экрана здесь
const handleResize = () => setIsMobile(window.innerWidth < 768);
window.addEventListener('resize', handleResize);
// удаляем обработчик, чтобы предотвратить утечку памяти
return () => window.removeEventListener('resize', handleResize);
}, []);

return { isMobile };
};

export default useDeviceDetect;



Хук useDeviceDetect позволяет отслеживать изменение ширины устройства и динамически адаптировать рендеринг:
import React from 'react';
import useDeviceDetect from './useDeviceDetect';

const MyResponsiveComponent = () => {
const { isMobile } = useDeviceDetect();

return (
<div>
{
// Выбираем между мобильным и десктопным в зависимости от типа устройства
isMobile ? <MobileComponent /> : <DesktopComponent />
}
</div>
);
};

export default MyResponsiveComponent;


📎 Читать подробнее

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2743❤‍🔥1🔥1
🖥 Mode дня — StrictMode

Режим <StrictMode> позволяет находить распространенные ошибки в компонентах на ранних стадиях разработки.
Используйте StrictMode для включения дополнительных поведений разработки и предупреждений для внутреннего дерева компонентов.

Строгий режим включает следующие модели поведения, доступные только для разработчиков:
Ваши компоненты будут перерендериваться дополнительно для поиска ошибок, вызванных нечистым рендерингом.
Ваши компоненты будут перезапускать эффекты дополнительно, чтобы найти ошибки, вызванные отсутствием очистки эффектов.
Ваши компоненты будут проверяться на использование устаревших API.

📎 Читать подробнее

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍153🤩1
🖥 Все хуки в React

Норм видео о том, какие хуки вообще существуют в природе, и как их можно использовать.

Речь идёт про такие хуки и не только:
useState()setState()useEffect()useContext()useReducer()useCallback()useMemo()useRef()

📎 Видео

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍203❤‍🔥1
🖥 Немного о производительность React.js

Преждевременная оптимизация — корень всех зол. ©

Перед тем, как рассуждать о производительности, настоятельно рекомендуется прочитать Optimization.guide.
Для начала стоит вспомнить, что виртуальный DOM — это уже оптимизация, которая позволяет React из коробки работать достаточно быстро, чтобы вы могли вообще не задумываться о производительности долгое время.

В общих чертах, React работает так:
— Монтирование вызывает рендеринг приложения.
— Получившийся DOM вставляется в реальный DOM целиком, так как там еще ничего нет. Виртуальный DOM сохраняется внутри React для последующего обновления.
— Изменение состояния приводит к вычислению нового виртуального DOM.
— Вычисляется разница между старым виртуальным DOM и новым.
— Разница применяется к реальному DOM.


Согласование

Когда происходит изменение в состоянии компонента, запускается механизм «согласование» (reconciliation), который вычисляет разницу между прошлым состоянием и новым. С алгоритмической точки зрения происходит поиск отличий в двух деревьях. В общем случае алгоритм, выполняющий это вычисление, работает со сложностью O(n³).

Для решения этой проблемы React настоятельно просит для всех элементов списков использовать атрибут key, который не меняется для конкретного элемента списка. Подобное требование позволяет оптимизировать работу алгоритма, уменьшив сложность до О(n).


Пропсы по умолчанию

Первая засада ожидает при неправильной работе со свойствами по умолчанию, пример кода на изображении.

Вроде безобидный код, но вызов [] каждый раз генерирует новый объект (при условии что options равен false). Проверяется это легко: [] === [] будет ложным. То есть данные не поменялись, но <Cell> будет отрисован заново.

Вывод: используйте встроенный механизм для свойств по умолчанию.

📎 Читать подробнее

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍172🔥21👎1
🖥 React 19 и Forget вводят новый стандарт производительности

Недавно команда React объявила, что их новая разработка — компилятор React (внутреннее название «Forget») — больше не является экспериментальным проектом. Это компилятор, который конвертирует код приложений на React в оптимизированный JavaScript код. За счёт этого достигается автоматическое ускорение работы приложений.

Также разработчики анонсировали React 19 — следующую большую версию популярной библиотеки для создания пользовательских интерфейсов.

В React 19 появятся такие новые возможности как Actions (ранее — Server Actions), Asset Click Me Load More и поддержка Web Components.
Asset Click Me Load More позволит интегрировать загрузку различных ресурсов (стилей, шрифтов, скриптов) с механизмом Suspense. Это даст возможность гибко управлять отображением интерфейса.

А функция Document Metadata позволит манипулировать рендером метаданных страницы (например, мета-тегов, описанных для SEO). Их можно будет отрендерить в любом месте дерева компонентов, как на клиенте, так и на сервере. Раньше метаданные можно было задать только в корневом компоненте.

Больше информации о React 19 и компиляторе будет анонсировано на конференции React Conf 2024, которая пройдёт 15-16 мая в Хендерсоне, Невада, США. Организаторы ожидают большой наплыв посетителей и уже ввели лотерею на получение билетов.

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29❤‍🔥522😱2
🖥 Работа с коллекциями в JSX

В работе с коллекциями элементов в JSX по большей части нет ничего особенного.
С другой стороны, задача обработки списков элементов настолько частая, что будет не лишним её обсудить отдельно.

На скрине приведён типичный код, в котором коллекция генерируется прямо в том месте, куда и подставляется. Здесь можно снова увидеть, что внутрь JSX через {} вложено выражение, внутри которого опять появляется JSX-код. Как правило, рекурсия на этом заканчивается. Если нужна более сложная обработка, то имеет смысл вынести генерацию коллекции в метод компонента и вызывать его внутри render. Например, ниже выделена функция renderList(), которая формирует список для отрисовки:
class List extends React.Component {
renderList = (data) => {
return data.map(item => <li>{item.name}</li>);
}

render() {
const { data } = this.props;

return (
<ul>
{this.renderList(data)}
</ul>
);
}
}


Проп key
Для повышения эффективности, React настоятельно рекомендует идентифицировать каждую генерируемую строку коллекции. Связано это с механизмом, который производит изменения в DOM.
Генерируя коллекцию элементов в JSX, нужно обязательно проставлять уникальный проп key, который не меняется при повторной генерации коллекции.

Чаще всего с этой задачей не возникает проблем, так как у любой сущности, с которой мы работаем, есть свой идентификатор (например, primary key из базы данных).
class List extends React.Component {
render() {
const { data } = this.props;

return (
<ul>
{data.map((item) => <li key={item.id}>{item.name}</li>)}
</ul>
);
}
}

const items = [
{ name: 'first', id: 1 },
{ name: 'second', id: 2 }
];

const mountNode = document.getElementById('react-root');
const root = ReactDOM.createRoot(mountNode);
root.render(<List data={items} />);


📎 Читать подробнее

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤‍🔥33🔥3👎2
🖥 Современный подход к разработке с использованием Next.js

Использование традиционных подходов и инструментов разработки приводит к трудностям в достижении эффективной изоляции компонентов. По мере усложнения приложения, управление и повторное использование компонентов в различных проектах становится все более сложной задачей.

Здесь на помощь приходит Bit, предлагая современное и эффективное решение. Bit — это система сборки, предназначенная для создания составного (композитного) программного обеспечения. Используя Bit, вы можете создавать компоненты как независимые фрагменты кода, которые можно совместно использовать и которыми можно обмениваться через удаленный хостинг компонентов.

Именно про Bit в связке с Next.js и говорится в этой статье
Ну и про React само собой, рекомендую к прочтению)

📎 Статья

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🔥21
🖥 Хук дня — 'use client'

'use client' позволяет отметить, какой код выполняется на клиенте.
Добавьте 'use client' в верхней части файла, чтобы отметить модуль и его транзитивные зависимости как клиентский код.

Когда файл, помеченный директивой 'use client', импортируется из серверного компонента, совместимые бандлеры будут рассматривать импорт модуля как границу между кодом, выполняемым на сервере, и кодом, выполняемым на клиенте.

Будучи зависимостями RichTextEditor, formatDate и Button также будут оцениваться на клиенте, независимо от того, содержат ли их модули директиву 'use client'. Обратите внимание, что один модуль может оцениваться на сервере при импорте из серверного кода и на клиенте при импорте из клиентского кода.


Некоторые нюансы

'use client' должно находиться в самом начале файла, выше любого импорта или другого кода (комментарии допускаются). Они должны быть написаны с одинарными или двойными кавычками, но не с обратными знаками.

Если модуль 'use client' импортируется из другого клиентского модуля, директива не имеет силы.

Если модуль компонента содержит директиву 'use client', то любое использование этого компонента гарантированно является клиентским компонентом. Однако компонент может быть оценен на клиенте, даже если он не содержит директивы 'use client'.
Дополнение: компонент считается клиентским, если он определен в модуле с директивой 'use client' или является транзитивной зависимостью модуля, содержащего директиву 'use client'. В противном случае он является серверным компонентом.

Код, помеченный для использования клиентом, не ограничивается компонентами. Весь код, входящий в поддерево модулей Client, отправляется клиенту и выполняется им.

Когда модуль, работающий с сервером, импортирует значения из модуля 'use client', эти значения должны быть либо компонентами React, либо поддерживаемыми сериализуемыми значениями prop для передачи в клиентский компонент. При любом другом варианте использования будет возникать исключение.

📎 Читать подробнее

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍944❤‍🔥2🥰1
2025/07/14 00:44:56
Back to Top
HTML Embed Code: