{"componentChunkName":"component---src-templates-docs-js","path":"/docs/strict-mode.html","result":{"data":{"markdownRemark":{"html":"<p><code class=\"gatsby-code-text\">StrictMode</code> – це інструмент для виявлення потенційних проблем у додатку. Так само як і <code class=\"gatsby-code-text\">Fragment</code>, <code class=\"gatsby-code-text\">StrictMode</code> не рендерить видимого UI. Він активує додаткові перевірки та попередження для своїх нащадків.</p>\n<blockquote>\n<p>Примітка:</p>\n<p>Перевірки суворого режиму виконуються лише в режимі розробки; <em>вони не впливають на продакшн-збірку</em>.</p>\n</blockquote>\n<p>Ви можете увімкнути суворий режим для будь-якої частини вашого додатку. Наприклад:\n<div class=\"gatsby-highlight\">\n        <pre class=\"gatsby-code-jsx\"><code><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">ExampleApplication</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Header</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">React.StrictMode</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">ComponentOne</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">ComponentTwo</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">React.StrictMode</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Footer</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n        </div></p>\n<p>У наведеному вище прикладі, перевірки суворого режиму <em>не</em> будуть виконуватись для компонентів <code class=\"gatsby-code-text\">Header</code> та <code class=\"gatsby-code-text\">Footer</code>. Проте компоненти <code class=\"gatsby-code-text\">ComponentOne</code> та <code class=\"gatsby-code-text\">ComponentTwo</code>, а також всі їхні нащадки матимуть перевірки.</p>\n<p><code class=\"gatsby-code-text\">StrictMode</code> наразі допомагає в:</p>\n<ul>\n<li><a href=\"#identifying-unsafe-lifecycles\">Ідентифікації компонентів з небезпечними методами життєвого циклу</a></li>\n<li><a href=\"#warning-about-legacy-string-ref-api-usage\">Попередженні про використання застарілого API рядкових рефів</a></li>\n<li><a href=\"#warning-about-deprecated-finddomnode-usage\">Попередженні про використання застарілого виклику findDOMNode</a></li>\n<li><a href=\"#detecting-unexpected-side-effects\">Виявленні несподіваних побічних ефектів</a></li>\n<li><a href=\"#detecting-legacy-context-api\">Виявленні застарілого контекстного API</a></li>\n</ul>\n<p>Додаткова функціональність буде додана в майбутніх релізах React.</p>\n<h3 id=\"identifying-unsafe-lifecycles\"><a href=\"#identifying-unsafe-lifecycles\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Ідентифікація небезпечних методів життєвого циклу </h3>\n<p><a href=\"/blog/2018/03/27/update-on-async-rendering.html\">В цій статті</a> пояснюється, чому деякі застарілі методи життєвого циклу є небезбечними для використання в асинхронних React-додатках. Проте може бути важко проконтролювати використання цих методів життєвого циклу, якщо ваш додаток використовує сторонні бібліотеки. На щастя, суворий режим може допомогти в цьому випадку!</p>\n<p>Коли увімкнено суворий режим, то React створює список всіх класових компонентів, які використовують небезпечні методи життєвого циклу, та виводить попередження з інформацією про ці компоненти, наприклад:</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/e4fdbff774b356881123e69ad88eda88/1628f/strict-mode-unsafe-lifecycles-warning.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 840px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 13.80952380952381%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAjElEQVQI112Oaw6CQAwGuf/RRBcJETWR8Fh5BNZkuUDHFkw0/pjka9NOm8jJIYcUSY87LkPOOXIpoa4R75G+h7aFpoFxhHWFGL9Y/SHBFlXA7Q7lFR4VdB5M5J977jqYJhgGlaq4qvaeoXPbMT1uJCHLWJwjFAUvFc/67ZznRPsmBGRZNixvWP6t//pvEpXgSjHsOOkAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"strict mode unsafe lifecycles warning\"\n        title=\"\"\n        src=\"/static/e4fdbff774b356881123e69ad88eda88/1e088/strict-mode-unsafe-lifecycles-warning.png\"\n        srcset=\"/static/e4fdbff774b356881123e69ad88eda88/65ed1/strict-mode-unsafe-lifecycles-warning.png 210w,\n/static/e4fdbff774b356881123e69ad88eda88/d10fb/strict-mode-unsafe-lifecycles-warning.png 420w,\n/static/e4fdbff774b356881123e69ad88eda88/1e088/strict-mode-unsafe-lifecycles-warning.png 840w,\n/static/e4fdbff774b356881123e69ad88eda88/1628f/strict-mode-unsafe-lifecycles-warning.png 1232w\"\n        sizes=\"(max-width: 840px) 100vw, 840px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>Вирішення проблем, знайдених суворим режимом, <em>сьогодні</em> спростить для вас отримання вигоди від паралельного рендеру у майбутніх релізах React.</p>\n<h3 id=\"warning-about-legacy-string-ref-api-usage\"><a href=\"#warning-about-legacy-string-ref-api-usage\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Попередження про використання застарілого API рядкових рефів </h3>\n<p>Раніше React надавав два способи управління рефами: застарілий API рядкових рефів та API функцій зворотнього виклику. Незважаючи на те, що API рядкових рефів був зручніший у використанні, він мав <a href=\"https://github.com/facebook/react/issues/1373\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">декілька недоліків</a> і тому ми офіційно рекомендували <a href=\"/docs/refs-and-the-dom.html#legacy-api-string-refs\">використовувати форму функції зворотнього виклику</a>.</p>\n<p>React версії 16.3 вводить третій варіант, який пропонує зручність рядкових рефів але без їхніх недоліків:\n<div class=\"gatsby-highlight\">\n        <pre class=\"gatsby-code-jsx\"><code><span class=\"token keyword\">class</span> <span class=\"token class-name\">MyComponent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>inputRef <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">createRef</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span>  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">ref</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>inputRef<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">;</span></span>  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">componentDidMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>inputRef<span class=\"token punctuation\">.</span>current<span class=\"token punctuation\">.</span><span class=\"token function\">focus</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span>  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre>\n        </div></p>\n<p>Оскільки об’єкти-рефи були додані значною мірою як заміна рядкових рефів, то суворий режим тепер попереджує про використання рядкових рефів.</p>\n<blockquote>\n<p><strong>Примітка:</strong></p>\n<p>Рефи-функції зворотнього виклику продовжують підтримуватись на додачу до нового API <code class=\"gatsby-code-text\">createRef</code>.</p>\n<p>Вам не потрібно заміняти рефи-функції зворотнього виклику у ваших компонентах. Вони трохи більш гнучкі і тому залишаться як просунута можливість.</p>\n</blockquote>\n<p><a href=\"/docs/refs-and-the-dom.html\">Дізнатись більше про новий API <code class=\"gatsby-code-text\">createRef</code> можна тут.</a></p>\n<h3 id=\"warning-about-deprecated-finddomnode-usage\"><a href=\"#warning-about-deprecated-finddomnode-usage\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Попередження про використання застарілого виклику findDOMNode </h3>\n<p>Колись React підтримував виклик <code class=\"gatsby-code-text\">findDOMNode</code> для пошуку DOM-вузла в дереві по вказаному екзепляру класа. Зазвичай вам це не потрібно, тому що ви можете <a href=\"/docs/refs-and-the-dom.html#creating-refs\">прикріпити реф безпосередньо до DOM-вузла</a>.</p>\n<p><code class=\"gatsby-code-text\">findDOMNode</code> також може бути застосований до класових компонентів, але це порушувало рівні абстракції, дозволяючи батьківському компоненту вимагати, щоб відбувся рендер певного дочірнього елементу. Це створює небезпеку рефакторингу, коли ви не можете змінити деталі реалізації компонента, тому що батьківський компонент може використовувати його DOM-вузол. <code class=\"gatsby-code-text\">findDOMNode</code> повертає лише перший дочірній елемент, але з використанням фрагментів компонент може рендерити декілька DOM-вузлів. <code class=\"gatsby-code-text\">findDOMNode</code> — це API одноразового читання, він повертає вам результат лише на момент, коли ви його викликаєте. Якщо дочірній компонент відрендерить інший вузол, то немає жодної можливості опрацювати цю зміну. Внаслідок цього <code class=\"gatsby-code-text\">findDOMNode</code> працював лише якщо компоненти завжди повертали єдиний DOM-вузол, що ніколи не змінювався.</p>\n<p>Замість цього ви можете зробити це явно, передавши реф у ваш компонент та далі в DOM з використанням <a href=\"/docs/forwarding-refs.html#forwarding-refs-to-dom-components\">перенаправлення рефів</a>.</p>\n<p>Ви також можете додати DOM-вузол обгортку у ваш компонент і прикріпити реф прямо до нього.</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">MyComponent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>wrapper <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">createRef</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span>  <span class=\"token punctuation\">}</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">ref</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>wrapper<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>children<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span></span>  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<blockquote>\n<p>Примітка:</p>\n<p>Можна використати CSS-атрибут <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/display#display_contents\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">display: contents</code></a>, якщо ви не хочете, щоб вузол був частиною розмітки.</p>\n</blockquote>\n<h3 id=\"detecting-unexpected-side-effects\"><a href=\"#detecting-unexpected-side-effects\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Виявлення несподіваних побічних ефектів </h3>\n<p>По суті, React виконує роботу в два етапи:</p>\n<ul>\n<li>Стадія <strong>рендеру</strong> визначає, які саме зміни потрібно зробити, наприклад в DOM. На цій стадії React викликає метод <code class=\"gatsby-code-text\">render</code> і потім порівнює результат з попереднім рендером.</li>\n<li>Стадія <strong>фіксації</strong> — це коли React застосовує будь-які зміни. У випадку React DOM — це стадія, коли React вставляє, оновлює та видаляє вузли DOM. На цій стадії React також викликає методи життєвого циклу, такі як <code class=\"gatsby-code-text\">componentDidMount</code> та <code class=\"gatsby-code-text\">componentDidUpdate</code>.</li>\n</ul>\n<p>Стадія фіксації зазвичай дуже швидка, але рендер може бути повільним. З цієї причини майбутній паралельний режим (який поки ще не увімкнений за замовчуванням) розбиває обсяг роботи рендеру на частини, призупиняючись і продовжуючи роботу, щоб запобігти блокуванню браузера. Це означає, що React перед фіксацією може викликати методи життєвого циклу стадії рендеру більше ніж один раз, або викликати їх та взагалі не зафіксувати зміни (через помилку або переривання вищого пріоритету).</p>\n<p>Методи життєвого циклу стадії рендеру включають наступні методи класового компоненту:</p>\n<ul>\n<li><code class=\"gatsby-code-text\">constructor</code></li>\n<li><code class=\"gatsby-code-text\">componentWillMount</code> (or <code class=\"gatsby-code-text\">UNSAFE_componentWillMount</code>)</li>\n<li><code class=\"gatsby-code-text\">componentWillReceiveProps</code> (or <code class=\"gatsby-code-text\">UNSAFE_componentWillReceiveProps</code>)</li>\n<li><code class=\"gatsby-code-text\">componentWillUpdate</code> (or <code class=\"gatsby-code-text\">UNSAFE_componentWillUpdate</code>)</li>\n<li><code class=\"gatsby-code-text\">getDerivedStateFromProps</code></li>\n<li><code class=\"gatsby-code-text\">shouldComponentUpdate</code></li>\n<li><code class=\"gatsby-code-text\">render</code></li>\n<li>Функції-оновлювачі стану компонента, що передаються першим аргументом в <code class=\"gatsby-code-text\">setState</code></li>\n</ul>\n<p>Оскільки наведені вище методи можуть бути викликані більше ніж один раз, то важливо, щоб вони не містили побічних ефектів. Ігнорування цього правила може привести до ряду проблем, включаючи витік пам’яті або недійсний стан додатку. На жаль, виявити ці проблеми може бути важко, оскільки вони часто бувають <a href=\"https://uk.wikipedia.org/wiki/%D0%94%D0%B5%D1%82%D0%B5%D1%80%D0%BC%D1%96%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">недетермінованими</a>.</p>\n<p>Суворий режим не може автоматично виявити побічні ефекти за вас, але він може допомогти їх помітити, роблячи їх більш детермінованими. Це досягається завдяки навмисному викликлу наступних функцій двічі:</p>\n<ul>\n<li>Методи <code class=\"gatsby-code-text\">constructor</code>, <code class=\"gatsby-code-text\">render</code>, and <code class=\"gatsby-code-text\">shouldComponentUpdate</code> класового компонента</li>\n<li>Статичний метод класового компонента <code class=\"gatsby-code-text\">getDerivedStateFromProps</code></li>\n<li>Тіло функціонального компонента</li>\n<li>Функції-оновлювачі стана компонента, що передаються першим аргументом у <code class=\"gatsby-code-text\">setState</code></li>\n<li>Функції, передані в <code class=\"gatsby-code-text\">useState</code>, <code class=\"gatsby-code-text\">useMemo</code>, or <code class=\"gatsby-code-text\">useReducer</code></li>\n</ul>\n<blockquote>\n<p>Примітка:</p>\n<p>Це застосовується лиже в режимі розробки. <em>Методи життєвого циклу ніколи не будуть викликані двічі в продакшн-режимі.</em></p>\n</blockquote>\n<p>Для прикладу, розглянемо наступний код:\n<div class=\"gatsby-highlight\">\n        <pre class=\"gatsby-code-jsx\"><code><span class=\"token keyword\">class</span> <span class=\"token class-name\">TopLevelRoute</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    SharedApplicationState<span class=\"token punctuation\">.</span><span class=\"token function\">recordEvent</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ExampleComponent'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre>\n        </div></p>\n<p>На перший погляд він не здається проблематичним. Але якщо метод <code class=\"gatsby-code-text\">SharedApplicationState.recordEvent</code> не <a href=\"https://uk.wikipedia.org/wiki/%D0%86%D0%B4%D0%B5%D0%BC%D0%BF%D0%BE%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D1%96%D1%81%D1%82%D1%8C\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ідемпотентний</a>, то створення багатьох екземплярів цього компонента може призвести до недійсного стану додатку. Такий тип витончених помилок може не проявляти себе під час розробки або робити це непослідовно і тому може залишитися не поміченим.</p>\n<p>Суворий режим робить подібні патерни більш помітними, навмисно двічі викликаючи методи, такі як конструктор компонента.</p>\n<h3 id=\"detecting-legacy-context-api\"><a href=\"#detecting-legacy-context-api\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Виявлення застарілого контекстного API </h3>\n<p>Використання застарілого контекстного API часто призводило до помилок, тому він буде видалений в майбутній мажорній версії React. Він все ще працює в усіх релізах версії 16.x, але показуватиме це попередження у суворому режимі:</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/fca5c5e1fb2ef2e2d59afb100b432c12/51800/warn-legacy-context-in-strict-mode.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 840px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 18.57142857142857%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAsklEQVQI1z2O226DMBBE+f8/axM3JGkL+AakkEixcUxfK2aybqVKR0c7LztT/eiGR4X3muqFpzfWe1jNwdEbOk0nNhg8ppFjD9uxt5wuWLNQId6hm023YnyeYdptidsjbakYhQXpF7nzozhFxIAlVPSWX0P5d5s5Txw8Lz2lYex5ndE18BbewGlIs2DaEmWL01U8qHSqxUHtlo9zqlU87IN6DV2zXmd+r38LCzmX5v+45iddvdtOYuXXpwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"warn legacy context in strict mode\"\n        title=\"\"\n        src=\"/static/fca5c5e1fb2ef2e2d59afb100b432c12/1e088/warn-legacy-context-in-strict-mode.png\"\n        srcset=\"/static/fca5c5e1fb2ef2e2d59afb100b432c12/65ed1/warn-legacy-context-in-strict-mode.png 210w,\n/static/fca5c5e1fb2ef2e2d59afb100b432c12/d10fb/warn-legacy-context-in-strict-mode.png 420w,\n/static/fca5c5e1fb2ef2e2d59afb100b432c12/1e088/warn-legacy-context-in-strict-mode.png 840w,\n/static/fca5c5e1fb2ef2e2d59afb100b432c12/51800/warn-legacy-context-in-strict-mode.png 1196w\"\n        sizes=\"(max-width: 840px) 100vw, 840px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>Ознайомтесь з <a href=\"/docs/context.html\">документацією нового контекстного API</a> для спрощення переходу на нову версію.</p>","frontmatter":{"title":"Суворий режим","next":null,"prev":null},"fields":{"path":"content/docs/strict-mode.md","slug":"docs/strict-mode.html"}}},"pageContext":{"slug":"docs/strict-mode.html"}},"staticQueryHashes":[]}