<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: socaseinpoint</title>
    <description>The latest articles on DEV Community by socaseinpoint (@socaseinpoint).</description>
    <link>https://dev.to/socaseinpoint</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F890302%2F11fe6259-3db5-4071-8896-84108be6c04c.png</url>
      <title>DEV Community: socaseinpoint</title>
      <link>https://dev.to/socaseinpoint</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/socaseinpoint"/>
    <language>en</language>
    <item>
      <title>Управление сложностью: поиск баланса между хаосом и организацией</title>
      <dc:creator>socaseinpoint</dc:creator>
      <pubDate>Tue, 29 Aug 2023 11:19:47 +0000</pubDate>
      <link>https://dev.to/socaseinpoint/upravlieniie-slozhnostiu-poisk-balansa-miezhdu-khaosom-i-orghanizatsiiei-3o5d</link>
      <guid>https://dev.to/socaseinpoint/upravlieniie-slozhnostiu-poisk-balansa-miezhdu-khaosom-i-orghanizatsiiei-3o5d</guid>
      <description>&lt;p&gt;Как часто вы погружаетесь во внутренний мир планирования, пытаясь создать идеальную систему? Сколько раз ваши идеи и инструменты управления порой слишком упорядоченной реальностью заканчивались сдачей позиций перед вседозволенностью хаоса?&lt;/p&gt;

&lt;p&gt;Жизнь - это борьба с бесконечным хаосом. Трансформируя его в списки, напоминания и задачи, я искал наилучший способ организации. Пробовал разные приложения, пытаясь улучшить свою продуктивность, но хаос всегда возвращался. Иронично, но мне даже стало приятно отталкиваться от его неизбежности.&lt;/p&gt;

&lt;p&gt;Однако уходить в крайности и полагаться только на хаос — это также не выход. Планирование необходимо, чтобы прогрессировать и развиваться. Но как наладить этот баланс?&lt;/p&gt;

&lt;p&gt;Вот несколько инструментов, которые помогли мне организовать свой хаос:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Заметки в телефоне:&lt;/strong&gt; это мое место для быстрых, неоформленных идей, которые еще не превратились в конкретные задачи.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Доска с задачами:&lt;/strong&gt; каждая идея или заметка может стать задачей, если она требует выполнения.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Проекты:&lt;/strong&gt; когда задача становится слишком сложной или объемной, я превращаю ее в проект с отдельными подзадачами.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Доска идей:&lt;/strong&gt; некоторые заметки кажутся важными, но пока не могут быть задачами. Они остаются здесь до лучших времен.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;База знаний:&lt;/strong&gt; это место для долгосрочного хранения. Сюда попадают списки дел, книги, фильмы и другие ресурсы, к которым я хочу вернуться позже.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Грязный инбокс:&lt;/strong&gt; сюда попадает все то, что еще не было оформлено или отсортировано.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Важно помнить, что у каждого свои потребности и предпочтения. Что работает для меня, может не подойти другому. Однако ключевое правило здесь - управление сложностью. Не создавайте слишком много уровней и категорий, иначе вы рискуете потеряться в собственной системе.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Создание задачи — это процесс обобщения и абстракции, похожий на программирование. Вам нужно дать ей название, определиться с деталями и понять, какие действия с ней могут произойти.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;В заключение, планирование и организация — это искусство, требующее баланса. Найдите свой способ организации, не позволяя хаосу или чрезмерной организации контролировать вашу жизнь.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Оптимизация React компонентов</title>
      <dc:creator>socaseinpoint</dc:creator>
      <pubDate>Mon, 11 Jul 2022 14:31:18 +0000</pubDate>
      <link>https://dev.to/socaseinpoint/optimizatsiia-react-komponientov-2kg0</link>
      <guid>https://dev.to/socaseinpoint/optimizatsiia-react-komponientov-2kg0</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cC6BFp7t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fb8ieo2lxi6x2kzn3nrp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cC6BFp7t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fb8ieo2lxi6x2kzn3nrp.jpg" alt="Image from unsplash by @imwilliamwilliams&amp;lt;br&amp;gt;
" width="880" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;В React компоненты за время их существования было внесено множество изменений по улучшению их производительности, но до сих пор разработчики встречают множество проблем, которые можно было бы избежать, используя довольно простые техники оптимизации.&lt;/p&gt;

