АнтипаттернИ вот тут есть проблема. В этом примере
value
контекста — это объект
{ signIn, signOut }
.
Этот объект создаётся заново каждый раз, когда вызывается
AuthWrapper
. Из-за этого контекст каждый раз получает новое значение. А при изменении контекста React
перерисовывает всё, что подключено к этому контексту.
В итоге каждый раз, когда мы перерисовываем
AuthWrapper
, React перерисовывает ещё и все зависимые от контекста компоненты. Если компонентов много, это особенно дорого.
shouldComponentUpdate/PureComponent/React.memo() не помогаютReact.memo(),
PureComponent и
shouldComponentUpdate предотвращают перерисовку компонента, если его пропсы и стейт не поменялись. Но они не работают с контекстом; поэтому тут они бессильны.
Как чинитьЧтобы починить, нужно сделать, чтобы объект не менялся каждый раз.
1) Самый простой способ — это вынести его из компонента: