STARTPOINT_DEV Telegram 56
📢 Новые хуки в React 19! Часть 2

В предыдущей части мы посмотрели на хуки useActionState и useFormStatus, а сегодня разберем useOptimistic💡

Напоминаю, что все примеры лежат в нашем репозитории здесь 👉 GitHub

🔍 useOptimistic

Часто в современных интерфейсах используют подход, который называется Optimistic UI. Он заключается в том, что мы предполагаем, что на бэкенде запрос выполнится успешно, поэтому сразу можем показать пользователям обновленное состояние.

Ранее для реализации такого поведения приходилось сильно хитрить. Нельзя просто вызвать useState в обработчике перед асинхронной операцией и ожидать, что React сразу же отрисует новое состояние. Посмотрите на пример 5:


const [optimisticResult, setOptimisticResult] = useState(store);

... = useActionState(async (__: string | null, formData: FormData) => {
setOptimisticResult((prevState) => ({
title: formData.get('title')?.toString() || prevState.title,
description: formData.get('description')?.toString() || prevState.description,
}));

await saveData(formData);

return 'ok';
}, null);


Дело в том, что в React есть специальный механизм оптимизации — Batching, который не позволяет изменениям произойти до получения ответа от сервера.

Эту проблему решает новый хук useOptimistic. Если заменить в примере useState на этот хук, всё заработает правильно. Пример 6 использования нового хука:


const [optimisticResult, setOptimisticResult] = useOptimistic(store);

... = useActionState(async (__: string | null, formData: FormData) => {
setOptimisticResult((prevState) => ({
title: formData.get('title')?.toString() || prevState.title,
description: formData.get('description')?.toString() || prevState.description,
}));

await saveData(formData);

return 'ok';
}, null);


А если наша отправка формы завершится ошибкой, “оптимистичное” состояние автоматически сбросится. Пример использования с обработкой ошибок:


const [optimisticResult, setOptimisticResult] = useOptimistic(store);

... = useActionState(async (__: string | null, formData: FormData) => {
setOptimisticResult((prevState) => ({
title: formData.get('title')?.toString() || prevState.title,
description: formData.get('description')?.toString() || prevState.description,
}));

try {
await saveData(formData);
} catch (e) {
return 'not ok';
}

return 'ok';
}, null);


Дело в том, что при использовании useOptimistic мы передаем в него то значение, для которого хотим сделать оптимистичную версию (в данном примере это store).


const [optimisticResult, setOptimisticResult] = useOptimistic(store);


После выполнения обработчика в хук запишется значение, соответствующее текущему состоянию store.


✍️ Пишите в комментариях, полезней ли на ваш взгляд хук useOptimistic, чем два предыдущих. Мне кажется, этот хук будет использоваться чаще, чем useActionState и useFormStatus.
👍2



tgoop.com/startpoint_dev/56
Create:
Last Update:

📢 Новые хуки в React 19! Часть 2

В предыдущей части мы посмотрели на хуки useActionState и useFormStatus, а сегодня разберем useOptimistic💡

Напоминаю, что все примеры лежат в нашем репозитории здесь 👉 GitHub

🔍 useOptimistic

Часто в современных интерфейсах используют подход, который называется Optimistic UI. Он заключается в том, что мы предполагаем, что на бэкенде запрос выполнится успешно, поэтому сразу можем показать пользователям обновленное состояние.

Ранее для реализации такого поведения приходилось сильно хитрить. Нельзя просто вызвать useState в обработчике перед асинхронной операцией и ожидать, что React сразу же отрисует новое состояние. Посмотрите на пример 5:


const [optimisticResult, setOptimisticResult] = useState(store);

... = useActionState(async (__: string | null, formData: FormData) => {
setOptimisticResult((prevState) => ({
title: formData.get('title')?.toString() || prevState.title,
description: formData.get('description')?.toString() || prevState.description,
}));

await saveData(formData);

return 'ok';
}, null);


Дело в том, что в React есть специальный механизм оптимизации — Batching, который не позволяет изменениям произойти до получения ответа от сервера.

Эту проблему решает новый хук useOptimistic. Если заменить в примере useState на этот хук, всё заработает правильно. Пример 6 использования нового хука:


const [optimisticResult, setOptimisticResult] = useOptimistic(store);

... = useActionState(async (__: string | null, formData: FormData) => {
setOptimisticResult((prevState) => ({
title: formData.get('title')?.toString() || prevState.title,
description: formData.get('description')?.toString() || prevState.description,
}));

await saveData(formData);

return 'ok';
}, null);


А если наша отправка формы завершится ошибкой, “оптимистичное” состояние автоматически сбросится. Пример использования с обработкой ошибок:


const [optimisticResult, setOptimisticResult] = useOptimistic(store);

... = useActionState(async (__: string | null, formData: FormData) => {
setOptimisticResult((prevState) => ({
title: formData.get('title')?.toString() || prevState.title,
description: formData.get('description')?.toString() || prevState.description,
}));

try {
await saveData(formData);
} catch (e) {
return 'not ok';
}

return 'ok';
}, null);


Дело в том, что при использовании useOptimistic мы передаем в него то значение, для которого хотим сделать оптимистичную версию (в данном примере это store).


const [optimisticResult, setOptimisticResult] = useOptimistic(store);


После выполнения обработчика в хук запишется значение, соответствующее текущему состоянию store.


✍️ Пишите в комментариях, полезней ли на ваш взгляд хук useOptimistic, чем два предыдущих. Мне кажется, этот хук будет использоваться чаще, чем useActionState и useFormStatus.

BY Настя Котова // Frontend & Node.js




Share with your friend now:
tgoop.com/startpoint_dev/56

View MORE
Open in Telegram


Telegram News

Date: |

Telegram Channels requirements & features While the character limit is 255, try to fit into 200 characters. This way, users will be able to take in your text fast and efficiently. Reveal the essence of your channel and provide contact information. For example, you can add a bot name, link to your pricing plans, etc. "Doxxing content is forbidden on Telegram and our moderators routinely remove such content from around the world," said a spokesman for the messaging app, Remi Vaughn. 1What is Telegram Channels? “[The defendant] could not shift his criminal liability,” Hui said.
from us


Telegram Настя Котова // Frontend & Node.js
FROM American