&lt;p&gt;В этой статье, мы разберем 5 практических способов оптимизации производительности:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Мемоизация с помощью использования &lt;code&gt;useMemo()&lt;/code&gt; и &lt;code&gt;UseCallback()&lt;/code&gt; хуков&lt;/li&gt;
&lt;li&gt;Оптимизация обращений к API с помощью React Query&lt;/li&gt;
&lt;li&gt;Оптимизация селекторов с помощью Reselect&lt;/li&gt;
&lt;li&gt;Заменить &lt;code&gt;useState()&lt;/code&gt; на &lt;code&gt;useRef()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Использование React Fragments&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  1. Мемоизация с помощью использования &lt;a href="https://ru.reactjs.org/docs/hooks-reference.html#usememo"&gt;&lt;code&gt;useMemo()&lt;/code&gt;&lt;/a&gt; и &lt;a href="https://ru.reactjs.org/docs/hooks-reference.html#usecallback"&gt;&lt;code&gt;useCallback()&lt;/code&gt;&lt;/a&gt; хуков
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%BC%D0%BE%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F"&gt;Мемоизация&lt;/a&gt; позволяет вашему коду перерисовывать компоненты, только если вы изменили «&lt;a href="https://ru.reactjs.org/docs/components-and-props.html"&gt;пропсы&lt;/a&gt;». C помощью этой техники разработчики могут избавиться от ненужных рендеров и уменьшить вычеслительную нагрузку в приложении.&lt;/p&gt;

&lt;p&gt;Из коробки React предлагает два способа мемоизации:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;useMemo()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;useCallback()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Мемоизация помогает уменьшить количество рендеров путем кеширования, избегая лишних вычислений, если входных параметры функции не меняются. В случае, если входные параметры изменятся — кэш становится недействительным и новое состояние React компонента будет отображено.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useMemo()&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Разберем механизм работы useMemo, на примере умножения двух чисел:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;multiply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;multiply&lt;/code&gt; — перерасчитывает результат на каждый вызов функции, следовательно компонент каждый раз будет перерисован, не смотря на то что входные параметры функции не изменились. Но если мы используем хук &lt;code&gt;useMemo()&lt;/code&gt;, то сможем избежать излишних рендеров, если входные параметры не изменятся и результат вызова функции будет в кэше.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cachedValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useMemo&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;В данном случае результат выполнения функции multiply содержится в переменной &lt;code&gt;cachedValue&lt;/code&gt; и функция &lt;code&gt;multiply&lt;/code&gt; не будет вызываться повторно, до тех пор пока не изменятся входные параметры.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useCallback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useCallback()&lt;/code&gt; использует мемоизацию. Отличительная особенность от &lt;code&gt;useMemo()&lt;/code&gt; заключается в том, что &lt;code&gt;useCallback()&lt;/code&gt; не кэширует результат, вместо этого мемоизирует переданную &lt;a href="https://developer.mozilla.org/ru/docs/Glossary/Callback_function"&gt;функцию обратного вызова&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Для примера возьмем компонент с «&lt;a href="https://ru.reactjs.org/docs/components-and-props.html"&gt;кликабельным&lt;/a&gt;» списком:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useCallback&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ClickableListWithMemoization&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;term&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Clicked Item : &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentTarget&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Listitem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;В вышеизложенном примере &lt;code&gt;useCallback()&lt;/code&gt; мемоизирует функцию обратного вызова &lt;code&gt;onClick&lt;/code&gt;, переданную обработчику событий, поэтому компонент не будет вызывать новые рендеры при клике на один и тот же элемент списка.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Оптимизация обращений к API с помощью &lt;a href="https://tanstack.com/query/v4/?from=reactQueryV3&amp;amp;original=https://react-query-v3.tanstack.com/"&gt;React Query&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;useEffect()&lt;/code&gt; часто используется, для вызова асинхронных запросов к API, однако &lt;code&gt;useEffect()&lt;/code&gt; делает запрос на каждый рендер компонента и чаще всего дынный вызов вернет те же данные.&lt;/p&gt;

