uz
Feedback
React

React

Kanalga Telegram’da o‘tish

Подборки по React js и все что с ним связано. По всем вопросам @evgenycarter

Ko'proq ko'rsatish
2 731
Obunachilar
+124 soatlar
-77 kunlar
-1030 kunlar
Obunachilarni jalb qilish
Iyun '26
Iyun '26
+1
0 kanalda
May '26
+28
0 kanalda
Get PRO
Aprel '26
+17
0 kanalda
Get PRO
Mart '26
+12
0 kanalda
Get PRO
Fevral '26
+21
0 kanalda
Get PRO
Yanvar '26
+21
0 kanalda
Get PRO
Dekabr '25
+28
0 kanalda
Get PRO
Noyabr '25
+45
32 kanalda
Get PRO
Oktabr '25
+31
0 kanalda
Get PRO
Sentabr '25
+56
37 kanalda
Get PRO
Avgust '25
+37
1 kanalda
Get PRO
Iyul '25
+51
27 kanalda
Get PRO
Iyun '25
+66
20 kanalda
Get PRO
May '25
+55
44 kanalda
Get PRO
Aprel '25
+56
37 kanalda
Get PRO
Mart '25
+86
38 kanalda
Get PRO
Fevral '25
+72
32 kanalda
Get PRO
Yanvar '25
+69
33 kanalda
Get PRO
Dekabr '24
+71
34 kanalda
Get PRO
Noyabr '24
+79
33 kanalda
Get PRO
Oktabr '24
+80
30 kanalda
Get PRO
Sentabr '24
+141
29 kanalda
Get PRO
Avgust '24
+67
18 kanalda
Get PRO
Iyul '24
+51
0 kanalda
Get PRO
Iyun '24
+82
25 kanalda
Get PRO
May '24
+89
19 kanalda
Get PRO
Aprel '24
+76
0 kanalda
Get PRO
Mart '24
+88
21 kanalda
Get PRO
Fevral '24
+73
19 kanalda
Get PRO
Yanvar '24
+147
24 kanalda
Get PRO
Dekabr '23
+91
24 kanalda
Get PRO
Noyabr '23
+94
17 kanalda
Get PRO
Oktabr '23
+90
18 kanalda
Get PRO
Sentabr '23
+123
0 kanalda
Get PRO
Avgust '23
+88
0 kanalda
Get PRO
Iyul '23
+112
0 kanalda
Get PRO
Iyun '23
+67
0 kanalda
Get PRO
May '23
+92
0 kanalda
Get PRO
Aprel '23
+81
0 kanalda
Get PRO
Mart '23
+42
0 kanalda
Get PRO
Fevral '23
+53
0 kanalda
Get PRO
Yanvar '23
+93
0 kanalda
Get PRO
Dekabr '22
+99
0 kanalda
Get PRO
Noyabr '22
+68
0 kanalda
Get PRO
Oktabr '22
+160
0 kanalda
Get PRO
Sentabr '22
+232
0 kanalda
Get PRO
Avgust '22
+314
0 kanalda
Get PRO
Iyul '22
+408
0 kanalda
Get PRO
Iyun '22
+2 238
0 kanalda
Sana
Obunachilarni jalb qilish
Esdaliklar
Kanallar
03 Iyun+1
02 Iyun0
01 Iyun0
Kanal postlari
🚀 Как ускорить загрузку React-приложения? 5 реальных советов Сегодня покажу, как я оптимизирую загрузку фронтенда в продакше
🚀 Как ускорить загрузку React-приложения? 5 реальных советов Сегодня покажу, как я оптимизирую загрузку фронтенда в продакшене. Это помогает не только SEO, но и удерживает пользователя, который мог бы уйти, не дождавшись загрузки. Вот 5 проверенных приёмов: 1. Code Splitting (разделение кода) Используйте React.lazy и Suspense, чтобы грузить компоненты только при необходимости. Особенно полезно для роутинга. 2. Tree shaking Убедитесь, что сборщик (Webpack, Vite) удаляет неиспользуемый код. Проверь, чтобы библиотеки импортировались модульно (import { Button } from 'lib', а не всё подряд). 3. Оптимизация картинок Используйте современные форматы (WebP, AVIF) и lazy загрузку изображений, чтобы не тянуть весь хлам сразу. 4. Минификация и сжатие Включите GZIP или Brotli на сервере. Также обязательно минифицируйте JS/CSS. 5. Critical CSS и SSR/SSG Подумайте об использовании Next.js или аналогов. Они помогают загрузить только нужный CSS и HTML прямо на старте, особенно полезно для первых 3 секунд. ❓А какие техники используете вы, чтобы ускорить загрузку? 📲 Мы в MAX ✍️ @React_lib

2
🔧 Шпаргалка по базовым компонентам React // Импорт React и роутера import React, { useState, useEffect, createContext, useContext } from 'react'; import { BrowserRouter as Router, Route, Switch, Link } from 'react-router-dom'; // 1. Создание контекста const MyContext = createContext(); // 2. Компонент с Context и useEffect function Welcome() { const contextValue = useContext(MyContext); useEffect(() => { console.log("Welcome component mounted or updated"); return () => console.log("Welcome component unmounted"); }, []); return <h1>{contextValue}</h1>; } // 3. Управляемая форма function FormComponent() { const [inputValue, setInputValue] = useState(''); const handleChange = (e) => setInputValue(e.target.value); return ( <div> <h2>Controlled Form</h2> <input type="text" value={inputValue} onChange={handleChange} /> <p>Input Value: {inputValue}</p> </div> ); } // 4. Счётчик с состоянием и обработчиком function Counter() { const [count, setCount] = useState(0); return ( <div> <h2>Counter</h2> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); } // 5. Рендер списка function FruitList() { const fruits = ['Apple', 'Banana', 'Orange']; return ( <div> <h2>Fruit List</h2> <ul> {fruits.map((fruit, index) => ( <li key={index}>{fruit}</li> ))} </ul> </div> ); } // 6. Условный рендеринг function ConditionalRender({ isLoggedIn }) { return ( <div> <h2>Conditional Rendering</h2> {isLoggedIn ? <p>Welcome back!</p> : <p>Please log in.</p>} </div> ); } // 7. Навигация function Navigation() { return ( <nav> <Link to="/">Home</Link> | <Link to="/form">Form</Link> | <Link to="/counter">Counter</Link> | <Link to="/fruits">Fruits</Link> </nav> ); } // 8. Основной App с Router и Context function App() { return ( <MyContext.Provider value="Hello, Context!"> <Router> <div style={{ padding: '20px', fontFamily: 'Arial' }}> <Navigation /> <Switch> <Route path="/" exact> <Welcome /> <ConditionalRender isLoggedIn={true} /> </Route> <Route path="/form" component={FormComponent} /> <Route path="/counter" component={Counter} /> <Route path="/fruits" component={FruitList} /> </Switch> </div> </Router> </MyContext.Provider> ); } export default App; 📲 Мы в MAX ✍️ @React_lib
223
3
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП
139
4
Сегодня хочу поделиться с вами простым, но часто необходимым при работе приёмом: созданием и использованием кастомного хука useFetch для загрузки данных. Часто в React-компонентах мы дублируем один и тот же код: ставим загрузку, устанавливаем состояние для data, error и loading, пишем useEffect, чтобы делать вызов API, очищаем эффекты… Всё это можно обобщить в одном месте и переиспользовать во множестве компонент. Вот базовая реализация хука useFetch: import { useState, useEffect, useRef } from 'react'; function useFetch(url) { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Чтобы избежать обновления стейта после размонтирования компонента const isMounted = useRef(true); useEffect(() => { // При монтировании флага меняются isMounted.current = true; // Начинаем загрузку fetch(url) .then(response => { if (!response.ok) { throw new Error(`Ошибка ${response.status}`); } return response.json(); }) .then(json => { if (isMounted.current) { setData(json); setLoading(false); } }) .catch(err => { if (isMounted.current) { setError(err.message); setLoading(false); } }); // Очистка: помечаем, что компонент размонтирован return () => { isMounted.current = false; }; }, [url]); return { data, loading, error }; } Разбор ключевых моментов: 1️⃣ useRef для флага isMounted Если компонент размонтируется до того, как придёт ответ от сервера, вызов setState внутри промиса может вызвать утечку памяти и предупреждение React. Флаг isMounted.current помогает проверить, что компонент ещё жив. 2️⃣ Состояния data, loading, error Вынесли все три состояния в хук — теперь в компоненте не нужно повторять одно и то же. Достаточно будет написать: const { data, loading, error } = useFetch('https://api.example.com/posts'); 3️⃣ Параметр url в массиве зависимостей Если url меняется, хук автоматически запустит новую загрузку. 4️⃣ Обработка ошибок Мы сразу проверяем response.ok, иначе бросаем исключение, и в .catch устанавливаем error. Теперь пример использования хука в компоненте: import React from 'react'; import useFetch from './hooks/useFetch'; function PostsList() { const { data: posts, loading, error } = useFetch('https://jsonplaceholder.typicode.com/posts'); if (loading) { return <div>Загрузка...</div>; } if (error) { return <div>Ошибка: {error}</div>; } return ( <div> <h2>Список постов</h2> <ul> {posts.map(post => ( <li key={post.id}> <strong>{post.title}</strong> <p>{post.body}</p> </li> ))} </ul> </div> ); } export default PostsList; Плюсы такого подхода: * Меньше дублирования кода. Вместо того чтобы копипастить один и тот же useEffect в десятке компонентов, просто импортируем useFetch. * Централизованная логика. Если понадобится добавить, скажем, кеширование или отмену запроса через AbortController, меняем только внутри useFetch. * Чистый код в компонентах. Компонент сосредоточен на отображении, а все детали работы с сетью спрятаны в хук. Советы по улучшению: * Можно расширить хук, чтобы принимать не только url, но и опции fetch (метод, заголовки и т.п.). * Добавить параметр deps (зависимости), чтобы перезапускать запрос не только при изменении URL, а при любой другой переменной. * Использовать AbortController, чтобы отменять запросы при новых вызовах или при размонтировании: ✍️ @React_lib
380
5
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП
327
6
Как создать свой кастомный хук usePrevious для хранения предыдущего значения пропсов или стейта в компонентах React. В реальн
Как создать свой кастомный хук usePrevious для хранения предыдущего значения пропсов или стейта в компонентах React. В реальных приложениях иногда нужно сравнивать текущее и предыдущее состояние — например, чтобы анимировать изменения или вызывать сайд-эффекты только при росте/падении значения. Сегодня покажу, как легко вынести логику в переиспользуемый хук. import { useRef, useEffect } from 'react'; /** * Хук usePrevious сохраняет предыдущее значение value. * @param {T} value — текущее значение (пропс или стейт) * @returns {T | undefined} — предыдущий value (или undefined при первом рендере) */ function usePrevious(value) { const ref = useRef(); useEffect(() => { ref.current = value; }, [value]); return ref.current; } // Пример использования: import React, { useState } from 'react'; export default function PriceTracker() { const [price, setPrice] = useState(100); const prevPrice = usePrevious(price); const getTrend = () => { if (prevPrice === undefined) return '—'; return price > prevPrice ? '📈' : price < prevPrice ? '📉' : '➖'; }; return ( <div> <h2>Цена: {price} {getTrend()}</h2> <button onClick={() => setPrice(p => p + 5)}>↑ Увеличить</button> <button onClick={() => setPrice(p => p - 5)}>↓ Уменьшить</button> </div> ); } Почему это круто: * ✅ Логика хранения предыдущих значений вынесена в один хук — нет дублирования кода. * ✅ usePrevious работает и для пропсов, и для стейта. * ✅ Помогает сравнивать и реагировать на изменения (анимации, уведомления, условные запросы). Попробуйте интегрировать usePrevious в свои компоненты, где нужно отслеживать изменение данных во времени. Поделитесь в комментариях, в каких кейсах вы уже использовали или планируете применить такой хук! 📲 Мы в MAX ✍️ @React_lib
504
7
Сегодня поговорим о Zustand — суперлёгкой и мощной библиотеке для управления состоянием в React-приложениях. 🧵 Минимализм со
Сегодня поговорим о Zustand — суперлёгкой и мощной библиотеке для управления состоянием в React-приложениях. 🧵 Минимализм состояния с Zustand Создание стора занимает меньше минуты: import { create } from 'zustand'; const useStore = create((set) => ({ count: 0, increase: () => set((state) => ({ count: state.count + 1 })), })); 🎯 Как использовать в компоненте: const Counter = () => { const { count, increase } = useStore(); return ( <button onClick={increase}> Count: {count} </button> ); }; 🧠 Чем хорош Zustand: * Нет провайдеров. * Нет бойлерплейта. * Поддержка middlewares, persist, subscriptions. * Работает в Next.js, React Native, даже вне React. Zustand идеально подходит для маленьких и средних приложений. Простой API — максимум гибкости. 📲 Мы в MAX ✍️ @React_lib
533
8
Как frontend-разработчику вырасти в ЗП? День сурка frontend-разработчика выглядит так Зарплата замерла, задачи — бесконечный
Как frontend-разработчику вырасти в ЗП? День сурка frontend-разработчика выглядит так Зарплата замерла, задачи — бесконечный повтор, растет только кол-во бессмысленных созвонов Откликаешься на вакансии — отвечают только ноунеймы, на собесах закидывают странными алгоритмами «на скорость». И самое бесящее — пока буксуешь, кто-то вокруг спокойно забирает офферы в Яндекс и VK... Ты тоже можешь получить оффер в компанию, в которой тебя будут ценить и хорошо платить. 👋 Меня зовут Тихон, привет! Я — действующий Frontend-разработчик и ментор. Я за руку довожу до оффера на хорошую позицию в Big Tech и сопровождаю на испытательном сроке. В своем канале: 👉Объясняю, как проходить HR-фильтр и превращать отклики в реальные приглашения 👉Помогаю найти мотивацию, борюсь убеждениями, которые мешают развиваться 👉На примерах объясняю, как проходить собеседования, включая техничку 👉Разбираю резюме и делюсь лайфхаками, например как аккуратно “пинговать” рекрутеров А еще регулярно публикую полезные материалы: ▪️Задачи, на которых валяться кандидаты ▪️База по микрофронтам ▪️Подборка из 100+ каналов с вакансиями для разработчиков ▪️100 вопросов, которые точно помогут тебе на собеседовании ▪️Чек лист проверки своего резюме А еще у меня множество успешных кейсов и трогательных отзывов, найти их можно в канале. Реклама, erid: 2W5zFJw4CJd ИП Галактионов Тихон Витальевич, ИНН 771618975809
514
9
🔥 Антипаттерн в React: избыточные зависимости useEffect Встречали такое? useEffect(() => { fetchData(id); }, [id, fetchData]
🔥 Антипаттерн в React: избыточные зависимости useEffect Встречали такое? useEffect(() => { fetchData(id); }, [id, fetchData]); ❗️Проблема: fetchData — это функция, которая переопределяется при каждом рендере. В итоге эффект срабатывает чаще, чем должен, даже если id не менялся. 👎 Это вызывает лишние запросы, лаги и баги в логике. 💡 Решения: 1. Обёрнуть в useCallback: const fetchData = useCallback((id: string) => { // ... }, []); 2. Вынести вне компонента (если она не зависит от состояния): const fetchData = (id: string) => { // ... }; 3. Игнорировать в зависимостях (как временный хак, но осторожно!): // eslint-disable-next-line react-hooks/exhaustive-deps ✅ Правильное управление зависимостями в useEffect — ключ к стабильному и предсказуемому поведению компонентов. 📲 Мы в MAX ✍️ @React_lib
595
10
🎯 Оптимизация ререндеров в React через мемоизацию функций Многие знают про React.memo, но часто забывают про useCallback — и
🎯 Оптимизация ререндеров в React через мемоизацию функций Многие знают про React.memo, но часто забывают про useCallback — и получают лишние ререндеры, особенно в списках и сложных компонентах. 📌 Проблема: const handleClick = () => { console.log('Clicked'); }; <MyButton onClick={handleClick} /> Такой handleClick создаётся заново при каждом рендере. Если MyButton мемоизирован (React.memo), это сломает оптимизацию — пропсы-то изменились! ✅ Решение: const handleClick = useCallback(() => { console.log('Clicked'); }, []); 📈 Профит: Функция сохраняется между рендерами, MyButton не ререндерится без причины. 🧠 Особенно важно для: * Компонентов в списках (map) * Контейнеров с большим числом коллбеков * Производительных UI (таблицы, дашборды, графики) 💡 Используйте eslint-плагин react-hooks/exhaustive-deps — он не даст забыть зависимости. 📲 Мы в MAX ✍️ @React_lib
560
11
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы
438
12
🔥 Сегодня покажу, как настроить мгновенное обновление компонентов в React без полной перезагрузки страницы Если ты пользуешь
🔥 Сегодня покажу, как настроить мгновенное обновление компонентов в React без полной перезагрузки страницы Если ты пользуешься Vite, Parcel или Webpack с React — тебе точно стоит включить React Fast Refresh. Это технология, которая сохраняет состояние компонентов при обновлении кода. Раньше нужно было каждый раз обновлять страницу и терять всё введённое. Теперь — нет! ⚙️ Как это работает? React Fast Refresh отслеживает изменения в компонентах и аккуратно обновляет только изменившиеся части DOM. Всё состояние (useState, useReducer, useRef) остаётся. ✅ Как включить в Vite: Установи плагин: npm install --save-dev @vitejs/plugin-react И подключи в vite.config.ts: import react from '@vitejs/plugin-react'; export default defineConfig({ plugins: [react()], }); Этот плагин включает react-refresh автоматически под капотом. 🤯 Что получаешь: * мгновенное обновление UI при изменении кода * сохранение состояния формы, вкладок, фильтров и т.д. * больше удовольствия от разработки 😎 🎯 Не забудь, это работает только в dev-режиме. В проде всё остаётся стабильным и оптимизированным. 📲 Мы в MAX ✍️ @React_lib
529
13
🔥 React: избегай лишнего состояния с derived state! В React часто встречается антипаттерн — derived state — когда ты дублиру
🔥 React: избегай лишнего состояния с derived state! В React часто встречается антипаттерн — derived state — когда ты дублируешь вычисляемое значение в useState. 👎 Пример плохого подхода: const [items, setItems] = useState([]); const [filtered, setFiltered] = useState([]); useEffect(() => { setFiltered(items.filter(...)); }, [items]); 🔍 Проблема: ты сам обязан синхронизировать filtered с items. Это источник багов, особенно при сложных зависимостях. ✅ Лучше вычисляй на лету: const filtered = useMemo(() => items.filter(...), [items]); 🔧 useMemo кэширует результат, и ты не хранишь дублирующее состояние. 🧠 Правило: если значение можно вычислить из другого — не пиши useState. Подробнее: https://react.dev/learn/you-might-not-need-an-effect 📲 Мы в MAX ✍️ @React_lib
554
14
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы
525
15
🚀 Как избавиться от "тряски" компонентов при переключении страниц в React? Сегодня хочу показать вам простой способ, как сделать ваш интерфейс более плавным при навигации между страницами. Вы замечали, что при переходе между роутами компоненты "мигают" или резко перерисовываются? Особенно это бросается в глаза, когда вы используете React Router и на каждой новой странице заново монтируются одни и те же элементы (например, хедер или футер). Решение — layout routes React Router предлагает отличный способ: использовать layout routes. Это позволяет сохранять общие компоненты между страницами без их размонтирования. Вот пример: // Layout.jsx import { Outlet } from "react-router-dom"; export default function Layout() { return ( <> <Header /> <main> <Outlet /> </main> <Footer /> </> ); } // App.jsx import { Routes, Route } from "react-router-dom"; import Layout from "./Layout"; import Home from "./pages/Home"; import About from "./pages/About"; function App() { return ( <Routes> <Route path="/" element={<Layout />}> <Route index element={<Home />} /> <Route path="about" element={<About />} /> </Route> </Routes> ); } Теперь Header и Footer не будут размонтироваться, и интерфейс останется стабильным при переходах. 👀 Плюс: можно добавить плавные анимации переходов с помощью framer-motion без артефактов. Попробуйте — разница ощущается сразу. 📲 Мы в MAX ✍️ @React_lib
470
16
🔥 Как ускорить работу с формами в React Я часто использую библиотеку react-hook-form, и одна из самых частых задач — это соз
🔥 Как ускорить работу с формами в React Я часто использую библиотеку react-hook-form, и одна из самых частых задач — это создание динамических списков полей (например, список контактов пользователя). Раньше я писал кучу ручного кода для добавления/удаления элементов, пока не открыл для себя хук useFieldArray. Пример использования: import { useForm, useFieldArray } from "react-hook-form"; function ContactForm() { const { control, register, handleSubmit } = useForm({ defaultValues: { contacts: [{ value: "" }] } }); const { fields, append, remove } = useFieldArray({ control, name: "contacts" }); return ( <form onSubmit={handleSubmit(data => console.log(data))}> {fields.map((field, index) => ( <div key={field.id}> <input {...register(`contacts.${index}.value`)} /> <button type="button" onClick={() => remove(index)}>Удалить</button> </div> ))} <button type="button" onClick={() => append({ value: "" })}>Добавить контакт</button> <button type="submit">Отправить</button> </form> ); } Этот код автоматически управляет всеми id полей и обновляет форму без лишней боли! Если раньше вы управляли массивами вручную — попробуйте useFieldArray, вы удивитесь, насколько это проще. ❓ Пользуетесь ли вы react-hook-form или предпочитаете что-то другое для работы с формами? 📲 Мы в MAX ✍️ @React_lib
472
17
🧩 Фишка: оптимизация ререндеров в React через Object.freeze Если в стейте компонента хранятся вложенные объекты, React не сможет понять, что они не изменились, даже если вы не меняли их вручную. Это может привести к лишним ререндерам. 📌 Решение: используйте Object.freeze() для вложенных структур, чтобы избежать случайных мутаций и упростить сравнение. const initialFilters = Object.freeze({ category: 'all', priceRange: [0, 100], }); const [filters, setFilters] = useState(initialFilters); ⚠️ Замороженный объект нельзя мутировать — это делает поведение более предсказуемым. 💡 Также freeze улучшает производительность при использовании React.memo или useMemo, так как ссылки на вложенные структуры остаются стабильными. 👀 Подходит для конфигов, словарей, фильтров и других редко изменяемых объектов. 📲 Мы в MAX ✍️ @React_lib
476
18
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы
477
19
Сегодня я покажу вам одну фишку, которую часто недооценивают — как упростить управление глобальным состоянием с помощью Context + useReducer. 🧠 Многие сразу тянут в проект Redux или Zustand, но это не всегда нужно. Если у вас приложение небольшое или средней сложности — useReducer + Context может закрыть все ваши нужды. Вот пример мини-хранилища: // counterContext.tsx import { createContext, useReducer, useContext, ReactNode } from 'react'; const CounterContext = createContext<any>(null); const initialState = { count: 0 }; function reducer(state: typeof initialState, action: { type: string }) { switch (action.type) { case 'increment': return { count: state.count + 1 }; case 'decrement': return { count: state.count - 1 }; default: return state; } } export const CounterProvider = ({ children }: { children: ReactNode }) => { const [state, dispatch] = useReducer(reducer, initialState); return ( <CounterContext.Provider value={{ state, dispatch }}> {children} </CounterContext.Provider> ); }; export const useCounter = () => useContext(CounterContext); А вот как использовать: // App.tsx import { CounterProvider, useCounter } from './counterContext'; function Counter() { const { state, dispatch } = useCounter(); return ( <div> <p>Count: {state.count}</p> <button onClick={() => dispatch({ type: 'increment' })}>+</button> <button onClick={() => dispatch({ type: 'decrement' })}>-</button> </div> ); } export default function App() { return ( <CounterProvider> <Counter /> </CounterProvider> ); } 🎯 Такой подход помогает: - Локализовать логику - Избежать лишних зависимостей - Делать масштабирование более контролируемым Если в будущем нужно будет вынести логику в отдельные модули или добавить middlewares — это тоже можно сделать! А вы как решаете глобальное состояние в небольших проектах? Используете кастомные хуки, Zustand или всё же Redux? 📲 Мы в MAX ✍️ @React_lib
519
20
Сегодня я покажу вам фичу React, которую многие недооценивают — useCallback. Часто его либо используют слишком много, либо вообще не используют. А ведь он может здорово помочь оптимизировать ререндеры, особенно когда дело касается передачи функций в дочерние компоненты. Что делает useCallback? Он кэширует функцию, возвращая ту же ссылку, пока зависимости не изменятся. const handleClick = useCallback(() => { console.log('Clicked!'); }, []); Без него, при каждом ререндере компонента создаётся новая функция, и если вы передаёте её в props, это может триггерить лишние ререндеры у дочерних компонентов. Где реально нужен useCallback? - Когда функция передаётся в мемоизированный компонент (React.memo) - Когда функция используется в useEffect, useMemo или других хук-эффектах - Когда вы работаете с большими списками, и каждый элемент зависит от onClick или другого хендлера Где не нужен? - В простых компонентах без глубоких вложенностей - Когда вы не передаёте функцию в другие компоненты - Когда оптимизация важна меньше, чем читаемость Мини-пример const Parent = () => { const [count, setCount] = useState(0); const increment = useCallback(() => { setCount(c => c + 1); }, []); return <Child onClick={increment} />; }; const Child = React.memo(({ onClick }: { onClick: () => void }) => { console.log('Child rendered'); return <button onClick={onClick}>Click me</button>; }); Если бы мы не использовали useCallback, Child бы перерендеривался каждый раз, даже если count не менялся внутри него. Пишите в комментах, как часто вы используете useCallback — помогает или только мешает? 📲 Мы в MAX ✍️ @React_lib
469