Получи случайную криптовалюту за регистрацию!

Заметки про React

Логотип телеграм канала @ru_react_notes — Заметки про React З
Логотип телеграм канала @ru_react_notes — Заметки про React
Адрес канала: @ru_react_notes
Категории: Технологии
Язык: Русский
Количество подписчиков: 1.62K
Описание канала:

Короткие заметки про React.js, TypeScript и все что с ним связано
Контакт: @rimlin

Рейтинги и Отзывы

2.00

2 отзыва

Оценить канал ru_react_notes и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

0

4 звезд

0

3 звезд

1

2 звезд

0

1 звезд

1


Последние сообщения 3

2022-07-20 11:55:05 Изучаем исходный код React

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

Например, при вызове createRoot из ReactDOM будет создаваться объект ReactDOMRoot:

function ReactDOMRoot(internalRoot: FiberRoot) {
this._internalRoot = internalRoot
}


Эта функция всего лишь сохраняет переданное значение в this и ничего не возвращает. Методы этой функции, например render, будут объявляться через прототип:

ReactDOMHydrationRoot.prototype.render =
ReactDOMRoot.prototype.render = function (
children: ReactNodeList
): void {
const root = this._internalRoot

// …
}


Этот подход имеет свои преимущества. Во-первых, можно использовать оператор instanceof для проверки типа объекта (instanceof будет проверять цепочку прототипа). Во-вторых, это более производительнее. Функция прототипа создается один раз, в отличии от замыканий.

https://alexkondov.com/readint-source-code-react/
1.0K viewsIlmir Shaikhutdinov, 08:55
Открыть/Комментировать
2022-06-22 11:30:46
Jest Preview для дебага тестов

При написании тестов с использованием Testing Library приходится писать много запросов в DOM, держа в голове структуру страницы, которую рендерит React для теста.

Для того чтобы видеть результат рендера во время теста, можно использовать библиотеку Jest Preview. После установки библиотеки и настройки конфигов, необходимо во время запуска тестов запускать команду jest-preview, которая будет стартовать сервер для превью тестов. В самих тестах, для отображения в браузере текущего DOM компонента, используется функция preview.debug().

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

https://www.jest-preview.com/
399 viewsIlmir Shaikhutdinov, 08:30
Открыть/Комментировать
2022-06-20 14:01:46 Plasmo – React фрейморвк для создания браузерных расширений

Plasmo – новый фреймворк на React и TypeScript для создания браузерных расширений. Особенности:
- live-reloading при дев разработке;
- файлы окружений;
- автоматический деплой;
- автоматическая генерация manifest.json;
- поддержка всех основных браузеров;

Также есть CLI для инициализации проекта. В фреймворке есть дополнительные библиотеки для работы с расширения, например API постоянного хранилища, у которой есть интеграция с Redux.

https://docs.plasmo.com/
188 viewsIlmir Shaikhutdinov, 11:01
Открыть/Комментировать
2022-06-17 11:55:06 Пример использования startTransition и 3D-рендеринга

В React 18 был добавлен конкурентный рендеринг. Основная его идея в том, что обновления стейта можно разделить на две категории:
- Срочные обновления: обеспечивают оперативный отклик на пользовательские события, например, ввод текста или скролл.
- Переходные обновления: представляют несрочные задачи для рендера UI, например, отображение датасета.

Цель переходных обновлений состоит в том, чтобы создать более отзывчивый интерфейс.

До React 18 все обновления стейта считались срочными и ввод текста или клик могли зафризить UI при рендере тяжелого компонента. В React 18 с помощью переходных обновлений рендер тяжелых компонентов будет происходить в фоне, в то время как UI будет оставаться отзывчивым.

Конкурентный рендеринг может выполнять следующие вещи:
- Yielding: React периодически ставит работу рендера на паузу, чтобы дать браузеру сделать другую работу.
- Прерывание: при появлении срочных задач React ставит рендер несрочной задачи на паузу и начинает рендерить срочную задачу, чтобы UI оставался отзывчивым.
- Отбрасывание старых результатов: если данные стейта для перехода устарели, то React отбрасывает старый рендер и начинает рендер по новой для свежего стейта.