&lt;p&gt;Решением данной проблемы будет использовании библиотеки React Query записывающей в кэш ответ асинхронного вызова. Когда мы делаем запрос к API, React Query сравнит данные из кэша с данными полученными от сервера и в случае отсутствия изменений предотвратит повторный рендеринг компонента.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;useQuery&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-query&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;fetchArticles&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Articles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isLoading&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;articles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fetchArticles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isLoading&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Loading&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isError&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;На момент написания статьи ReactQuery имеет 1000000+ еженедельных скачиваний через &lt;a href="https://www.npmjs.com/package/react-query"&gt;npm&lt;/a&gt; и больше 28 тысяч звезд на &lt;a href="https://github.com/TanStack/query"&gt;github&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Оптимизация селекторов с помощью &lt;a href="https://github.com/reduxjs/reselect"&gt;Reselect&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Reselect — сторонняя библиотека для создания мемоизированных селекторов, которая позволяет уменьшить количество повторных рендеров React компонентов.&lt;/p&gt;

&lt;p&gt;Чаще всего используется в связке с библиотекой Redux и по умолчанию включена в официальную библиотеку &lt;a href="https://redux-toolkit.js.org/"&gt;Redux Toolkit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Создать селектор с помощью Reselect, можно с помощью функции &lt;code&gt;createSelector&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createSelector&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;reselect&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; 

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;selectValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;value1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;value2&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;В примере выше функция &lt;code&gt;createSelector&lt;/code&gt; создает селектор, который не будет вычислять новое значение, пока входные данные не изменятся.&lt;/p&gt;

&lt;p&gt;Библиотека React Query имеет 4000000+ скачиваний через &lt;a href="https://www.npmjs.com/package/reselect"&gt;npm&lt;/a&gt; и больше 18 тысяч звезд на &lt;a href="https://github.com/reduxjs/reselect"&gt;github&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Заменить &lt;a href="https://ru.reactjs.org/docs/hooks-reference.html#usestate"&gt;&lt;code&gt;useState()&lt;/code&gt;&lt;/a&gt; на &lt;a href="https://ru.reactjs.org/docs/hooks-reference.html#useref"&gt;&lt;code&gt;useRef()&lt;/code&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;useState()&lt;/code&gt; — часто используется для &lt;a href="https://reactjs.org/docs/conditional-rendering.html"&gt;условного рендеринга&lt;/a&gt;, однако, в случаях, когда изменения состояния не должно вызывать повторный рендер React компонента, тогда лучше использовать &lt;code&gt;useRef()&lt;/code&gt; хук.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setToggle&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;setToggle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toggle&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 
      &lt;span class="nx"&gt;Click&lt;/span&gt; 
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;StrictMode&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/React.StrictMode&amp;gt;, document.getElementById&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;'mydiv'&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="err"&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Повторный рендер не происходит при изменении переменной &lt;code&gt;counter&lt;/code&gt;, поскольку &lt;code&gt;useRef()&lt;/code&gt; возвращает изменяемый (&lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Mutable"&gt;мутабельный&lt;/a&gt;) объект, который будет сохраняться в течении всего жизненного цикла компонента.&lt;/p&gt;

&lt;p&gt;Подробнее можно прочитать в &lt;a href="https://ru.reactjs.org/docs/hooks-reference.html#useref"&gt;официальной документации React&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Использование &lt;a href="https://ru.reactjs.org/docs/react-api.html#reactfragment"&gt;React Fragments&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Каждый React компонент должен возвращать один родительский элемент. Используйте React Fragments для того, чтобы вернуть несколько элементов.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Fragment&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;Какой&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;то&lt;/span&gt; &lt;span class="nx"&gt;текст&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Заголовок&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/React.Fragment&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Используйте сокращенный синтаксис &lt;code&gt;&amp;lt;&amp;gt;&amp;lt;/&amp;gt;&lt;/code&gt; для создания фрагментов.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;Какой&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;то&lt;/span&gt; &lt;span class="nx"&gt;текст&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Заголовок&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;React Fragments не создает DOM элемент, что позволяет ускорить рендеринг и сэкономить память.&lt;/p&gt;




&lt;h2&gt;
  
  
  Заключение
&lt;/h2&gt;

&lt;p&gt;Большая часть вышеизложенных методов использует кэширование и реализованы через React хуки или сторонние библиотеки. Эти способы улучшают работу вашего приложения уменьшая колличество нежелательных повторных рендеров и уменьшая нагрузку на память.&lt;/p&gt;

&lt;p&gt;Спасибо за прочтение! Напишите, если статья была полезной, любая критика приветствуется.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
