{"componentChunkName":"component---src-templates-blog-js","path":"/blog/2018/10/23/react-v-16-6.html","result":{"data":{"markdownRemark":{"html":"<p>Сегодня мы выпускаем React 16.6 с несколькими новыми удобными возможностями: версию PureComponent/shouldComponentUpdate для функциональных компонентов, способ разделения кода при помощи Suspense и упрощённый доступ к контексту из классовых компонентов.</p>\n<p>Полный список изменений <a href=\"#changelog\">описан далее в посте</a>.</p>\n<h2 id=\"reactmemo\"><a href=\"#reactmemo\" 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><a href=\"/docs/react-api.html#reactmemo\"><code class=\"gatsby-code-text\">React.memo</code></a> </h2>\n<p>Классовые компоненты при помощи <a href=\"/docs/react-api.html#reactpurecomponent\"><code class=\"gatsby-code-text\">PureComponent</code></a> или <a href=\"/docs/react-component.html#shouldcomponentupdate\"><code class=\"gatsby-code-text\">shouldComponentUpdate</code></a> могут останавливать рендеринг, если пропсы не изменились. Теперь это доступно и в функциональных компонентах, если обернуть их в <a href=\"/docs/react-api.html#reactmemo\"><code class=\"gatsby-code-text\">React.memo</code></a>.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">const</span> MyComponent <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">memo</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token function\">MyComponent</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 comment\">/* повторный рендер пройдёт только при изменении пропсов */</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"reactlazy-code-splitting-with-suspense\"><a href=\"#reactlazy-code-splitting-with-suspense\" 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><a href=\"/docs/code-splitting.html#reactlazy\"><code class=\"gatsby-code-text\">React.lazy</code></a>: разделение кода при помощи <code class=\"gatsby-code-text\">Suspense</code> </h2>\n<p>Возможно, вы уже видели <a href=\"/blog/2018/03/01/sneak-peek-beyond-react-16.html\">доклад Дэна о React Suspense(задержке) на JSConf Iceland</a>. Теперь можно использовать компонент Suspense для <a href=\"/docs/code-splitting.html#reactlazy\">разделения кода</a> — нужно просто обернуть динамический импорт в <code class=\"gatsby-code-text\">React.lazy()</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>lazy<span class=\"token punctuation\">,</span> Suspense<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> OtherComponent <span class=\"token operator\">=</span> <span class=\"token function\">lazy</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">import</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./OtherComponent'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">MyComponent</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><span class=\"token class-name\">Suspense</span></span> <span class=\"token attr-name\">fallback</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><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 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 punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">OtherComponent</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Suspense</span></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></div>\n<p>Компонент Suspense также даст возможность авторам библиотек в дальнейшем реализовать подгрузку данных с задержкой.</p>\n<blockquote>\n<p>Примечание: эта функциональность пока не доступна для серверного рендеринга. Задержка будет добавлена в будущих релизах.</p>\n</blockquote>\n<h2 id=\"static-contexttype\"><a href=\"#static-contexttype\" 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><a href=\"/docs/context.html#classcontexttype\"><code class=\"gatsby-code-text\">static contextType</code></a> </h2>\n<p>В <a href=\"/blog/2018/03/29/react-v-16-3.html\">React 16.3</a> мы представили официальный API для контекста, который заменит <a href=\"/docs/legacy-context.html\">устаревший</a>.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">const</span> MyContext <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">createContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Мы учли отзывы про сложности использования нового API рендер-пропсов в классовых компонентах. Поэтому добавили удобный API для <a href=\"/docs/context.html#classcontexttype\">получения значений контекста из классовых компонентов</a>.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">MyClass</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 keyword\">static</span> contextType <span class=\"token operator\">=</span> MyContext<span class=\"token punctuation\">;</span>\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=\"token keyword\">let</span> value <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>context<span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">/* выполнить побочный эффект при монтировании, взяв значение из MyContext */</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token function\">componentDidUpdate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> value <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>context<span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">/* ... */</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token function\">componentWillUnmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> value <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>context<span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">/* ... */</span>\n  <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=\"token keyword\">let</span> value <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>context<span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">/* отрендерить что-нибудь, основываясь на значении из контекста */</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"static-getderivedstatefromerror\"><a href=\"#static-getderivedstatefromerror\" 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><a href=\"/docs/react-component.html#static-getderivedstatefromerror\"><code class=\"gatsby-code-text\">static getDerivedStateFromError()</code></a> </h2>\n<p>React 16 впервые представил <a href=\"/blog/2017/07/26/error-handling-in-react-16.html\">предохранители</a> — механизм обработки ошибок, выброшенных при рендере. У нас уже есть метод жизненного цикла, вызываемый после возникновения ошибок, — <code class=\"gatsby-code-text\">componentDidCatch</code> — он отлично подходит для отправки логов ошибок на сервер. Плюс к этому, с его помощью можно вызвать <code class=\"gatsby-code-text\">setState</code> и показать другой UI.</p>\n<p>До вызова этого метода мы рендерим <code class=\"gatsby-code-text\">null</code> в точке дерева, где произошла ошибка. Иногда родительские компоненты бывают не готовы к исчезновению рефов на дочерние компоненты и ломаются. Восстановиться после ошибки на сервере также нельзя, потому что <code class=\"gatsby-code-text\">Did</code>-методы жизненного цикла при серверном рендере не вызываются.</p>\n<p>Мы добавили новый метод для рендера запасного UI до момента, пока не завершится полный рендер. Подробнее о <a href=\"/docs/react-component.html#static-getderivedstatefromerror\"><code class=\"gatsby-code-text\">getDerivedStateFromError()</code></a> вы можете почитать в документации.</p>\n<blockquote>\n<p>Примечание: <code class=\"gatsby-code-text\">getDerivedStateFromError()</code> пока что не работает в серверном рендере. Мы выпустили его в таком сыром виде, чтобы вы пораньше с ним освоились и подготовились к релизу, в котором метод заработает и на сервере.</p>\n</blockquote>\n<h2 id=\"deprecations-in-strictmode\"><a href=\"#deprecations-in-strictmode\" 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 в StrictMode </h2>\n<p>В <a href=\"/blog/2018/03/29/react-v-16-3.html#strictmode-component\">версии 16.3</a> мы представили компонент <a href=\"/docs/strict-mode.html\"><code class=\"gatsby-code-text\">StrictMode</code></a>, который позволяет выводить предупреждения, если в коде используются конструкции, которые в будущем могут вызвать проблемы.</p>\n<p>Мы добавили ещё два API в список устаревших API <code class=\"gatsby-code-text\">StrictMode</code>. Не беспокойтесь: если вы не используете <code class=\"gatsby-code-text\">StrictMode</code>, эти предупреждения у вас не появятся.</p>\n<ul>\n<li><strong>ReactDOM.findDOMNode()</strong> — этот API-метод часто неправильно понимают, и в большинстве случаев он не нужен. К тому же, он может сильно тормозить в React 16. В <a href=\"/docs/strict-mode.html#warning-about-deprecated-finddomnode-usage\">документации</a> мы описали, чем можно его заменить.</li>\n<li><strong>Legacy Context</strong> — contextTypes и getChildContext слегка замедляют React и добавляют ему лишней громоздкости. Так что мы настоятельно рекомендуем вам перейти на <a href=\"/docs/context.html\">новый API контекста</a>. Мы надеемся, что новый API <a href=\"/docs/context.html#classcontexttype\"><code class=\"gatsby-code-text\">contextType</code></a> упростит вам переход.</li>\n</ul>\n<p>Если у вас возникнут трудности с обновлением, пожалуйста, дайте нам знать.</p>\n<h2 id=\"installation\"><a href=\"#installation\" 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>Установка </h2>\n<p>React v16.6.0 уже доступен в реестре npm.</p>\n<p>Чтобы установить React 16 при помощи yarn, запустите:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">yarn</span> <span class=\"token function\">add</span> react@^16.6.0 react-dom@^16.6.0</code></pre></div>\n<p>Чтобы установить React 16 при помощи npm, запустите:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save react@^16.6.0 react-dom@^16.6.0</code></pre></div>\n<p>Также мы даём возможность скачивать UMD-сборки React через CDN:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"gatsby-code-html\"><code class=\"gatsby-code-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">crossorigin</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>https://unpkg.com/react@16/umd/react.production.min.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">crossorigin</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>https://unpkg.com/react-dom@16/umd/react-dom.production.min.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p><a href=\"/docs/installation.html\">Подробнее об установке</a> вы можете узнать в документации.</p>\n<h2 id=\"changelog\"><a href=\"#changelog\" 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>Список изменений </h2>\n<h3 id=\"react\"><a href=\"#react\" 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>React </h3>\n<ul>\n<li>Добавлен <code class=\"gatsby-code-text\">React.memo()</code> в качестве альтернативы <code class=\"gatsby-code-text\">PureComponent</code> для функциональных компонентов. (<a href=\"https://github.com/acdlite\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@acdlite</a> в <a href=\"https://github.com/facebook/react/pull/13748\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13748</a>)</li>\n<li>Добавлен <code class=\"gatsby-code-text\">React.lazy()</code> для компонентов с разделением кода. (<a href=\"https://github.com/acdlite\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@acdlite</a> в <a href=\"https://github.com/facebook/react/pull/13885\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13885</a>)</li>\n<li><code class=\"gatsby-code-text\">React.StrictMode</code> теперь предупреждает об устаревшем API контекста. (<a href=\"https://github.com/bvaughn\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@bvaughn</a> в <a href=\"https://github.com/facebook/react/pull/13760\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13760</a>)</li>\n<li><code class=\"gatsby-code-text\">React.StrictMode</code> теперь предупреждает о <code class=\"gatsby-code-text\">findDOMNode</code>. (<a href=\"https://github.com/sebmarkbage\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@sebmarkbage</a> в <a href=\"https://github.com/facebook/react/pull/13841\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13841</a>)</li>\n<li><code class=\"gatsby-code-text\">unstable_AsyncMode</code> переименован в <code class=\"gatsby-code-text\">unstable_ConcurrentMode</code>. (<a href=\"https://github.com/trueadm\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@trueadm</a> в <a href=\"https://github.com/facebook/react/pull/13732\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13732</a>)</li>\n<li><code class=\"gatsby-code-text\">unstable_Placeholder</code> переименован в <code class=\"gatsby-code-text\">Suspense</code>, а <code class=\"gatsby-code-text\">delayMs</code> — в <code class=\"gatsby-code-text\">maxDuration</code>. (<a href=\"https://github.com/gaearon\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@gaearon</a> в <a href=\"https://github.com/facebook/react/pull/13799\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13799</a> и <a href=\"https://github.com/sebmarkbage\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@sebmarkbage</a> в <a href=\"https://github.com/facebook/react/pull/13922\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13922</a>)</li>\n</ul>\n<h3 id=\"react-dom\"><a href=\"#react-dom\" 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>React DOM </h3>\n<ul>\n<li>Добавлен более удобный способ подписки на контекст из классов — <code class=\"gatsby-code-text\">contextType</code>. (<a href=\"https://github.com/bvaughn\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@bvaughn</a> в <a href=\"https://github.com/facebook/react/pull/13728\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13728</a>)</li>\n<li>Добавлен метод жизненного цикла для отлова ошибок в новом асинхронном серверном рендерере <code class=\"gatsby-code-text\">getDerivedStateFromError</code>. (<a href=\"https://github.com/bvaughn\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@bvaughn</a> в <a href=\"https://github.com/facebook/react/pull/13746\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13746</a>)</li>\n<li>Теперь выводится предупреждение, когда вместо <code class=\"gatsby-code-text\">&lt;Context.Consumer&gt;</code> используется <code class=\"gatsby-code-text\">&lt;Context&gt;</code>. (<a href=\"https://github.com/trueadm\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@trueadm</a> в <a href=\"https://github.com/facebook/react/pull/13829\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13829</a>)</li>\n<li>Исправлен серый оверлей в iOS Safari. (<a href=\"https://github.com/philipp-spiess\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@philipp-spiess</a> в <a href=\"https://github.com/facebook/react/pull/13778\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13778</a>)</li>\n<li>Исправлен баг, вызываемый перезаписью <code class=\"gatsby-code-text\">window.event</code> в режиме разработки. (<a href=\"https://github.com/sergei-startsev\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@sergei-startsev</a> в <a href=\"https://github.com/facebook/react/pull/13697\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13697</a>)</li>\n</ul>\n<h3 id=\"react-dom-server\"><a href=\"#react-dom-server\" 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>React DOM Server </h3>\n<ul>\n<li>Добавлена поддержка <code class=\"gatsby-code-text\">React.memo()</code>. (<a href=\"https://github.com/alexmckenley\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@alexmckenley</a> в <a href=\"https://github.com/facebook/react/pull/13855\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13855</a>)</li>\n<li>Добавлена поддержка <code class=\"gatsby-code-text\">contextType</code>. (<a href=\"https://github.com/alexmckenley\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@alexmckenley</a> и <a href=\"https://github.com/sebmarkbage\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@sebmarkbage</a> в <a href=\"https://github.com/facebook/react/pull/13889\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13889</a>)</li>\n</ul>\n<h3 id=\"scheduler-experimental\"><a href=\"#scheduler-experimental\" 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<ul>\n<li>Пакет переименован в <code class=\"gatsby-code-text\">scheduler</code>. (<a href=\"https://github.com/gaearon\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@gaearon</a> в <a href=\"https://github.com/facebook/react/pull/13683\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13683</a>)</li>\n<li>Добавлена поддержка продолжений, обёрнутых колбэков и уровней приоритета. (<a href=\"https://github.com/acdlite\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@acdlite</a> в <a href=\"https://github.com/facebook/react/pull/13720\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13720</a> и <a href=\"https://github.com/facebook/react/pull/13842\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13842</a>)</li>\n<li>Улучшен механизм запасного планировщика в среде без DOM. (<a href=\"https://github.com/acdlite\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@acdlite</a> в <a href=\"https://github.com/facebook/react/pull/13740\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13740</a>)</li>\n<li><code class=\"gatsby-code-text\">requestAnimationFrame</code> теперь принудительно выполняется в начале фрейма. (<a href=\"https://github.com/acdlite\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@acdlite</a> в <a href=\"https://github.com/facebook/react/pull/13785\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13785</a>)</li>\n<li>Добавлена более тщательная проверка на наличие DOM. (<a href=\"https://github.com/trueadm\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@trueadm</a> в <a href=\"https://github.com/facebook/react/pull/13731\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13731</a>)</li>\n<li>Исправлены баги счётчика взамодействий. (<a href=\"https://github.com/bvaughn\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@bvaughn</a> в <a href=\"https://github.com/facebook/react/pull/13590\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13590</a>)</li>\n<li>В пакет добавлена <code class=\"gatsby-code-text\">envify</code>-трансформация кода. (<a href=\"https://github.com/mridgway\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@mridgway</a> in <a href=\"https://github.com/facebook/react/pull/13766\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#13766</a>)</li>\n</ul>","excerpt":"Сегодня мы выпускаем React 16.6 с несколькими новыми удобными возможностями: версию PureComponent/shouldComponentUpdate для функциональных компонентов, способ разделения кода при помощи Suspense и упрощённый доступ к контексту из классовых компонентов. Полный список изменений описан далее в посте.   Классовые компоненты при помощи  или  могут останавливать рендеринг, если пропсы не изменились. Теперь это доступно и в функциональных компонентах, если обернуть их в . : разделение кода при помощи…","frontmatter":{"title":"React v16.6.0: lazy, memo и contextType","next":null,"prev":null,"author":[{"frontmatter":{"name":"Sebastian Markbåge","url":"https://twitter.com/sebmarkbage"}}]},"fields":{"date":"23 октября, 2018","path":"content/blog/2018-10-23-react-v-16-6.md","slug":"/blog/2018/10/23/react-v-16-6.html"}},"allMarkdownRemark":{"edges":[{"node":{"frontmatter":{"title":"Introducing the New JSX Transform"},"fields":{"slug":"/blog/2020/09/22/introducing-the-new-jsx-transform.html"}}},{"node":{"frontmatter":{"title":"React v17.0 Release Candidate: No New Features"},"fields":{"slug":"/blog/2020/08/10/react-v17-rc.html"}}},{"node":{"frontmatter":{"title":"React v16.13.0"},"fields":{"slug":"/blog/2020/02/26/react-v16.13.0.html"}}},{"node":{"frontmatter":{"title":"Building Great User Experiences with Concurrent Mode and Suspense"},"fields":{"slug":"/blog/2019/11/06/building-great-user-experiences-with-concurrent-mode-and-suspense.html"}}},{"node":{"frontmatter":{"title":"Preparing for the Future with React Prereleases"},"fields":{"slug":"/blog/2019/10/22/react-release-channels.html"}}},{"node":{"frontmatter":{"title":"Introducing the New React DevTools"},"fields":{"slug":"/blog/2019/08/15/new-react-devtools.html"}}},{"node":{"frontmatter":{"title":"React v16.9.0 and the Roadmap Update"},"fields":{"slug":"/blog/2019/08/08/react-v16.9.0.html"}}},{"node":{"frontmatter":{"title":"А React уже переведён? ¡Sí! Sim! はい！"},"fields":{"slug":"/blog/2019/02/23/is-react-translated-yet.html"}}},{"node":{"frontmatter":{"title":"React v16.8: The One With Hooks"},"fields":{"slug":"/blog/2019/02/06/react-v16.8.0.html"}}},{"node":{"frontmatter":{"title":"React v16.7: No, This Is Not the One With Hooks"},"fields":{"slug":"/blog/2018/12/19/react-v-16-7.html"}}}]}},"pageContext":{"slug":"/blog/2018/10/23/react-v-16-6.html"}},"staticQueryHashes":[]}