Доу-Чи Лиу в своем блоге показал, как использовать API конкурентного рендеринга startTransition для рендера тяжелого компонента с 3D моделью с визуализацией связей между пользователями в Github.

Приложение содержит два компонента:
- поисковая строка пользователя Github;
- сцена с 3D визуализацией связей на three.js и react-three-fiber;

https://dawchihliou.github.io/articles/stress-testing-concurrent-features-in-react-18
282 viewsIlmir Shaikhutdinov, 08:55
Открыть/Комментировать
2022-06-16 15:00:43
Приглашаем всех JavaScript-разработчиков 23 июня в Питер на офлайн-день конференции HolyJS 2022 Spring!

Вас ждут:
5 докладов.
Дискуссии после каждого доклада.
Lightning talks: мини-доклады от участников конференции.
Живое общение, нетворкинг и обмен знаниями.
Стенды партнеров с разными активностями, мини-докладами и мерчем.

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

Подробности, полную программу и билеты вы найдете по ссылке.

Если покупаете билет за свой счет (а не за счет компании), то воспользуйтесь промокодом для получения скидки: reactnotes2022JRGpc
249 viewsIlmir Shaikhutdinov, 12:00
Открыть/Комментировать
2022-06-16 12:30:55 Как использовать useMemo и useCallback

Скорее всего вы знакомы с хуками useMemo и useCallback. Эти хуки используются практически в каждом проекте, и чем больше они используются, тем больше усложняют код компонента. Многие используют эти хуки, не до конца понимая зачем они нужны, и пишут их, потому что все так делают, так проще.

На самом деле большинство использований данных хуков неправильно и можно обойтись без них. В некоторых случаях приложение без них будет работать немного быстрее. Это не значит, что хуки useMemo и useCallback бесполезны, просто использовать их нужно в определенных случаях, а не всегда.

Основная задача хуков useMemo и useCallback- это мемоизация между ре-рендерами компонента. Если какое-то непримитивное значение или функция объявлены в теле компонента, то каждый раз при рендере будет создаваться новая ссылка на значение. При мемоизации значение будет закэшировано во время первого рендера и при последующих рендерах будет возвращаться ссылка на закэшированное значение. Это удобно при использовании с useEffect:

const Component = () => {
// сохранение ссылк между ре-рендерами
const a = useMemo(() => ({ test: 1 }), []);

useEffect(() => {
// будет вызван когда значение “a” изменится
}, [a]);
};


Использование хуков useMemo и useCallback полезно только при ре-рендерах. При первом рендере React кэширует значения, поэтому рендерится компонент немного медленнее.
Один из популярных вариантов использования хуков мемоизации – это предотвращение ререндера компонента путем мемоизации пропсов. Например:

​​const Item = ({ item, onClick }) => ;

const Component = ({ data }) => {
const value = useMemo(() => ({ a: someStateValue }), [someStateValue]);
const onClick = useCallback(() => {
console.log(value);
}, [value]);

return (
<>
{data.map((d) => (

))}

);
};


В примере выше использование хуков нецелесообразно. Компонент ререндерится, если родительский компонент ререндерится. Чтобы предотвратить ререндер компонента, нужно использовать функцию React.memo. Компонент обернутый в React.memo будет ререндерится, только если изменятся пропсы. Поэтому все пропсы для этого компоненты должны быть мемоизированны.

Однако, прежде чем мемоизировать все пропсы для компонента стоит проверить производительность компонента. Если компонент работает быстро, то мемоизация не нужна.

https://www.developerway.com/posts/how-to-use-memo-use-callback
307 viewsIlmir Shaikhutdinov, 09:30
Открыть/Комментировать
2022-06-14 14:05:04 TypeScript типы для React

Использование TypeScript при написании компонентов в React может существенно облегчить разработку и поддержку кода. Небольшая подборка утилитарных типов для работы с React:

