React JS
17.6K subscribers
551 photos
59 videos
5 files
627 links
React программирование

@haarrp - admin

@itchannels_telegram - 🔥лучшие ит-каналы

@javascriptv - продвинутый javascript

@programming_books_it - бесплатные it книги

@ai_machinelearning_big_data - ml

№ 5037566384
Download Telegram
⚡️ Locofy.aiполезная утилита для конвертирования дизайна сайта в его код.

Вы можете переносить креативы из Figma/Adobe XD сразу в React, React Native, HTML-CSS, Next.js или Gatsby. Есть функция синхронизации кода с GitHub и Visual Studio.

@react_tg
👍152🔥2🤣2
This media is not supported in your browser
VIEW IN TELEGRAM
🚀Попробуйте TextSelection - #React TS хук, который отслеживает выделение текста пользователем и его положение на экране!

Идеально подходит для создания интуитивно понятных функций пользовательского интерфейса, таких как всплывающая подсказка "Поделиться", подобно Medium.

Демо: https://grayscal.es/hooks/use-text-selection

Код: https://gist.github.com/KristofferEriksson/8acb9b3eb241507eb0f6232938bf4ec7

@react_tg
👍184🔥3
💫 Огромный выбор инструментов для веб-разработки.

Автор классифицировал их на 30 категорий и представил несколько десятков сервисов в каждой категории.
Таким образом, можно найти решение практически для любой задачи.

Этот список включает в себя шрифты, иконки, палитры, стоковое аудио, шаблоны кода, инструменты для дизайна, JS-фреймворки и многое другое. Все это делает эту подборку незаменимой шпаргалкой для любого веб-разработчика.

👀 Смотреть

@react_tg
👍132🔥2🤨1
This media is not supported in your browser
VIEW IN TELEGRAM
💡Frontend совет

Для определения min-width и width в CSS достаточно одной функции max

➡️ Демо: здесь

#css #tip

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2019🔥6
CopilotKit

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

CopilotKit принимает на вход описание вашего приложения и передаст его в свою инфраструктуру React для создания:
- ИИ-чатботов в приложении
- Текстовые области с поддержкой ИИ
- RAG, вызов функций и интеграция

Библиотека имеет встроенную поддержку LangChain, LangGraph и LangServe. Вы можете использовать их для расширения возможностей движка.

Также в библиотеку встроены нативные UI/UX-компоненты, которые вы можете использовать в своих приложениях:
- CopilotChat
- CopilotSidebar
- CopilotPopup
- CopilotTextarea

Библиотека имеет открытый исходный код. Вы можете использовать ее самостоятельно. Вы можете использовать ее с любым LLM, включая GPT-4.

Этот проект занял второе место на HackerNews и ProductHunt. Он был трендом на GitHub.

Эта библиотека работает с любом приложении React, но команда работает над ее расширением.

🐱 GitHub

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍122🔥2
Реализация React Query в веб-приложении

В этом уроке рассмотрим, как интегрировать React Query в базовое веб-приложение.

React Query — мощная библиотека для управления, кэширования и синхронизации состояния сервера в приложениях React. Мы создадим простое приложение, получающее данные из API с открытым исходным кодом, и используем Bootstrap для применения стилей.

Цели проекта

Создать веб-приложение для получения данных из нижеуказанного API с помощью React Query.

📌Читать

@react_tg
12👍4🥰2
💡Как использовать forwardRef с generic компонентами

Одно из ограничений forwardRef в том, что он отключает выведение типа для generic компонентов. Например:

const Table = <T,>(
props: {
data: T[];
renderRow: (row: T) => React.ReactNode;
},
ref: React.ForwardedRef<HTMLTableElement>
) => {
/** --snip-- */
};

const ForwardReffedTable = React.forwardRef(Table);

<Table
data={["a", "b"]}
renderRow={(row) => { // Тип выводится: row: string
return <tr>{row}</tr>;
}}
/>;

<ForwardReffedTable
data={["a", "b"]}
renderRow={(row) => { // Тип не выводится: row: unknown
return <tr>{row}</tr>;
}}
/>;


