Могу ли я быть уверен, что при следующем рендеринге React будет использоваться самое последнее значение состояния? - PullRequest
2 голосов
/ 25 марта 2019

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

Документация по компонентам React

setState () ставит в очередь изменения состояния компонента и сообщает React, что этот компонент и его дочерние элементы необходимо повторно визуализировать с обновленным состоянием.Это основной метод, который используется для обновления пользовательского интерфейса в ответ на обработчики событий и ответы сервера.

Думайте о setState () как о запросе, а не как о немедленной команде для обновления компонента.Для лучшего восприятия производительности React может задержать ее, а затем обновить несколько компонентов за один проход.React не гарантирует, что изменения состояния будут применены немедленно.

setState () не всегда сразу обновляет компонент.Это может пакетировать или отложить обновление до позже.Это делает чтение this.state сразу после вызова setState () потенциальной ловушкой.Вместо этого используйте componentDidUpdate или обратный вызов setState (setState (Updater, callback)), который гарантированно сработает после применения обновления.Если вам нужно установить состояние на основе предыдущего состояния, прочтите об аргументе средства обновления ниже.

Справочник по API React Hooks

Basic Hooks - useState

const [state, setState] = useState(initialState);

Возвращает значение с состоянием и функцию для его обновления.

Во время первоначального рендеринга возвращается состояние (состояние) совпадает со значением, переданным в качестве первого аргумента (initialState).

Функция setState используется для обновления состояния.Он принимает новое значение состояния и ставит в очередь повторную визуализацию компонента.

ВОПРОС 1

Мой вопрос: независимоСколько обновлений состояний React решает поставить в очередь для выполнения в одном пакете, могу ли я рассчитывать на тот факт, что следующий рендер будет использовать самое текущее состояние со всеми обновлениями, которые были поставлены в очередь с момента последнего рендеринга?

ВОПРОС 2

Могу ли я рассчитывать на порядок изменений состояния, которые React решает поставить в очередь?Я имею в виду, если я setState({a:1}), а затем setState({a:2}), могу ли я быть уверен, что окончательное значение моего состояния будет 2?

1 Ответ

1 голос
/ 26 марта 2019

Вопрос 1: Нет, React может отобразить (например) только половину очереди обновления, а затем - другую.

Вопрос 2: Да.Порядок обработки обновлений может быть не таким простым, как порядок, в котором вы вызываете setState, но, в конце концов, порядок вставки определяет последнюю версию вашего состояния.

Подробное объяснениев код реакции .

...