- React.ComponentProps. Иногда нет доступа к типу пропсов компонента: например, внешняя библиотека, которая дает доступ только к самому компоненту. Чтобы узнать тип пропсов компонента можно использовать React.ComponentProps.

import { ComponentProps } from "react";
import { ExternalComponent } from "external-lib";

type InternalComponentProps = ComponentProps & {
outerClassName: string;
};


- React.MouseEventHandler. Используется для типизации колбека события мыши.

import { MouseEventHandler, } from "react";

type ComponentProps = {
caption: string;
onClick: MouseEventHandler;
};

const Component = (props: ComponentProps) => (



);


- Pick. Используется для создания нового типа объекта, принимает два аргумента: исходный тип объекта и список ключей для выбора из исходного объекта. В React можно использовать для создания интерфейса пропсов, когда какой-то интерфейс расшарен между несколькими.

type ComponentProps = Pick & {
wrapperClassName?: string;
}

export const Component = (props: ComponentProps) => (

);


https://www.chakshunyu.com/blog/7-typescript-utility-types-for-react-developers/
351 viewsIlmir Shaikhutdinov, 11:05
Открыть/Комментировать
2022-06-10 12:20:02 Listener API в Redux Toolkit

В RTK с самого начала используется redux-thunk в качестве дефолтного мидлвара для написания синхронной и асинхронной логики вне компонента. Однако, thunk не позволяет вызывать side effect функцию в ответ на dispatch экшена. Для таких целей обычно используется redux-saga.

В redux-toolkit v1.8.0 появилось новое listener API, которое позволяет создавать мидлвар для подписки на экшен или изменении стейта. Концептуально новое API похоже на useEffect, которое запускается в ответ на изменении стора.

Подписка может быть создана как в процессе создания стора через listenerMiddleware.startListening(), либо динамически в рантайме через dispatch(addListener()).


// Create the middleware instance and methods
const listenerMiddleware = createListenerMiddleware()

// Add one or more listener entries that look for specific actions.
// They may contain any sync or async logic, similar to thunks.
listenerMiddleware.startListening({
actionCreator: todoAdded,
effect: async (action, listenerApi) => {
// Run whatever additional side-effect-y logic you want here
console.log('Todo added: ', action.payload.text)

// Can cancel other running instances
listenerApi.cancelActiveListeners()

// Run async logic
const data = await fetchData()

// Pause until action dispatched or state changed
if (await listenerApi.condition(matchSomeAction)) {
// Use the listener API methods to dispatch, get state,
// unsubscribe the listener, start child tasks, and more
listenerApi.dispatch(todoAdded('Buy pet food'))
listenerApi.unsubscribe()
}
},
})


Обзор и сравнение с redux-saga:
https://blog.logrocket.com/redux-toolkits-new-listener-middleware-vs-redux-saga/
360 viewsIlmir Shaikhutdinov, 09:20
Открыть/Комментировать
2022-06-08 14:01:30
Бесплатный день HolyJS 2022 Spring!

Команде организаторов и Программному комитету HolyJS хотелось бы, чтобы их усилия оценило как можно больше участников. Поэтому доступ к третьему дню конференции будет открыт для всех желающих.

Community Day на HolyJS 2022 Spring — 10 июня доступ свободный

В билет бесплатного дня входят:
4 доклада: например, про server-driven UI в вебе и преобразование TypeScript в Java.
Воркшоп: спикеры покажут, как написать приложение для конвертации криптовалюты с микросервисной архитектурой с помощью gRPC на платформе Node.js.
Дискуссии после докладов.
Возможность поучаствовать в играх, квизах, конкурсах и других активностях от партнеров конференции — там можно не только круто провести время, но и получить ценные призы.
Чаты, где сидят сотни ваших коллег со всего мира.

Для участия в Community Day нужно только зарегистрироваться — для этого переходите по ссылке.
416 viewsIlmir Shaikhutdinov, 11:01
Открыть/Комментировать
2022-06-08 12:05:03 Как работает хук useInsertionEffect в React 18

CSS-in-JS библиотеки генерируют стили на лету и вставляют их в документ. Для этих библиотек важно знать, в какой момент можно вставлять теги