Чтобы исправить выведение типа для generic компонентов, можно создать утилитарную функцию для вызова forwardRef с правильными типами:

function fixedForwardRef<T, P = {}>(
render: (props: P, ref: React.Ref<T>) => React.ReactNode
): (props: P & React.RefAttributes<T>) => React.ReactNode {
return React.forwardRef(render) as any;
}

// Вызов forwardRef с правильным выведением типа:
const ForwardReffedTable = fixedForwardRef(Table);

🔗 Подробнее

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍154🔥2
💻 Проверь свои скиллы — задача по написанию hook для загрузки данных

На первой итерации решение может выглядеть как-то так:
function useFetch(url) {
const [data, setData] = useState(null);

useEffect(() => {
fetch(url)
.then((res) => res.json())
.then((respData) => setData(respData));
}, []);

return data;
}

В этом коде не хватает зависимости. Если url изменится, то запроса данных не произойдет.

Дальше код может стать таким:
function useFetch(url) {
const [data, setData] = useState(null);

useEffect(() => {
setData(null); // не забыть сбросить данные перед загрузкой
fetch(url)
.then((res) => res.json())
.then((respData) => setData(respData));
}, [url]); // <-- не забыть зависимость

return data;
}

На этом этапе можно остановиться, и подумать, как улучшить этот hook.

Пропустим ещё несколько итераций, и финальный код, который можно считать неплохим решением, выглядит так:
function useFetch(url) {
const [data, setData] = useState(null);
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(null);

useEffect(() => {
// флаг отмены
let cancelled = false;

setIsLoading(true);
setData(null);
setError(null);
fetch(url)
.then((res) => res.json())
.then((respData) => {
if (!cancelled) setData(respData);
})
.catch((e) => {
if (!cancelled) setError(e);
})
.finally(() => {
if (!cancelled) setIsLoading(false);
});

return () => {
// выставим признак того, что запрос отменен
cancelled = true;
};
}, [url]);

return [data, isLoading, error];
}


Эта задачка позволяет проверить понимание устройства рендеринга React, как устроено хранение состояния, когда происходят перерисовки, как заставить компонент перерисоваться в ответ на асинхронное событие, как устроена "очистка (cleanup) эффекта", как работают сайд-эффекты.

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29🔥43
This media is not supported in your browser
VIEW IN TELEGRAM
⚡️ ReactRover позволяет развертывать React-приложения одним щелчком мыши

Особенности:
🔵Поддержка Vite и CRA
🔵Функциональность пользовательского имени сайта
🔵Поддержка переменных окружения
🔵Ведение журналов в реальном времени
🔵Аутентификация пользователей

🖥 GitHub

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥41
💡Обрабатывай асинхронные ошибки как профи

Асинхронные операции, такие как получение данных из внешних API или обработка взаимодействия с пользователем требуют аккуратной обработки ошибок.

🔵Try-Catch с Async/Await
— надежное решение для обработки ошибок в асинхронном коде. Инкапсулируя асинхронные операции внутри try блока, разработчики получают возможность корректно перехватывать и обрабатывать ошибки, которые могут возникнуть во время выполнения.
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching data:', error);
throw error; // Re-throw the error to propagate it further
}
}

здесь try-catch блок обрабатывает наш асинхронный код, что позволяет нам фиксировать и регистрировать ошибки, возникающие во время выборки данных. Повторно выдавая ошибку, мы гарантируем ее распространение дальше по стеку вызовов, что облегчает комплексную обработку ошибок во всем приложении.

🔵Promise.catch()
Promise.catch() метод служит надежным защитником от асинхронных ошибок, предлагая краткое решение для обработки отклонений. Добавляя предложение .catch() в нашу цепочку обещаний, разработчики могут перехватывать и обрабатывать ошибки, возникающие во время выполнения асинхронных операций.
fetch('https://api.example.com/data')
.then((response) => response.json())
.then((data) => {
// Process the data
})
.catch((error) => {
console.error('Error fetching data:', error);
// Display a user-friendly error message
alert('An error occurred while fetching data.');
});

здесь .catch() перехватывает любые ошибки, возникающие во время обработки данных, позволяя разработчикам регистрировать ошибки в целях отладки и предоставлять пользователям понятное сообщение.

В общем, обработка ошибок, особенно асинхронных, в приложениях React требует многогранного подхода.
🔤А какой вариант обработки ошибок близок именно вам? Было бы интересно услышать

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍143🥱3🔥1
🖥 Обработка имён классов в React 🖥

Интерактивные элементы UI имеют более одного состояния отображения. Например, модальное окно может быть открыто или закрыто, а переключатель — включён или выключен. Обычно эти состояния меняют с помощью классов.

Работая напрямую с DOM, мы можем использовать classList, который содержит удобные методы для добавления и удаления классов. В React из коробки нет никаких удобств. Свойство className — это всего лишь строка, а строки неудобны для обработки:

class Button extends React.Component {
render () {
const { isPressed, isHovered, label } = this.props;
let btnClass = 'btn';
if (isPressed) {
// Приходится конкатенировать классы
btnClass += ' btn-pressed';
} else if (isHovered) {
btnClass += ' btn-over';
}
return <button className={btnClass}>{label}</button>;
}
};


Для решения этой задачи создатели React рекомендуют использовать пакет 'classnames'. Принцип его работы прост. Вместо манипулирования строчкой напрямую, мы формируем правильный объект, который уже будет преобразован в строку:
import cn from 'classnames';

class Button extends React.Component {
render () {
const { isPressed, isHovered, label } = this.props;
// Значение — это `true` или `false`
// При значении `true` класс включен, при `false` — выключен
// `'btn'` — это класс, который будет подставлен в любом случае
const btnClass = cn('btn', {
'btn-pressed': isPressed,
'btn-over': !isPressed && isHovered,
});
return <button className={btnClass}>{label}</button>;
}
};


Подставим конкретные значения:
const btnClass = cn('btn', {
'btn-pressed': false,
'btn-over': true,
});

console.log(btnClass); // 'btn btn-over'


Функция cn() принимает на вход любое количество аргументов. Если аргумент имеет строковой тип, то он считается обязательным классом. Если это объект, тогда работает логика, описанная выше:
const btnClass = cn('btn', 'another-class', {
'btn-pressed': isPressed,
'btn-over': !isPressed && isHovered,
});


@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍84🤔3🔥1
⁉️ Только начинаешь свой путь в IT, и для трудоустройства не хватает реального опыта работы?

Знакомая история? Тогда давай к нам! 🚀

PREAX — онлайн-стажировка для frontend-разработчиков.

Помогаем накопить реальный 💪 опыт, формируем кадровый резерв для работодателей и привлекаем лучших к коммерческим заказам.

ЧТО ВНУТРИ?

🔖 Пять больших проектов. Пополнишь портфолио крутыми кейсами.

🔖 Спринты и дедлайны. Научишься рассчитывать время и укладываться в сроки.

🔖 Работа с легаси. Исправишь ошибки, оптимизируешь код и сделаешь рефакторинг.

🔖 Пачка код-ревью. Поделишься опытом и увидишь, как сделать свой код еще лучше.

🔖 Поддержка сообщества. Сможешь задать вопрос и получить совет, если нужна помощь.

🔖 Новый стек технологий. Закрепишь на практике и расширишь стек технологий.

🔖 Гибкий график. Сможешь выстраивать нагрузку, легко совмещая её с работой или учебой.

В итоге получишь реальный опыт работы в команде!

Попробуй! 1-й спринт — 🆓 БЕСПЛАТНО!

Реклама, ООО «Преакс Плэтформ», ОГРН 1237700372755
2
🖥 Решение проблемы с получением значения поля в ReactJS

Если в двух словах, то для надежного получения значения из поля ввода в React используйте управляемые компоненты. Привяжите значение поля к состоянию с помощью атрибута value и обновляйте его при помощи обработчика события onChange. Принцип работы приведен ниже:
class InputComponent extends React.Component {
state = { value: '' };

handleValueChange = (event) => this.setState({ value: event.target.value });

render() {
// Заметьте взаимодействие состояния и поля ввода — вот так все и работает!
return <input value={this.state.value} onChange={this.handleValueChange} />;
}
}

