Правильно ли, что this.setState в компонентах класса всегда вызывает повторную визуализацию, даже если новое значение состояния идентично предыдущему?
Если задано допустимое значениекроме возврата нулевого значения в setState, повторный рендеринг всегда будет запускаться по реакции в компоненте класса, если только ваш компонент не является PureComponent или вы не внедрили shouldComponentUpdate
Правильно ли, что в компонентах функций с хукамиsetState from useState вызывает повторную визуализацию только в том случае, если значение состояния отличается от предыдущего значения?
Для функционального компонента, использующего хук useState
, сеттер при вызове с тем же состоянием не сработаетперерисовать.Однако для случайного случая, если установщик вызывается немедленно, это приводит к двум рендерам вместо одного
Устанавливает состояние с помощью this.setState внутри метода рендеринга компонента класса, так же, как и состояние установкивнутри тела функции компонента функции с хуками?
Технически да, установка состояния непосредственно в методе рендеринга вызовет функцию повторного рендеринга в случае, когда компонент класса вызовет бесконечный цикл, которыйслучай для функциональных компонентов при условии, что значения состояния различны.Независимо от этого, это все равно будет вызывать проблему, потому что любое другое обновление состояния будет возвращено обратно из-за непосредственного обновления состояния функционального компонента
В компоненте класса, если мы устанавливаем состояние в методе рендерингабесконечный цикл произойдет.Это связано с тем, что компоненту класса не важно, что новое состояние совпадает с предыдущим состоянием.Он просто продолжает повторную визуализацию для каждого this.setState.
Да, поэтому рекомендуется не вызывать setState напрямую при рендеринге
В компоненте функции с перехватчиками, однако,установка состояния внутри тела функции (которая выполняется при повторном рендеринге аналогично методу рендеринга в компонентах класса) не будет проблемой, потому что компонент функции просто выходит из повторного рендеринга, когда видит, что состояние идентично предыдущемусостояние.
Не на 100% верно, поскольку вы можете инициировать обновление состояния, используя предыдущее значение, так что предыдущее и текущее значение не совпадают. Например,
setCount(count => count + 1);
В таком случаеВ этом случае ваш компонент все равно попадет в бесконечный цикл