<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Archakov Dennis</title><author><name>Archakov Dennis</name></author><id>https://teletype.in/atom/archakov</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/archakov?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@archakov?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=archakov"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/archakov?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-15T17:02:26.401Z</updated><entry><id>archakov:LQV8ByNUD</id><link rel="alternate" type="text/html" href="https://teletype.in/@archakov/LQV8ByNUD?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=archakov"></link><title>Когда необходимо использовать React.memo и PureComponent?</title><published>2021-03-28T10:36:48.786Z</published><updated>2021-03-28T10:57:21.433Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/b8/88/b8886760-0b6f-4372-ae24-3266a47ce6f8.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/32/18/32184c81-70fe-4365-9022-b54a7fcda56a.png&quot;&gt;Когда у вас возникнет сомнение, достаточно ли хорошо вы оптимизировали ререндер компонентов с помощью React.memo() или shouldComponentUpdate, просто помните, что Instagram плевал на ваши реакт мемы и прочие способы оптимизации ререндера (см. на рисунок статьи).</summary><content type="html">
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/32/18/32184c81-70fe-4365-9022-b54a7fcda56a.png&quot; width=&quot;1015&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Когда у вас возникнет сомнение, достаточно ли хорошо вы оптимизировали ререндер компонентов с помощью React.memo() или shouldComponentUpdate, просто помните, что Instagram плевал на ваши реакт мемы и прочие способы оптимизации ререндера (см. на рисунок статьи).&lt;/p&gt;
  &lt;p&gt;Все эти зелёные квадратики - &lt;strong&gt;компоненты&lt;/strong&gt;, которые делают ререндер при нажатии на логотип инстаграма и даже при сужении окна.&lt;/p&gt;
  &lt;p&gt;Один из &amp;quot;страшных&amp;quot; снов реакт-разработчика - бесполезный ререндер компонента. Разработчик неистово пытается бороться с этой  &amp;quot;проблемой&amp;quot;, оборачивая с помощью React.memo() или PureComponent (shouldComponentUpdate), в надежде на то, что компонент перестанет делать ререндр, когда этого не требуется.&lt;/p&gt;
  &lt;p&gt;Согласен, делать перерисовку компонента даже тогда, когда в нём ничего не изменилось, не очень то и здорово, но и ничего страшного в этом нет 🤷🏻‍♂️&lt;/p&gt;
  &lt;p&gt;Даже если ничего не изменилось (просы, стейт), а вызов на ререндер у компонента всё равно произошёл, React не будет перерисовывать что-то в DOM-дереве, &lt;a href=&quot;https://ru.reactjs.org/docs/rendering-elements.html#react-only-updates-whats-necessary&quot; target=&quot;_blank&quot;&gt;если VDOM не даст на это добро&lt;/a&gt;. &lt;/p&gt;
  &lt;p&gt;Дорогостоящей операцией в React является &lt;strong&gt;не повторный вызов компонента&lt;/strong&gt;, а &lt;strong&gt;изменение чего-то в DOM-дереве&lt;/strong&gt;.&lt;/p&gt;
  &lt;p&gt;В качестве примера, я сделал &lt;a href=&quot;https://stackblitz.com/edit/react-5h34zs?file=src%252FApp.js&quot; target=&quot;_blank&quot;&gt;очень простую демку&lt;/a&gt;.&lt;/p&gt;
  &lt;p&gt;Если в компоненте &amp;quot;&lt;strong&gt;А&lt;/strong&gt;&amp;quot; нажать на &amp;quot;+&amp;quot;, перерисовку будут делать компонент &amp;quot;&lt;strong&gt;B&lt;/strong&gt;&amp;quot; и &amp;quot;&lt;strong&gt;C&lt;/strong&gt;&amp;quot;, так как родительский компонент &amp;quot;&lt;strong&gt;А&lt;/strong&gt;&amp;quot; был повторно вызов из-за изменения счётчика. В консоли вы увидите сообщение при каждом повторном рендере.&lt;/p&gt;
  &lt;p&gt;Но если компонент &amp;quot;&lt;strong&gt;C&lt;/strong&gt;&amp;quot; обернуть с помощью &lt;strong&gt;React.memo&lt;/strong&gt;, то в консоли не будет сообщение о том, что данный компонент сделал ререндер, даже если счётчик обновился.&lt;/p&gt;
  &lt;p&gt;Выглядит круто, не правда ли? Мы ведь избавились от лишнего ререндера! Ноооо &lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/9d/c2/9dc2f19d-61c8-43fe-b541-1a94071c7bf9.png&quot; width=&quot;600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Обернув компонент &amp;quot;&lt;strong&gt;С&lt;/strong&gt;&amp;quot; с помощью React.memo, мы не решили никакую проблему, а наоборот, добавили лишнюю логику, которая будет выполняться при каждом вызове компонента &amp;quot;&lt;strong&gt;С&lt;/strong&gt;&amp;quot;. &lt;/p&gt;
  &lt;p&gt;То есть, при изменении счётчика в компоненте &amp;quot;&lt;strong&gt;А&lt;/strong&gt;&amp;quot;, компонент &amp;quot;&lt;strong&gt;С&lt;/strong&gt;&amp;quot; будет вызываться всё равно, но теперь ещё с дополнительной логикой проверки, которая ему в принципе была не нужна, так как он просто отображает какую-то вёрстку.&lt;/p&gt;
  &lt;p&gt;React.memo или PureComponent необходимо использовать только в том случае, если вы реально столкнулись с проблемой, которая заставляет тормозить ваш UI или выполняет лишнюю логику.&lt;/p&gt;
  &lt;p&gt;В &lt;a href=&quot;https://ru.reactjs.org/docs/reconciliation.html&quot; target=&quot;_blank&quot;&gt;этой статьей&lt;/a&gt; подробно объясняется, как происходит согласование перерисовки компонентов.&lt;/p&gt;

</content></entry></feed>