В этом коде создается текстовое поле ввода, значение которого привязано к состоянию компонента.

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👎12👍83🖕2🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 NLUX — библиотека ReactJS для создания разговорных пользовательских интерфейсов

В современном мире взаимодействие с компьютерами и приложениями становится все более естественным и удобным благодаря использованию разговорных интерфейсов и искусственного интеллекта. Однако, интеграция такого функционала в веб-приложения может стать вызовом для разработчиков.
В этом может помочь библиотека NLUX (Natural Language User Experience), предоставляющая инструменты для создания разговорных пользовательских интерфейсов в приложениях на ReactJS.

NLUX революционизирует интеграцию разговорного искусственного интеллекта в приложения на ReactJS. Представляя собой двойное предложение, то есть не только компоненты/хуки React, но и автономную библиотеку для JavaScript, библиотека NLUX разработана для внедрения функциональности чат-ботов, управляемых искусственным интеллектом, в веб-приложения.

NLUX выделяется своей легкостью интеграции и способностью обеспечивать пользователям интеллектуальные взаимодействия на естественном языке, что делает ее мощным инструментом для улучшения вовлеченности и удовлетворенности пользователей. Библиотека также позволяет нам настраивать личность бота, используя естественные языковые подсказки.

📁 Подробнее про NLUX на Хабре

🖥 GitHub

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥41
🔥Подборка лучших обучающих каналов для программистов.

➡️ Делитесь с коллегами и cохраняйте себе, чтобы не потерять

🖥 Frontend
Javascript академия - крупнейший js канал
React - лучшие гайды и советы по работе с react
Frontend - тутрориалы, уроки, гайды, код
PHP
Книги frontend
Задачи frontend

Машинное обучение

Machine Learning - полезные статьи новости гайды и разбор кода
Ml Собеседование - подготовка к собеседовению мл, алгоритмам, кодингу
Ml ru - актуальные статьи, новости, код и обучающие материалы
Ml Jobs - вакансии ML
ML Книги - актуальные бесплатные книги МО
ML чат

🚀 Data Science

Анализ данных - полезные фишки, код, гайды и советы, маст-хэв датасаентиста
Data Jobs - ds вакансии
Аналитик данных
Data Science книги - актуальные бесплатные книги
Big data

🏆 Golang
Golang - подробные гайды, разбор кода, лучшие практики, заметки
Golang собеседование
Golang вакансии
Golang книги
Golang задачи и тесты
Golang чат
Golang news - новости go

#️⃣C#

С# академия
С# заметки — код, лучшие практики, заметки программиста c#
С# задачи и тесты
С# библиотека - актуальные бесплатные книги
C# вакансии - работа

🐍 Python

Python/django
Python Собеседование - подготовка к собеседовению python и разбор алгоритмов
Pro python - статьи, новости, код и обучающие материалы
Python Jobs - вакансии Python
Python чат
Python книги

Java

Java академия
Java вакансии
Java чат
Java вопросы с собеседований
Java книги

🛢Базы данных
Sql базы данных
Библиотека баз данных
SQL чат

💻 C++

C++ академия
С++ книги
C++ задачи - подготовка к собеседовению мл, алгоритмам
C++ вакансии

💥 Хакинг Kali Linux

Kali linux
linux_kal - kali чат
Информационная безопасность

🐧 Linux

Linux academy

🦀 Rust
Rust программирование
Rust чат
Rust книги для программистов

📲 Мобильная разработка
Android разработка
Мобильный разработчик гайды и уроки

🇬🇧 Английский для программистов

🧠 Искусственный интеллект
ИИ и технологии
Neural - нейросети для работы и жизни
Книги ИИ
Artificial Intelligence

🔥 DevOPs
Devops для программистов
Книги Devops

🌟 Docker/Kubernets
Docker
Kubernets

📓 Книги
Библиотеки Книг для программситов

💼 Папка с вакансиями:
Папка Go разработчика:
Папка Python разработчика:
Папка Data Science
Папка Java разработчика
Папка C#
Папка Frontend
5👍1🔥1
🖥 Годный ролик с созданием 6 проектов на ReactJS

