Сегодня покажу вам, как в React удобно работать с формами на базе
Почему именно
- ⚡ Быстрее, чем Formik (нет лишних ререндеров)
- 🔍 Простая валидация через
- 🔌 Легко интегрируется с UI-библиотеками (MUI, Ant Design, Tailwind)
Минималистичный пример:
Интеграция с Yup:
🔥 Очень советую попробовать на новом проекте. Работать с формами становится не только проще, но и приятно.
✍️ @React_lib
react-hook-form
. Это мой go-to инструмент для любых форм в проектах.Почему именно
react-hook-form
?- ⚡ Быстрее, чем Formik (нет лишних ререндеров)
- 🔍 Простая валидация через
yup
или zod
- 🔌 Легко интегрируется с UI-библиотеками (MUI, Ant Design, Tailwind)
Минималистичный пример:
import { useForm } from "react-hook-form";
export default function MyForm() {
const { register, handleSubmit } = useForm();
const onSubmit = data => console.log(data);
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("email")} placeholder="Email" />
<input type="submit" />
</form>
);
}
Интеграция с Yup:
import { useForm } from "react-hook-form";
import { yupResolver } from "@hookform/resolvers/yup";
import * as yup from "yup";
const schema = yup.object({
email: yup.string().email().required(),
}).required();
export default function ValidatedForm() {
const { register, handleSubmit, formState: { errors } } = useForm({
resolver: yupResolver(schema),
});
return (
<form onSubmit={handleSubmit(data => console.log(data))}>
<input {...register("email")} />
<p>{errors.email?.message}</p>
<button type="submit">Отправить</button>
</form>
);
}
🔥 Очень советую попробовать на новом проекте. Работать с формами становится не только проще, но и приятно.
✍️ @React_lib
Сегодня я покажу вам фичу React, которую многие недооценивают —
Что делает
Он кэширует функцию, возвращая ту же ссылку, пока зависимости не изменятся.
Без него, при каждом ререндере компонента создаётся новая функция, и если вы передаёте её в
Где реально нужен
- Когда функция передаётся в мемоизированный компонент (
- Когда функция используется в
- Когда вы работаете с большими списками, и каждый элемент зависит от
Где не нужен?
- В простых компонентах без глубоких вложенностей
- Когда вы не передаёте функцию в другие компоненты
- Когда оптимизация важна меньше, чем читаемость
Мини-пример
Если бы мы не использовали
Пишите в комментах, как часто вы используете
✍️ @React_lib
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
— помогает или только мешает?✍️ @React_lib
Сегодня я покажу вам одну фишку, которую часто недооценивают — как упростить управление глобальным состоянием с помощью Context + useReducer.
🧠 Многие сразу тянут в проект Redux или Zustand, но это не всегда нужно. Если у вас приложение небольшое или средней сложности —
Вот пример мини-хранилища:
А вот как использовать:
🎯 Такой подход помогает:
- Локализовать логику
- Избежать лишних зависимостей
- Делать масштабирование более контролируемым
Если в будущем нужно будет вынести логику в отдельные модули или добавить middlewares — это тоже можно сделать!
А вы как решаете глобальное состояние в небольших проектах? Используете кастомные хуки, Zustand или всё же Redux?
✍️ @React_lib
🧠 Многие сразу тянут в проект 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?
✍️ @React_lib
🧩 Фишка: оптимизация ререндеров в React через Object.freeze
Если в стейте компонента хранятся вложенные объекты, React не сможет понять, что они не изменились, даже если вы не меняли их вручную. Это может привести к лишним ререндерам.
📌 Решение: используйте
⚠️ Замороженный объект нельзя мутировать — это делает поведение более предсказуемым.
💡 Также
👀 Подходит для конфигов, словарей, фильтров и других редко изменяемых объектов.
✍️ @React_lib
Если в стейте компонента хранятся вложенные объекты, React не сможет понять, что они не изменились, даже если вы не меняли их вручную. Это может привести к лишним ререндерам.
📌 Решение: используйте
Object.freeze()
для вложенных структур, чтобы избежать случайных мутаций и упростить сравнение.
const initialFilters = Object.freeze({
category: 'all',
priceRange: [0, 100],
});
const [filters, setFilters] = useState(initialFilters);
⚠️ Замороженный объект нельзя мутировать — это делает поведение более предсказуемым.
💡 Также
freeze
улучшает производительность при использовании React.memo
или useMemo
, так как ссылки на вложенные структуры остаются стабильными.👀 Подходит для конфигов, словарей, фильтров и других редко изменяемых объектов.
✍️ @React_lib
🔍 Чекни скрытые баги в React: неправильное использование ключей в списках
Если ты рендеришь список компонентов и используешь
📉 Что может пойти не так:
- Компоненты не будут корректно обновляться при изменении порядка;
- Сохранённое состояние внутри компонентов (например, в инпутах) будет сбиваться;
- Возрастает шанс багов при анимациях и переходах.
📌 Плохо:
✅ Хорошо:
🎯 Совет: используй
Подробный разбор от React team:
https://react.dev/learn/rendering-lists#choosing-the-key
✍️ @React_lib
Если ты рендеришь список компонентов и используешь
index
в качестве key, будь осторожен — это может привести к непредсказуемым багам UI.📉 Что может пойти не так:
- Компоненты не будут корректно обновляться при изменении порядка;
- Сохранённое состояние внутри компонентов (например, в инпутах) будет сбиваться;
- Возрастает шанс багов при анимациях и переходах.
📌 Плохо:
{items.map((item, index) => (
<Card key={index} data={item} />
))}
✅ Хорошо:
{items.map((item) => (
<Card key={item.id} data={item} />
))}
🎯 Совет: используй
id
, UUID или стабильные ключи из данных. Если данных нет — скорее всего, нужно пересмотреть архитектуру.Подробный разбор от React team:
https://react.dev/learn/rendering-lists#choosing-the-key
✍️ @React_lib
🔥 Оптимизируй React-компоненты с помощью
Если у тебя есть input, фильтрация, поиск или ререндер списков — не спеши лепить
📌 Что делает?
— идеально для плавности UI без блокировок при частых обновлениях.
🧠 Кейс:
Пользователь быстро вводит текст → React не тормозит от ререндеров больших списков → всё работает плавно и отзывчиво.
⚠️ Но не путай с
-
-
📎 Официальная дока https://react.dev/reference/react/useDeferredValue
✍️ @React_lib
useDeferredValue
Если у тебя есть input, фильтрация, поиск или ререндер списков — не спеши лепить
useMemo
и useCallback
. Сначала попробуй useDeferredValue
:
const deferredQuery = useDeferredValue(query);
const filtered = useMemo(() => filterData(data, deferredQuery), [deferredQuery]);
📌 Что делает?
useDeferredValue
говорит React: "не срочно, можно чуть позже" — идеально для плавности UI без блокировок при частых обновлениях.
🧠 Кейс:
Пользователь быстро вводит текст → React не тормозит от ререндеров больших списков → всё работает плавно и отзывчиво.
⚠️ Но не путай с
debounce
: -
debounce
— задержка до начала работы -
useDeferredValue
— отложенный рендер результата📎 Официальная дока https://react.dev/reference/react/useDeferredValue
✍️ @React_lib
🔥 Как ускорить работу с формами в React
Я часто использую библиотеку
Раньше я писал кучу ручного кода для добавления/удаления элементов, пока не открыл для себя хук
Пример использования:
Этот код автоматически управляет всеми id полей и обновляет форму без лишней боли!
Если раньше вы управляли массивами вручную — попробуйте
❓ Пользуетесь ли вы
✍️ @React_lib
Я часто использую библиотеку
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
или предпочитаете что-то другое для работы с формами?✍️ @React_lib
Сливаем вам базу с курсами и книгами от известных онлайн школ по Frontend:
(23 ГБ) — Основы веба
(46 ГБ) — HTML/CSS/Верстка
(53 ГБ) — JavaScript
(31 ГБ) — React
(17 ГБ) — TypeScript
(33 ГБ) — Vue / Angular / Svelte
(56 ГБ) — Webpack / Vite / Git
(43 ГБ) — Next.js / Nuxt.js
(68 ГБ) — Figma и Веб-дизайн
(76 ГБ) — Анимации и UI/UX
(44 ГБ) — WordPress
(37 ГБ) — Архитектура фронтенда
(21 ГБ) — Тестирование фронта
Скачивать ничего не нужно — все выложили в Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Как избавиться от "тряски" компонентов при переключении страниц в React?
Сегодня хочу показать вам простой способ, как сделать ваш интерфейс более плавным при навигации между страницами.
Вы замечали, что при переходе между роутами компоненты "мигают" или резко перерисовываются? Особенно это бросается в глаза, когда вы используете
Решение — layout routes
Вот пример:
Теперь
👀 Плюс: можно добавить плавные анимации переходов с помощью
Попробуйте — разница ощущается сразу.
✍️ @React_lib
Сегодня хочу показать вам простой способ, как сделать ваш интерфейс более плавным при навигации между страницами.
Вы замечали, что при переходе между роутами компоненты "мигают" или резко перерисовываются? Особенно это бросается в глаза, когда вы используете
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
без артефактов.Попробуйте — разница ощущается сразу.
✍️ @React_lib
🔥 React: избегай лишнего состояния с derived state!
В React часто встречается антипаттерн — derived state — когда ты дублируешь вычисляемое значение в useState.
👎 Пример плохого подхода:
🔍 Проблема: ты сам обязан синхронизировать
✅ Лучше вычисляй на лету:
🔧
🧠 Правило: если значение можно вычислить из другого — не пиши
Подробнее: https://react.dev/learn/you-might-not-need-an-effect
✍️ @React_lib
В 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
✍️ @React_lib
Хотите собрать первое приложение на React за 60 минут?
Присоединяйтесь к открытому уроку от OTUS. Без скучных теорий и банальных todo-листов: только практика, код и живое общение. Вы узнаете, зачем нужны хуки и как компоненты делают интерфейс «живым», и самостоятельно создадите интерактивную игру.
Урок пройдет в преддверии старта курса «React.js Developer». Каждый участник вебинара получит скидку на обучение.
Встречаемся 7 мая в 20:00 МСК, регистрируйтесь прямо сейчас, чтобы не пропустить: https://vk.cc/cLCpLs
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Присоединяйтесь к открытому уроку от OTUS. Без скучных теорий и банальных todo-листов: только практика, код и живое общение. Вы узнаете, зачем нужны хуки и как компоненты делают интерфейс «живым», и самостоятельно создадите интерактивную игру.
Урок пройдет в преддверии старта курса «React.js Developer». Каждый участник вебинара получит скидку на обучение.
Встречаемся 7 мая в 20:00 МСК, регистрируйтесь прямо сейчас, чтобы не пропустить: https://vk.cc/cLCpLs
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🔥 Сегодня покажу, как настроить мгновенное обновление компонентов в React без полной перезагрузки страницы
Если ты пользуешься Vite, Parcel или Webpack с React — тебе точно стоит включить React Fast Refresh. Это технология, которая сохраняет состояние компонентов при обновлении кода. Раньше нужно было каждый раз обновлять страницу и терять всё введённое. Теперь — нет!
⚙️ Как это работает?
React Fast Refresh отслеживает изменения в компонентах и аккуратно обновляет только изменившиеся части DOM. Всё состояние (
✅ Как включить в Vite:
Установи плагин:
И подключи в
Этот плагин включает
🤯 Что получаешь:
* мгновенное обновление UI при изменении кода
* сохранение состояния формы, вкладок, фильтров и т.д.
* больше удовольствия от разработки 😎
🎯 Не забудь, это работает только в dev-режиме. В проде всё остаётся стабильным и оптимизированным.
✍️ @React_lib
Если ты пользуешься 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-режиме. В проде всё остаётся стабильным и оптимизированным.
✍️ @React_lib
🚀 Подборка Telegram каналов для программистов
Системное администрирование, DevOps 📌
https://www.tgoop.com/bash_srv Bash Советы
https://www.tgoop.com/win_sysadmin Системный Администратор Windows
https://www.tgoop.com/sysadmin_girl Девочка Сисадмин
https://www.tgoop.com/srv_admin_linux Админские угодья
https://www.tgoop.com/linux_srv Типичный Сисадмин
https://www.tgoop.com/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://www.tgoop.com/linux_odmin Linux: Системный администратор
https://www.tgoop.com/devops_star DevOps Star (Звезда Девопса)
https://www.tgoop.com/i_linux Системный администратор
https://www.tgoop.com/linuxchmod Linux
https://www.tgoop.com/sys_adminos Системный Администратор
https://www.tgoop.com/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://www.tgoop.com/sysadminof Книги для админов, полезные материалы
https://www.tgoop.com/i_odmin Все для системного администратора
https://www.tgoop.com/i_odmin_book Библиотека Системного Администратора
https://www.tgoop.com/i_odmin_chat Чат системных администраторов
https://www.tgoop.com/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://www.tgoop.com/sysadminoff Новости Линукс Linux
1C разработка 📌
https://www.tgoop.com/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://www.tgoop.com/DevLab1C 1С:Предприятие 8
https://www.tgoop.com/razrab_1C 1C Разработчик
https://www.tgoop.com/buh1C_prog 1C Программист | Бухгалтерия и Учёт
https://www.tgoop.com/rabota1C_rus Вакансии для программистов 1С
Программирование C++📌
https://www.tgoop.com/cpp_lib Библиотека C/C++ разработчика
https://www.tgoop.com/cpp_knigi Книги для программистов C/C++
https://www.tgoop.com/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://www.tgoop.com/pythonofff Python академия.
https://www.tgoop.com/BookPython Библиотека Python разработчика
https://www.tgoop.com/python_real Python подборки на русском и английском
https://www.tgoop.com/python_360 Книги по Python
Java разработка 📌
https://www.tgoop.com/BookJava Библиотека Java разработчика
https://www.tgoop.com/java_360 Книги по Java Rus
https://www.tgoop.com/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://www.tgoop.com/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://www.tgoop.com/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://www.tgoop.com/developer_mobila Мобильная разработка
https://www.tgoop.com/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://www.tgoop.com/frontend_1 Подборки для frontend разработчиков
https://www.tgoop.com/frontend_sovet Frontend советы, примеры и практика!
https://www.tgoop.com/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://www.tgoop.com/game_devv Все о разработке игр
Библиотеки 📌
https://www.tgoop.com/book_for_dev Книги для программистов Rus
https://www.tgoop.com/programmist_of Книги по программированию
https://www.tgoop.com/proglb Библиотека программиста
https://www.tgoop.com/bfbook Книги для программистов
БигДата, машинное обучение 📌
https://www.tgoop.com/bigdata_1 Big Data, Machine Learning
Программирование 📌
https://www.tgoop.com/bookflow Лекции, видеоуроки, доклады с IT конференций
https://www.tgoop.com/rust_lib Полезный контент по программированию на Rust
https://www.tgoop.com/golang_lib Библиотека Go (Golang) разработчика
https://www.tgoop.com/itmozg Программисты, дизайнеры, новости из мира IT
https://www.tgoop.com/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://www.tgoop.com/nodejs_lib Подборки по Node js и все что с ним связано
https://www.tgoop.com/ruby_lib Библиотека Ruby программиста
https://www.tgoop.com/lifeproger Жизнь программиста. Авторский канал.
QA, тестирование 📌
https://www.tgoop.com/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://www.tgoop.com/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://www.tgoop.com/thehaking Канал о кибербезопасности
https://www.tgoop.com/xakep_2 Хакер Free
Книги, статьи для дизайнеров 📌
https://www.tgoop.com/ux_web Статьи, книги для дизайнеров
Математика 📌
https://www.tgoop.com/Pomatematike Канал по математике
https://www.tgoop.com/phis_mat Обучающие видео, книги по Физике и Математике
https://www.tgoop.com/matgeoru Математика | Геометрия | Логика
Excel лайфхак📌
https://www.tgoop.com/Excel_lifehack
https://www.tgoop.com/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://www.tgoop.com/sysadmin_rabota Системный Администратор
https://www.tgoop.com/progjob Вакансии в IT
Системное администрирование, DevOps 📌
https://www.tgoop.com/bash_srv Bash Советы
https://www.tgoop.com/win_sysadmin Системный Администратор Windows
https://www.tgoop.com/sysadmin_girl Девочка Сисадмин
https://www.tgoop.com/srv_admin_linux Админские угодья
https://www.tgoop.com/linux_srv Типичный Сисадмин
https://www.tgoop.com/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://www.tgoop.com/linux_odmin Linux: Системный администратор
https://www.tgoop.com/devops_star DevOps Star (Звезда Девопса)
https://www.tgoop.com/i_linux Системный администратор
https://www.tgoop.com/linuxchmod Linux
https://www.tgoop.com/sys_adminos Системный Администратор
https://www.tgoop.com/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://www.tgoop.com/sysadminof Книги для админов, полезные материалы
https://www.tgoop.com/i_odmin Все для системного администратора
https://www.tgoop.com/i_odmin_book Библиотека Системного Администратора
https://www.tgoop.com/i_odmin_chat Чат системных администраторов
https://www.tgoop.com/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://www.tgoop.com/sysadminoff Новости Линукс Linux
1C разработка 📌
https://www.tgoop.com/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://www.tgoop.com/DevLab1C 1С:Предприятие 8
https://www.tgoop.com/razrab_1C 1C Разработчик
https://www.tgoop.com/buh1C_prog 1C Программист | Бухгалтерия и Учёт
https://www.tgoop.com/rabota1C_rus Вакансии для программистов 1С
Программирование C++📌
https://www.tgoop.com/cpp_lib Библиотека C/C++ разработчика
https://www.tgoop.com/cpp_knigi Книги для программистов C/C++
https://www.tgoop.com/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://www.tgoop.com/pythonofff Python академия.
https://www.tgoop.com/BookPython Библиотека Python разработчика
https://www.tgoop.com/python_real Python подборки на русском и английском
https://www.tgoop.com/python_360 Книги по Python
Java разработка 📌
https://www.tgoop.com/BookJava Библиотека Java разработчика
https://www.tgoop.com/java_360 Книги по Java Rus
https://www.tgoop.com/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://www.tgoop.com/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://www.tgoop.com/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://www.tgoop.com/developer_mobila Мобильная разработка
https://www.tgoop.com/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://www.tgoop.com/frontend_1 Подборки для frontend разработчиков
https://www.tgoop.com/frontend_sovet Frontend советы, примеры и практика!
https://www.tgoop.com/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://www.tgoop.com/game_devv Все о разработке игр
Библиотеки 📌
https://www.tgoop.com/book_for_dev Книги для программистов Rus
https://www.tgoop.com/programmist_of Книги по программированию
https://www.tgoop.com/proglb Библиотека программиста
https://www.tgoop.com/bfbook Книги для программистов
БигДата, машинное обучение 📌
https://www.tgoop.com/bigdata_1 Big Data, Machine Learning
Программирование 📌
https://www.tgoop.com/bookflow Лекции, видеоуроки, доклады с IT конференций
https://www.tgoop.com/rust_lib Полезный контент по программированию на Rust
https://www.tgoop.com/golang_lib Библиотека Go (Golang) разработчика
https://www.tgoop.com/itmozg Программисты, дизайнеры, новости из мира IT
https://www.tgoop.com/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://www.tgoop.com/nodejs_lib Подборки по Node js и все что с ним связано
https://www.tgoop.com/ruby_lib Библиотека Ruby программиста
https://www.tgoop.com/lifeproger Жизнь программиста. Авторский канал.
QA, тестирование 📌
https://www.tgoop.com/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://www.tgoop.com/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://www.tgoop.com/thehaking Канал о кибербезопасности
https://www.tgoop.com/xakep_2 Хакер Free
Книги, статьи для дизайнеров 📌
https://www.tgoop.com/ux_web Статьи, книги для дизайнеров
Математика 📌
https://www.tgoop.com/Pomatematike Канал по математике
https://www.tgoop.com/phis_mat Обучающие видео, книги по Физике и Математике
https://www.tgoop.com/matgeoru Математика | Геометрия | Логика
Excel лайфхак📌
https://www.tgoop.com/Excel_lifehack
https://www.tgoop.com/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://www.tgoop.com/sysadmin_rabota Системный Администратор
https://www.tgoop.com/progjob Вакансии в IT
Telegram
Bash Советы
🚀 Секреты и советы по Bash
🔹 Полезные трюки, хитрые однострочники и лайфхаки для работы в терминале.
🔹 Автоматизация, скрипты и оптимизация работы в Linux.
🔹 Стать мастером Bash легко – просто подпишись!
💻 Прокачивай терминал вместе с нами! 👇
🔹 Полезные трюки, хитрые однострочники и лайфхаки для работы в терминале.
🔹 Автоматизация, скрипты и оптимизация работы в Linux.
🔹 Стать мастером Bash легко – просто подпишись!
💻 Прокачивай терминал вместе с нами! 👇
🎯 Оптимизация ререндеров в React через мемоизацию функций
Многие знают про
📌 Проблема:
Такой
✅ Решение:
📈 Профит: Функция сохраняется между рендерами,
🧠 Особенно важно для:
* Компонентов в списках (
* Контейнеров с большим числом коллбеков
* Производительных UI (таблицы, дашборды, графики)
💡 Используйте eslint-плагин
✍️ @React_lib
Многие знают про
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
— он не даст забыть зависимости.✍️ @React_lib
🔥 Антипаттерн в React: избыточные зависимости useEffect
Встречали такое?
❗️Проблема:
👎 Это вызывает лишние запросы, лаги и баги в логике.
💡 Решения:
1. Обёрнуть в useCallback:
2. Вынести вне компонента (если она не зависит от состояния):
3. Игнорировать в зависимостях (как временный хак, но осторожно!):
✅ Правильное управление зависимостями в
✍️ @React_lib
Встречали такое?
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
— ключ к стабильному и предсказуемому поведению компонентов.✍️ @React_lib
Не просто кнопка "Загрузить": Секреты работы с файлами в React
🎓 19 мая в 20:00 — бесплатный вебинар для разработчиков, которые хотят делать удобную и безопасную загрузку файлов в React-приложениях.
Что покажем:
— Drag & Drop, предпросмотр, валидация — всё, что ждали от UX;
— Обработка PDF, Excel и изображений прямо в браузере;
— Как не «положить» интерфейс при загрузке тяжёлых файлов;
— Защита от XSS, проверка MIME-типов и другие нюансы безопасности.
📌 Для фронтендеров и fullstack-разработчиков, которым важна клиентская оптимизация.
В программе — реальные примеры кода, которые можно сразу использовать.
Урок пройдет в преддверии старта курса «React.js Developer». Каждый участник вебинара получит скидку на обучение.
Регистрация: https://vk.cc/cLZMN5
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🎓 19 мая в 20:00 — бесплатный вебинар для разработчиков, которые хотят делать удобную и безопасную загрузку файлов в React-приложениях.
Что покажем:
— Drag & Drop, предпросмотр, валидация — всё, что ждали от UX;
— Обработка PDF, Excel и изображений прямо в браузере;
— Как не «положить» интерфейс при загрузке тяжёлых файлов;
— Защита от XSS, проверка MIME-типов и другие нюансы безопасности.
📌 Для фронтендеров и fullstack-разработчиков, которым важна клиентская оптимизация.
В программе — реальные примеры кода, которые можно сразу использовать.
Урок пройдет в преддверии старта курса «React.js Developer». Каждый участник вебинара получит скидку на обучение.
Регистрация: https://vk.cc/cLZMN5
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Сегодня поговорим о Zustand — суперлёгкой и мощной библиотеке для управления состоянием в React-приложениях.
🧵 Минимализм состояния с Zustand
Создание стора занимает меньше минуты:
🎯 Как использовать в компоненте:
🧠 Чем хорош Zustand:
* Нет провайдеров.
* Нет бойлерплейта.
* Поддержка middlewares, persist, subscriptions.
* Работает в Next.js, React Native, даже вне React.
Zustand идеально подходит для маленьких и средних приложений. Простой API — максимум гибкости.
✍️ @React_lib
🧵 Минимализм состояния с 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 — максимум гибкости.
✍️ @React_lib
🚧 TanStack DB — это TypeScript-first библиотека для управления данными и кэшированием, вдохновлённая такими инструментами, как tRPC, TanStack Query, Drizzle, Kysely, RxJS, MobX, Signal, SWR, Zustand и другими.
Что такое TanStack DB?
TanStack DB — это реактивная, абстрактная система управления данными с поддержкой провайдеров и кэшированием, ориентированная на работу с "запросами", "данными" и "реактивностью".
Ты описываешь структуру данных (схему), подключаешь источник данных (провайдер), и всё остальное — магия ✨:
* TanStack DB умеет работать с асинхронными источниками данных
* Обновления реактивны: изменения автоматически отражаются во всех связанных компонентах
* Поддерживаются "live queries" — данные автоматически обновляются при изменении источника
* Под капотом используются сигналы и абстракции, напоминающие RxJS, но с более простым API
https://github.com/TanStack/db
✍️ @React_lib
Что такое TanStack DB?
TanStack DB — это реактивная, абстрактная система управления данными с поддержкой провайдеров и кэшированием, ориентированная на работу с "запросами", "данными" и "реактивностью".
Ты описываешь структуру данных (схему), подключаешь источник данных (провайдер), и всё остальное — магия ✨:
* TanStack DB умеет работать с асинхронными источниками данных
* Обновления реактивны: изменения автоматически отражаются во всех связанных компонентах
* Поддерживаются "live queries" — данные автоматически обновляются при изменении источника
* Под капотом используются сигналы и абстракции, напоминающие RxJS, но с более простым API
https://github.com/TanStack/db
✍️ @React_lib
💻 Хотите стать востребованным Fullstack-разработчиком?
Откройте для себя новые возможности с обучением OTUS!
❗️ На курсе вы научитесь всему, что нужно для того, чтобы стать универсальным разработчиком, который создает как фронтенд, так и серверную часть веб-приложений. Освоите: HTML, CSS, JavaScript, React, TypeScript, Node.js и многое другое. Пройдете все этапы разработки, от верстки до серверной настройки.
По окончании программы у вас будет:
✅ 3 реальных проекта в портфолио
✅ Навыки, необходимые для работы в крупных компаниях
✅ Готовность к собеседованиям
✅ Уверенное понимание процесса разработки
✅ Возможность участвовать в интересных проектах
➡️ Оставьте заявку прямо сейчас: https://vk.cc/cMaCmG
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Откройте для себя новые возможности с обучением OTUS!
По окончании программы у вас будет:
✅ 3 реальных проекта в портфолио
✅ Навыки, необходимые для работы в крупных компаниях
✅ Готовность к собеседованиям
✅ Уверенное понимание процесса разработки
✅ Возможность участвовать в интересных проектах
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
Как создать свой кастомный хук
В реальных приложениях иногда нужно сравнивать текущее и предыдущее состояние — например, чтобы анимировать изменения или вызывать сайд-эффекты только при росте/падении значения. Сегодня покажу, как легко вынести логику в переиспользуемый хук.
Почему это круто:
* ✅ Логика хранения предыдущих значений вынесена в один хук — нет дублирования кода.
* ✅
* ✅ Помогает сравнивать и реагировать на изменения (анимации, уведомления, условные запросы).
Попробуйте интегрировать
✍️ @React_lib
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
в свои компоненты, где нужно отслеживать изменение данных во времени. Поделитесь в комментариях, в каких кейсах вы уже использовали или планируете применить такой хук!✍️ @React_lib