
В React обновления состояния объединяются, что означает, что в вашем компоненте есть несколько частей состояния и состояния обновляются одновременно. React достаточно умен, чтобы объединять эти несколько обновлений состояния в одно обновление для оптимизации производительности.
но что, если этого нужно как-то избежать,
некоторые обновления состояния требуют времени, например, рассмотрим компонент с двумя значениями состояния, одно из которых представляет собой функцию, которая берет данные из API и соответствующим образом обновляет состояние, которое не нужно обновлять немедленно , но еще одним было поле ввода, которое необходимо обновить немедленно, если эти два состояния обновляются и в одно и то же время затем реакция пытается объединить обновления состояния, что приводит к задержке обновления состояния в поле ввода.
рассмотрим пример такого компонента: у нас есть компонент с полем ввода с состоянием и другим состоянием, предназначенным для рендеринга 20 тыс. элементов ввода, которые мы ввели, это делается для того, чтобы избежать концепций БД и API, поэтому наше состояние ввода должно обновляться немедленно, но наш список из 20 тысяч элементов можно отобразить позже.
мы можем сначала реализовать это следующим образом
import React from "react";
import { useState } from "react";
function UseTransition() {
const [ipValue, setIpValue] = useState("");
const [list, setList] = useState([]);
return (
<div>
<input
type="text"
value={ipValue}
onChange={(e) => {
setIpValue(e.target.value);
const l = [];
for (let i = 0; i < 20000; i++) {
l.push(e.target.value);
}
setList(l);
}}
/>
<div>
{list.map((item, index) => (
<div key={index}>{item}</div>
))}
</div>
</div>
);
}
export default UseTransition;

Если мы видим наше приложение в этот момент времени, оно наверняка лагает, входной компонент также лагает, что не является хорошим поведением.
мы можем использовать useTransition Hook и обновить код таким образом, что с помощью useTransition мы указываем реакцию, чтобы пометить обновление состояния как низкий приоритет. По умолчанию все обновления состояния имеют высокий приоритет, но с помощью useTransition мы указываем состояние с низкий приоритет
Синтаксис useTransition Hook:
const [isPending,startTransition] = useTransition()
Код, указанный в функции startTransition, если имеет низкий приоритет, мы также получаем isPending, который имеет логическое значение и указывает состояние функции, которое является истинным или ложным.
Обновленный код будет
import React from "react";
import { useTransition } from "react";
import { useState } from "react";
function UseTransition() {
const [ipValue, setIpValue] = useState("");
const [list, setList] = useState([]);
const [isPending, startTransition] = useTransition();
return (
<div>
<input
type="text"
value={ipValue}
onChange={(e) => {
setIpValue(e.target.value);
startTransition(() => {
const l = [];
for (let i = 0; i < 20000; i++) {
l.push(e.target.value);
}
setList(l);
});
}}
/>
<div>
{isPending
? "loading"
: list.map((item, index) => <div key={index}>{item}</div>)}
</div>
</div>
);
}
export default UseTransition;
мы просто добавляем код, который имеет низкий приоритет в функцию startTransition,
мы можем использовать логическое значение isPending, чтобы показать некоторый текст загрузки, пока выполняется функция startTransition.

Теперь мы ясно видим, что наше поле ввода больше не отстает, и мы также можем видеть состояние загрузки, которое также может быть заменено компонентами счетчика и загрузчика, если это необходимо, в соответствии с требованиями.
Спасибо…
Спасибо, что дочитали до конца. Пожалуйста, подумайте о том, чтобы подписаться на автора и эту публикацию. Посетите Stackademic, чтобы узнать больше о том, как мы демократизируем бесплатное образование в области программирования во всем мире.