📎 Вот пересказ содержимого от YaGPT

В ролике автор касается таких тем, как:
Передача индекса и корректного варианта ответа в компонент result.
Преобразование ответа в формат JSON и извлечение данных.
Отображение вопросов и вариантов ответов при помощи списка и функции для обработки кликов на вариантах.
Рендеринг пользователей, добавление их в список приглашений и удаление из него.

В целом ролик очень полезный и неплохо помогает попрактиковаться и прокачать свой React

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍113🔥3
🖥 5 вещей, которые сделают ваш React проект лучше

*️⃣Используйте JSX-сокращения
Допустим, вам нужно управлять видимостью компонента Navbar с помощью пропса showTitle:
Плохо
return (
<Navbar showTitle={true} />
);

Хорошо
return(
<Navbar showTitle />
);


*️⃣Используйте тернарные операторы
Отличный способ для выбора между двумя компонентами по некоторому условию
Плохо
const { role } = user;

if(role === ADMIN) {
return <AdminUser />
}else{
return <NormalUser />
}

Хорошо
const { role } = user;

return role === ADMIN ? <AdminUser /> : <NormalUser />


*️⃣Используйте преимущества объектных литералов
Если у вас выбор между тремя и более компонентами, литералы объектов могут сделать код более читаемым – используйте их вместо сложных условий.
Плохо
const {role} = user

switch(role){
case ADMIN:
return <AdminUser />
case EMPLOYEE:
return <EmployeeUser />
case USER:
return <NormalUser />
}

Хорошо
const {role} = user

const components = {
ADMIN: AdminUser,
EMPLOYEE: EmployeeUser,
USER: NormalUser
};

const Component = components[role];

return <Component />;


*️⃣Используйте фрагменты
Нет никакого преимущества в использовании div вместо Fragment. Зачем нам лишний элемент в DOM?
Плохо
return (
<div>
<Component1 />
<Component2 />
<Component3 />
</div>
)

Хорошо
return (
<>
<Component1 />
<Component2 />
<Component3 />
</>
)


*️⃣Не определяйте функцию внутри рендера
Лучше не смешивать логику и рендер внутри компонента.
Плохо
return (
<button onClick={() => dispatch(ACTION_TO_SEND_DATA)}> // NOTICE HERE
This is a bad example
</button>
)

Хорошо
const submitData = () => dispatch(ACTION_TO_SEND_DATA)

return (
<button onClick={submitData}>
This is a good example
</button>
)


📎 Ещё больше полезных советов

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4812🔥3🥱2
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 Boa — экспериментальный лексер, парсер и компилятор Javascript

Тут на днях года состоялся релиз Boa v0.18 — экспериментального лексера, парсера и компилятора Javascript, а также движка ECMAScript, написанного на языке программирования Rust.

🔥 Новая версия Boa позволяет легко встраивать JS-движок в различные проекты, и а также использовать его из WebAssembly и командной строки.

Разработчики пояснили, что этот выпуск Boa также знаменует собой серьёзное обновление дизайна сайта проекта и появление нового логотипа.

«Поскольку Boa используется все большим количеством проектов, важно, чтобы мы могли предоставить стабильный и надёжный API. Нам кажется, что мы ещё не достигли этого результата, но после обсуждения с командой мы решили нацелиться на выпуск версии 1.0 в ближайшем будущем. Это станет для нас важной вехой, и мы надеемся, что к тому времени у нас будет много новых функций и улучшений», — пояснили разработчики проекта.

Впервые проект Boa был представлен на конференции JSConf EU 2019 разработчиком Джейсоном Уильямсом.

🖥Исходный код проекта выложен на GitHub под лицензией MIT
4.6К⭐️

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍41
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 Создание PDF с помощью React

🌟 Относительно недавно разработчики Onedoc выпустили UI Kit под названием React Print. Он предназначен для создания PDF-файлов с помощью React и TypeScript.
С его помощью можно подготавливать шаблоны счетов, брошюр и любых других документов.

Пользуйтесь)

🖥 GitHub

@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍269🥰1