{"id":339649,"date":"2022-10-13T15:00:28","date_gmt":"2022-10-13T15:00:28","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=339649"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=339649","title":{"rendered":"<span>React, \u044f \u043b\u044e\u0431\u043b\u044e \u0442\u0435\u0431\u044f, \u043d\u043e \u0442\u044b \u0441\u0432\u043e\u0434\u0438\u0448\u044c \u043c\u0435\u043d\u044f \u0441 \u0443\u043c\u0430<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/jc\/hw\/st\/jchwst6a3nwlxlscnmuw5tdhmry.png\" data-src=\"https:\/\/habrastorage.org\/webt\/jc\/hw\/st\/jchwst6a3nwlxlscnmuw5tdhmry.png\"\/>  <\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f!<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 <a href=\"https:\/\/marmelab.com\/blog\/2022\/09\/20\/react-i-love-you.html\">\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>, \u0432\u044b\u0437\u044b\u0432\u0430\u0432\u0448\u0435\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u043e\u043d\u0430\u043d\u0441 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 <code>React-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u0440\u043e\u0433\u043e\u0439 <a href=\"https:\/\/reactjs.org\/\">React<\/a>, \u043c\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u043c\u0441\u044f \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 10 \u043b\u0435\u0442. \u041c\u044b \u043f\u0440\u043e\u0448\u043b\u0438 <a href=\"https:\/\/marmelab.com\/react-admin\/\">\u0434\u043e\u043b\u0433\u0438\u0439 \u043f\u0443\u0442\u044c<\/a> \u0432\u043c\u0435\u0441\u0442\u0435. \u041d\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0432\u044b\u0448\u043b\u0430 \u0438\u0437-\u043f\u043e\u0434 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"ty-byl-edinstvennym\">\u0422\u044b \u0431\u044b\u043b \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c<\/h2>\n<p>  <\/p>\n<p>\u0422\u044b \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u043f\u0435\u0440\u0432\u044b\u0439. \u0414\u043e \u0442\u0435\u0431\u044f \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u0438 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0441 <code>jQuery<\/code>, <code>Backbone<\/code> \u0438 <code>Angular<\/code>. \u042f \u0437\u043d\u0430\u043b, \u0447\u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430: \u043b\u0443\u0447\u0448\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438 \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0444\u0440\u0443\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0432 \u0443\u0433\u043e\u0434\u0443 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0442\u0435\u0431\u044f \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b, \u044f \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u0432 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f\u0445 \u0441 <a href=\"https:\/\/angular.io\/\">Angular<\/a>. \u042f \u0431\u044b\u043b \u0438\u0437\u043c\u043e\u0442\u0430\u043d <code>watch<\/code> \u0438 <code>digest<\/code>, \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u044f \u0443\u0436\u0435 \u043e <code>scope<\/code>. \u042f \u0438\u0441\u043a\u0430\u043b \u0442\u043e, \u0447\u0442\u043e \u043d\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e \u0431\u044b \u043c\u0435\u043d\u044f \u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u044b\u043c.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0431\u044b\u043b\u0430 \u043b\u044e\u0431\u043e\u0432\u044c \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430. \u0422\u0432\u043e\u0435 <a href=\"https:\/\/reactjs.org\/docs\/thinking-in-react.html#step-5-add-inverse-data-flow\">\u043e\u0434\u043d\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/a> \u0431\u044b\u043b\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0441\u0432\u0435\u0436\u0430\u044e\u0449\u0438\u043c \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u044f \u0437\u043d\u0430\u043b. \u0426\u0435\u043b\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043b\u044f \u0442\u0435\u0431\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430. \u0422\u044b \u0431\u044b\u043b \u0447\u0438\u0441\u0442\u044b\u043c <code>JavaScript<\/code>, \u0430 \u043d\u0435 \u0435\u0433\u043e \u0436\u0430\u043b\u043a\u0438\u043c \u043f\u043e\u0434\u043e\u0431\u0438\u0435\u043c, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 <code>HTML<\/code>. \u0423 \u0442\u0435\u0431\u044f \u0431\u044b\u043b\u0430 \u0432\u0435\u0449\u044c \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c &#171;\u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442&#187;, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u0439, \u0447\u0442\u043e \u0432\u0441\u0435 \u043d\u0430 \u0442\u0435\u0431\u044f \u0437\u0430\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438\u0441\u044c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/fq\/u3\/rf\/fqu3rfvc8o6lpmwjpxnwap8addq.png\" data-src=\"https:\/\/habrastorage.org\/webt\/fq\/u3\/rf\/fqu3rfvc8o6lpmwjpxnwap8addq.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043d\u044f\u0442\u044c \u0442\u0435\u0431\u044f \u0431\u044b\u043b\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e. \u041c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0430\u043c\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0430\u0434\u0438\u0442\u044c \u0441 \u0442\u043e\u0431\u043e\u0439, \u043d\u043e \u044d\u0442\u043e \u0442\u043e\u0433\u043e \u0441\u0442\u043e\u0438\u043b\u043e! \u041f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u044f \u0431\u044b\u043b \u0442\u0430\u043a \u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432 \u0441 \u0442\u043e\u0431\u043e\u0439, \u0447\u0442\u043e \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043e \u0442\u0435\u0431\u0435 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0438\u043c.<\/p>\n<p>  <\/p>\n<h2 id=\"geroi-novyh-form\">\u0413\u0435\u0440\u043e\u0438 \u043d\u043e\u0432\u044b\u0445 \u0444\u043e\u0440\u043c<\/h2>\n<p>  <\/p>\n<p>\u0421\u0442\u0440\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0447\u0430\u043b\u0438\u0441\u044c, \u043a\u043e\u0433\u0434\u0430 \u044f \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u0442\u0435\u0431\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0444\u043e\u0440\u043c\u044b. \u041d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c <code>JS<\/code> \u0441 \u0444\u043e\u0440\u043c\u0430\u043c\u0438 \u0438 \u0438\u043d\u043f\u0443\u0442\u0430\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u0430 <code>React<\/code> \u2014 \u0435\u0449\u0435 <em>\u0441\u043b\u043e\u0436\u043d\u0435\u0435<\/em>.<\/p>\n<p>  <\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 <a href=\"https:\/\/reactjs.org\/docs\/uncontrolled-components.html\">\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u043c\u0438 \u0438 \u043d\u0435\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u043c\u0438 \u0438\u043d\u043f\u0443\u0442\u0430\u043c\u0438<\/a>. \u041e\u0431\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u0438 \u0431\u0430\u0433\u0438 \u0432 \u043f\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445. \u041d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0431\u043e\u0440? \u0414\u0432\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u2014 \u044d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e.<\/p>\n<p>  <\/p>\n<p>&#171;\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u043c&#187; \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u044b. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">import React, { useState } from 'react';  export default () => {     const [a, setA] = useState(1);     const [b, setB] = useState(2);      function handleChangeA(event) {         setA(+event.target.value);     }      function handleChangeB(event) {         setB(+event.target.value);     }      return (         &lt;div>             &lt;input type=\"number\" value={a} onChange={handleChangeA} \/>             &lt;input type=\"number\" value={b} onChange={handleChangeB} \/>              &lt;p>                 {a} + {b} = {a + b}             &lt;\/p>         &lt;\/div>     ); };<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0435\u0441\u043b\u0438 \u0431\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u044f \u0431\u044b\u043b \u0431\u044b \u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432. \u041d\u043e \u0438-\u0437\u0430 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u044b \u0441 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0435\u0439, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u0438\u043d\u043f\u0443\u0442\u0430\u043c\u0438 \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445, \u044f \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u043e\u0440\u043c\u0430\u043c\u0438. \u041a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043d\u0438\u0445 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/redux-form.com\/8.3.0\/\">Redux-form<\/a> \u0431\u044b\u043b\u0430 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <code>Redux<\/code>, \u043d\u043e \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0435\u0435 \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u043e\u043a\u0438\u043d\u0443\u043b \u043f\u0440\u043e\u0435\u043a\u0442, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439<\/li>\n<li><a href=\"https:\/\/final-form.org\/react\/\">React-final-form<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0433\u043e\u0432 \u0438\u2026 \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043d\u043e\u0432\u0430 \u0443\u0448\u0435\u043b. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u044f \u0441\u0442\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c<\/li>\n<li><a href=\"https:\/\/formik.org\/\">Formik<\/a>, \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0435, \u043d\u043e \u0442\u044f\u0436\u0435\u043b\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0435 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0444\u043e\u0440\u043c \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c<\/li>\n<li><a href=\"https:\/\/react-hook-form.com\/\">React-hook-form<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0439, \u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u0431\u0430\u0433\u0438 \u0438 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u043d\u0430 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043c\u043d\u043e\u0433\u0438\u0445 \u043b\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u043e\u0440\u043c\u0430\u043c\u0438 \u0432 <code>React<\/code>, \u044f \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0435 \u0437\u043d\u0430\u044e, \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. \u041a\u043e\u0433\u0434\u0430 \u044f \u0441\u043c\u043e\u0442\u0440\u044e \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0444\u043e\u0440\u043c\u0430\u043c\u0438 <a href=\"https:\/\/svelte.dev\/blog\/write-less-code\">Svelte<\/a>, \u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e \u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0432 <code>React<\/code> \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f. \u0412\u0437\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"html\">&lt;script>     let a = 1;     let b = 2; &lt;\/script>  &lt;input type=\"number\" bind:value={a}> &lt;input type=\"number\" bind:value={b}>  &lt;p>{a} + {b} = {a + b}&lt;\/p><\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"ty-slishkom-chuvstvitelen-k-kontekstu\">\u0422\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d \u043a \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443<\/h2>\n<p>  <\/p>\n<p>\u0412\u0441\u043a\u043e\u0440\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u0430, \u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b \u043c\u043d\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u0449\u0435\u043d\u043a\u0430 <a href=\"https:\/\/redux.js.org\/\">Redux<\/a>. \u0422\u044b \u043d\u0435 \u043c\u043e\u0433 \u043d\u0438\u043a\u0443\u0434\u0430 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u043f\u043e\u0439\u0442\u0438. \u041f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u044f \u043d\u0435 \u0432\u043e\u0437\u0440\u0430\u0436\u0430\u043b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043c\u0438\u043b\u043e. \u041d\u043e \u0432\u0441\u043a\u043e\u0440\u0435 \u044f \u043e\u0441\u043e\u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0433\u043e \u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0442\u0432\u043e\u0439 \u043c\u0438\u0440. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u043b\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u2014 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u0435 \u043c\u043e\u0433\u043b\u0438 \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u044b.<\/p>\n<p>  <\/p>\n<p>\u0422\u044b \u0442\u043e\u0436\u0435 \u044d\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u0438 \u0440\u0435\u0448\u0438\u043b \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 <code>Redux<\/code> \u0432 \u043f\u043e\u043b\u044c\u0437\u0443 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e <code>useContext<\/code>. \u041d\u043e \u0432 <code>useContext<\/code> \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c <code>Redux<\/code> \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043d\u0438\u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u043e\u0434\u0430 \u043d\u0435 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u044b \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ Redux const name = useSelector(state => state.user.name); \/\/ \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 React const { name } = useContext(UserContext);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u043d\u0443\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c\u0443 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0438\u043c\u0435\u043d\u0438. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u2014 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043b\u044e\u0431\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e. \u0414\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ \u042d\u0442\u043e \u0431\u0435\u0437\u0443\u043c\u0438\u0435, \u043d\u043e \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043d\u0438\u043a\u0430\u043a export const CoreAdminContext = (props) => {     const {         authProvider,         basename,         dataProvider,         i18nProvider,         store,         children,         history,         queryClient,     } = props;      return (         &lt;AuthContext.Provider value={authProvider}>             &lt;DataProviderContext.Provider value={dataProvider}>                 &lt;StoreContextProvider value={store}>                     &lt;QueryClientProvider client={queryClient}>                         &lt;AdminRouter history={history} basename={basename}>                             &lt;I18nContextProvider value={i18nProvider}>                                 &lt;NotificationContextProvider>                                     &lt;ResourceDefinitionContextProvider>                                         {children}                                     &lt;\/ResourceDefinitionContextProvider>                                 &lt;\/NotificationContextProvider>                             &lt;\/I18nContextProvider>                         &lt;\/AdminRouter>                     &lt;\/QueryClientProvider>                 &lt;\/StoreContextProvider>             &lt;\/DataProviderContext.Provider>         &lt;\/AuthContext.Provider>     ); };<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ju\/1j\/fz\/ju1jfzvnf5jvuzj0f5y-tl2atee.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/ju\/1j\/fz\/ju1jfzvnf5jvuzj0f5y-tl2atee.gif\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0447\u0430\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u042f \u043d\u0435 \u0445\u043e\u0447\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>useMemo()<\/code> \u0438 <code>useCallback()<\/code>. \u041b\u0438\u0448\u043d\u0438\u0435 \u0440\u0435\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0438 \u2014 \u044d\u0442\u043e \u0442\u0432\u043e\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0430 \u043d\u0435 \u043c\u043e\u044f. \u041d\u043e \u0442\u044b \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0448\u044c \u043c\u0435\u043d\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438, \u043a\u0430\u043a \u043c\u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0444\u043e\u0440\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ \u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: https:\/\/react-hook-form.com\/advanced-usage\/#FormProviderPerformance const NestedInput = memo(     ({ register, formState: { isDirty } }) => (         &lt;div>             &lt;input {...register('test')} \/>             {isDirty &amp;&amp; &lt;p>This field is dirty&lt;\/p>}         &lt;\/div>     ),     (prevProps, nextProps) =>         prevProps.formState.isDirty === nextProps.formState.isDirty, );  export const NestedInputContainer = ({ children }) => {     const methods = useFormContext();      return &lt;NestedInput {...methods} \/>; };<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0448\u043b\u043e \u043f\u043e\u0447\u0442\u0438 10 \u043b\u0435\u0442, \u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f. \u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c <code>useContextSelector()<\/code>?<\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, <a href=\"https:\/\/github.com\/reactjs\/rfcs\/pull\/118\">\u0442\u044b \u0437\u043d\u0430\u0435\u0448\u044c \u043e\u0431 \u044d\u0442\u043e\u043c<\/a>. \u041d\u043e \u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0448\u044c\u0441\u044f \u0447\u0435\u043c \u0443\u0433\u043e\u0434\u043d\u043e, \u043a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u0445\u043e\u0442\u044f, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u044d\u0442\u043e \u0442\u0432\u043e\u0435 \u0441\u0430\u043c\u043e\u0435 \u0443\u0437\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<h2 id=\"mne-ne-nuzhno-nichego-iz-etogo\">\u041c\u043d\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e<\/h2>\n<p>  <\/p>\n<p>\u0422\u044b \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u043b \u043c\u043d\u0435, \u0447\u0442\u043e \u044f \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0443\u0437\u043b\u0430\u043c <code>DOM<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. \u042f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u043b <code>DOM<\/code> \u0433\u0440\u044f\u0437\u043d\u044b\u043c (dirty), \u043d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0435\u0431\u044f \u044d\u0442\u043e \u0442\u0440\u0435\u0432\u043e\u0436\u0438\u043b\u043e, \u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c. \u0422\u0435\u043f\u0435\u0440\u044c \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <a href=\"https:\/\/en.reactjs.org\/docs\/refs-and-the-dom.html\">refs<\/a> (\u0441\u0441\u044b\u043b\u043a\u0438), \u043a\u0430\u043a \u0442\u044b \u043c\u0435\u043d\u044f \u043f\u0440\u043e\u0441\u0438\u043b.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u044d\u0442\u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0432\u0438\u0440\u0443\u0441. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0441\u044b\u043b\u043e\u043a \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c, \u043e\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0438\u0445 \u043f\u043e\u0442\u043e\u043c\u043a\u0430\u043c. \u0415\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <code>React<\/code>, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c (\u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c) \u0441\u0441\u044b\u043b\u043a\u0443 (forward ref) \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 \u0438 \u0442.\u0434. \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0435 \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>HTML<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u043e\u0433\u043b\u043e \u0431\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const MyComponent = (props) => &lt;div ref={props.ref}>Hello, {props.name}!&lt;\/div>;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c (\u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0435 abomination \u2014 \u043c\u0435\u0440\u0437\u043e\u0441\u0442\u044c) <code>React.forwardRef<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const MyComponent = React.forwardRef((props, ref) => (     &lt;div ref={ref}>Hello, {props.name}!&lt;\/div> ));<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0447\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430? \u2014 \u0441\u043f\u0440\u043e\u0441\u0438\u0448\u044c \u0442\u044b. \u0412 \u0442\u043e\u043c, \u0447\u0442\u043e <code>forwardRef()<\/code> (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <code>TypeScript<\/code>) <a href=\"https:\/\/stackoverflow.com\/questions\/58469229\/react-with-typescript-generics-while-using-react-forwardref\">\u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0435 (generic) \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ \u041a\u0430\u043a \u043c\u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435? const MyComponent = &lt;T>(props: &lt;ComponentProps&lt;T>) => (     &lt;div ref={\/* pass ref here *\/}>Hello, {props.name}!&lt;\/div> );<\/code><\/pre>\n<p>  <\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0442\u044b \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0438 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0443\u0437\u043b\u043e\u0432 <code>DOM<\/code>, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043e\u043c <code>this<\/code> \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445. \u0418\u043b\u0438, \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0441\u0441\u044b\u043b\u043a\u0430 \u2014 \u044d\u0442\u043e &#171;\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435 \u0432\u043b\u0435\u0447\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433&#187;. \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043c\u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 \u043f\u043e \u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u0447\u0442\u043e \u0442\u0432\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>useEffect()<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, <code>refs<\/code> \u2014 \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0431\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<p>  <\/p>\n<h2 id=\"effekt-babochki-v-originale-ispolzuetsya-igra-slov---the-butterfly-use-effect\">\u042d\u0444\u0444\u0435\u043a\u0442 \u0431\u0430\u0431\u043e\u0447\u043a\u0438 (\u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u0433\u0440\u0430 \u0441\u043b\u043e\u0432 \u2014 the butterfly (use) effect)<\/h2>\n<p>  <\/p>\n<p>\u0423 \u043c\u0435\u043d\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043a <code>useEffect()<\/code>. \u042f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e <code>useEffect()<\/code> \u2014 \u044d\u0442\u043e \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0443\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0440\u0430\u0437\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435. \u041d\u043e \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u043e\u043c?<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ \u043a\u043e\u043b\u0431\u0435\u043a \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 class MyComponent {     componentWillUnmount: () => {         \/\/ ...     }; }  \/\/ useEffect const MyComponent = () => {     useEffect(() => {         return () => {             \/\/ ...         };     }, []); };<\/code><\/pre>\n<p>  <\/p>\n<p><code>}, []);<\/code> \u2014 \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043c\u043d\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u0443\u0440\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u042f \u0432\u0438\u0436\u0443 \u044d\u0442\u0438 \u0437\u0430\u0433\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u043d\u0430\u0431\u043e\u0440\u044b \u043a\u0430\u0431\u0431\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u043e\u0435\u043c\u0443 \u043a\u043e\u0434\u0443. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0442\u044b \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0448\u044c \u043c\u0435\u043d\u044f \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u043c\u043e\u0435\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ \u041c\u0435\u043d\u044f\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 useEffect(() => {     if (         query.page &lt;= 0 ||         (!isFetching &amp;&amp; query.page > 1 &amp;&amp; data?.length === 0)     ) {         \/\/ \u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c `page` \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 `1`         queryModifiers.setPage(1);         return;     }     if (total == null) {         return;     }     const totalPages = Math.ceil(total \/ query.perPage) || 1;     if (!isFetching &amp;&amp; query.page > totalPages) {         \/\/ \u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 `page` \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b         \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435         queryModifiers.setPage(totalPages);     } }, [isFetching, query.page, query.perPage, data, queryModifiers, total]);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0438\u0434\u0438\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0441\u0442\u0440\u043e\u043a\u0443? \u042f \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u043b \u0432\u0441\u0435 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0410 \u043c\u043d\u0435 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Reference_counting\">\u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0441\u0441\u044b\u043b\u043e\u043a<\/a> (reference counting) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0441\u0435\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u043c \u043c\u0443\u0441\u043e\u0440\u0430. \u041d\u043e \u043d\u0435\u0442, \u044f \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u0441\u0430\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u044b \u043d\u0435 \u0443\u043c\u0435\u0435\u0448\u044c \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jf\/rc\/yk\/jfrcykgif3cusuzryadjfwh9n8w.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/jf\/rc\/yk\/jfrcykgif3cusuzryadjfwh9n8w.gif\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u0427\u0430\u0441\u0442\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0430\u044f \u043c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u044f. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u044b \u043d\u0435 \u0432\u0438\u0434\u0438\u0448\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043c\u0435\u0436\u0434\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439, \u043c\u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>useCallback()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0430\u043a\u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const handleClick = useCallback(     async event => {         event.persist();         const type =             typeof rowClick === 'function'                 ? await rowClick(id, resource, record)                 : rowClick;         if (type === false || type == null) {             return;         }         if (['edit', 'show'].includes(type)) {             navigate(createPath({ resource, id, type }));             return;         }         if (type === 'expand') {             handleToggleExpand(event);             return;         }         if (type === 'toggleSelection') {             handleToggleSelection(event);             return;         }         navigate(type);     },     [         \/\/ \u041e, \u0411\u043e\u0436\u0435, \u043d\u0435\u0442         rowClick,         id,         resource,         record,         navigate,         createPath,         handleToggleExpand,         handleToggleSelection,     ], );<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u043a\u043e\u043b\u0431\u0435\u043a\u0430\u043c\u0438 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u0443\u0447\u0435\u0439 \u0442\u0430\u0440\u0430\u0431\u0430\u0440\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u0438\u043c \u0430\u0434\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0410 \u0432\u0441\u0435 \u0438\u0437-\u0437\u0430 \u0442\u0432\u043e\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u044f \u0445\u043e\u0447\u0443 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0447\u0435\u0442\u0447\u0438\u043a, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0438 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0438, \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function Counter() {     const [count, setCount] = useState(0);      const handleClick = useCallback(() => {         setCount(count => count + 1);     }, [setCount]);      useEffect(() => {         const id = setInterval(() => {             setCount(count => count + 1);         }, 1000);         return () => clearInterval(id);     }, [setCount]);      useEffect(() => {         console.log('\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430:', count);     }, [count]);      return &lt;button onClick={handleClick}>Click Me&lt;\/button>; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b \u0442\u044b \u0437\u043d\u0430\u043b, \u043a\u0430\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u044f \u043c\u043e\u0433 \u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function Counter() {     const [count, setCount] = createSignal(0);      const handleClick = () => setCount(count() + 1);      const timer = setInterval(() => setCount(count() + 1), 1000);      onCleanup(() => clearInterval(timer));      createEffect(() => {         console.log('\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430:', count());     });      return &lt;button onClick={handleClick}>Click Me&lt;\/button>; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a \u0441\u043b\u043e\u0432\u0443, \u044d\u0442\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 <a href=\"https:\/\/www.solidjs.com\/\">Solid.js<\/a>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/6n\/ma\/zd\/6nmazdns6fvpfzuly1p-7ivdulg.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/6n\/ma\/zd\/6nmazdns6fvpfzuly1p-7ivdulg.gif\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u0443\u0434\u0440\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>useEffect()<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f <a href=\"https:\/\/overreacted.io\/a-complete-guide-to-useeffect\/\">53-\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430<\/a>. \u041f\u043e-\u043c\u043e\u0435\u043c\u0443, \u044d\u0442\u043e \u0443\u0436\u0430\u0441\u043d\u043e. \u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430, \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043b\u0438 \u044d\u0442\u043e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d?<\/p>\n<p>  <\/p>\n<h2 id=\"primi-reshenie-nakonec\">\u041f\u0440\u0438\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043d\u0430\u043a\u043e\u043d\u0435\u0446<\/h2>\n<p>  <\/p>\n<p>\u0422\u044b \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c <code>useEffect<\/code> \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b \u043c\u043d\u0435 <a href=\"https:\/\/github.com\/reactjs\/rfcs\/blob\/useevent\/text\/0000-useevent.md\">useEvent<\/a>, <a href=\"https:\/\/reactjs.org\/docs\/hooks-reference.html#useinsertioneffect\">useInsertionEffect<\/a>, <a href=\"https:\/\/reactjs.org\/docs\/hooks-reference.html#usedeferredvalue\">useDeferredValue<\/a>, <a href=\"https:\/\/reactjs.org\/docs\/hooks-reference.html#usesyncexternalstore\">useSyncExternalStore<\/a> \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0443\u043b\u043e\u0432\u043a\u0438.<\/p>\n<p>  <\/p>\n<p>\u041e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0442\u0435\u0431\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function subscribe(callback) {     window.addEventListener('online', callback);     window.addEventListener('offline', callback);     return () => {         window.removeEventListener('online', callback);         window.removeEventListener('offline', callback);     }; }  function useOnlineStatus() {     return useSyncExternalStore(         subscribe, \/\/ React \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0443\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438         () => navigator.onLine, \/\/ \u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435         () => true, \/\/ \u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435     ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u044d\u0442\u043e \u043f\u043e\u043c\u0430\u0434\u0430 \u043d\u0430 \u0441\u0432\u0438\u043d\u044c\u0435. \u0415\u0441\u043b\u0438 \u0431\u044b \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u0431\u044b\u043b\u043e \u043b\u0435\u0433\u0447\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0434\u0440\u0443\u0433\u0438\u0435 \u0445\u0443\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u044b \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0438\u0441\u044c.<\/p>\n<p>  <\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438: \u0442\u0435\u0431\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435. \u0414\u043b\u044f \u043b\u044e\u0434\u0435\u0439, \u0432\u0440\u043e\u0434\u0435 \u043c\u0435\u043d\u044f, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0445 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0435 \u043a\u043e\u0434\u043e\u0432\u044b\u0435 \u0431\u0430\u0437\u044b, \u044d\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0438\u043d\u0444\u043b\u044f\u0446\u0438\u044f <code>API<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0447\u043d\u044b\u043c \u043a\u043e\u0448\u043c\u0430\u0440\u043e\u043c. \u041d\u0435\u043f\u0440\u0435\u0441\u0442\u0430\u043d\u043d\u043e\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0441\u043c\u0435\u0442\u0438\u043a\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u044b \u043f\u044b\u0442\u0430\u0435\u0448\u044c\u0441\u044f \u0441\u043a\u0440\u044b\u0442\u044c.<\/p>\n<p>  <\/p>\n<h2 id=\"ty-slishkom-strogiy\">\u0422\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u0442\u0440\u043e\u0433\u0438\u0439<\/h2>\n<p>  <\/p>\n<p>\u0425\u0443\u043a\u0438 \u2014 \u044d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0438\u0434\u0435\u044f, \u043d\u043e \u043e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u044e \u0446\u0435\u043d\u0443. \u0418 \u044d\u0442\u0430 \u0446\u0435\u043d\u0430 \u2014 <a href=\"https:\/\/reactjs.org\/docs\/hooks-rules.html\">\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0445\u0443\u043a\u043e\u0432<\/a>. \u0418\u0445 \u043d\u0435\u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0435\u0449\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0445 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u041d\u043e \u043e\u043d\u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043c\u0435\u043d\u044f \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430 \u043a\u043e\u0434 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c &#171;\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442-\u0438\u043d\u0441\u043f\u0435\u043a\u0442\u043e\u0440&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c\u044b\u043c. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442. \u0412 \u0441\u043a\u0440\u044b\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c &#171;\u0440\u0430\u043d\u043d\u0438\u0439 \u0432\u044b\u0445\u043e\u0434&#187;, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0434\u043b\u044f \u043d\u0438\u0447\u0435\u0433\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const Inspector = ({ isVisible }) => {     if (!isVisible) {         \/\/ \u0440\u0430\u043d\u043d\u0438\u0439 \u0432\u044b\u0445\u043e\u0434         return null;     }     useEffect(() => {         \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438         return () => {             \/\/ \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438         };     }, []);     return &lt;div>...&lt;\/div>; };<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u043d\u0435\u0442, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c <code>useEffect<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0445\u0443\u043a\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0440\u0430\u043d\u043d\u0435\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u0430 \u0432\u043e \u0432\u0441\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u043f <code>isVisible<\/code> \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>false<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const Inspector = ({ isVisible }) => {     useEffect(() => {         if (!isVisible) {             return;         }         \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438         return () => {             \/\/ \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438         };     }, [isVisible]);      if (!isVisible) {         \/\/ \u0412\u044b\u0445\u043e\u0434 \u043d\u0435 \u0442\u0430\u043a\u043e\u0439 \u0440\u0430\u043d\u043d\u0438\u0439, \u043a\u0430\u043a\u0438\u043c \u043c\u043e\u0433 \u0431\u044b \u0431\u044b\u0442\u044c         return null;     }     return &lt;div>...&lt;\/div>; };<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u0432\u0441\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c <code>isVisible<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u041f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0447\u0430\u0441\u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u0432\u0440\u0435\u0434\u0438\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u042f \u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 <code>isVisible === false<\/code>. \u041d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c? \u042d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0445\u0443\u043a\u043e\u0432 \u2014 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0410\u044f \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0445\u0443\u043a\u043e\u0432 \u2014 \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0431\u043e\u0439 \u0434\u043b\u044f \u0445\u0443\u043a\u043e\u0432. \u041d\u043e \u0442\u0430\u043a \u0431\u044b\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e.<\/p>\n<p>  <\/p>\n<h2 id=\"ty-slishkom-staryy\">\u0422\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u0442\u0430\u0440\u044b\u0439<\/h2>\n<p>  <\/p>\n<p>\u0422\u044b \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 2013 \u0433\u043e\u0434\u0443 \u0438 \u0441\u0442\u0430\u0440\u0430\u0435\u0448\u044c\u0441\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0447 \u0442\u0430\u043a \u0434\u043e\u043b\u0433\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u0418 \u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0435\u043d \u0442\u0435\u0431\u0435 \u0437\u0430 \u044d\u0442\u043e \u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u043f\u0440\u0438\u0447\u0438\u043d, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u0441\u043c\u043e\u0433 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u0443\u044e \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443 \u0441 \u0442\u043e\u0431\u043e\u0439. \u041d\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u044e \u0446\u0435\u043d\u0443: \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430, \u0432 \u043b\u0443\u0447\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0438, \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u2014 \u0432\u0432\u043e\u0434\u044f\u0442 \u0432 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u044f \u0438\u0449\u0443 &#171;\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0432 React&#187; \u043d\u0430 &#171;StackOverflow&#187;, \u043f\u0435\u0440\u0432\u044b\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0435 \u0435\u0449\u0435 100 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">class ContextMenu extends React.Component {     state = {         visible: false,     };      render() {         return (             &lt;canvas                 ref=\"canvas\"                 className=\"DrawReflect\"                 onMouseDown={this.startDrawing}             \/>         );     }      startDrawing(e) {         console.log(             e.clientX - e.target.offsetLeft,             e.clientY - e.target.offsetTop,         );     }      drawPen(cursorX, cursorY) {         \/\/ \u0414\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u043f\u043e\u0434\u043f\u0438\u0441\u0438         this.context.updateDrawInfo({             cursorX: cursorX,             cursorY: cursorY,             drawingNow: true,         });          \/\/ \u0420\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435         const canvas = this.refs.canvas;         const canvasContext = canvas.getContext('2d');         canvasContext.beginPath();         canvasContext.arc(             cursorX,             cursorY \/* \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f *\/,             1 \/* \u0440\u0430\u0434\u0438\u0443\u0441 *\/,             0 \/* \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0433\u043e\u043b *\/,             2 * Math.PI \/* \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0443\u0433\u043e\u043b *\/,         );         canvasContext.stroke();     } }<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bl\/vi\/-r\/blvi-rkb9f2giq25kwviy8a_ba0.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/bl\/vi\/-r\/blvi-rkb9f2giq25kwviy8a_ba0.gif\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0438\u0449\u0443 <code>npm-\u043f\u0430\u043a\u0435\u0442<\/code> \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0444\u0438\u0447\u0438 <code>React<\/code>, \u044f, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c, \u043d\u0430\u0445\u043e\u0436\u0443 \u0437\u0430\u0431\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0441\u043e \u0441\u0442\u0430\u0440\u044b\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/github.com\/react-grid-layout\/react-draggable\">react-draggable<\/a>. \u042d\u0442\u043e \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u0432 <code>React<\/code>. \u0423 \u043d\u0435\u0433\u043e <a href=\"https:\/\/github.com\/react-grid-layout\/react-draggable\/issues\">\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432<\/a> \u0438 <a href=\"https:\/\/github.com\/react-grid-layout\/react-draggable\/graphs\/contributors\">\u043d\u0438\u0437\u043a\u0430\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/a>. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0441\u0442\u0430\u0440\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 (\u043a\u043b\u0430\u0441\u0441\u044b) \u043d\u0435 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0445 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 (contributors).<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/reactjs.org\/docs\/state-and-lifecycle.html\">\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a> \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>componentDidMount<\/code> \u0438 <code>componentWillUnmount<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>useEffect<\/code>. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 <code>React<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430\u0434 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/beta.reactjs.org\/\">Beta docs<\/a> \u043d\u0430 <a href=\"https:\/\/github.com\/reactjs\/reactjs.org\/issues\/3308\">\u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0434\u0432\u0443\u0445 \u043b\u0435\u0442<\/a>. \u0410 \u0432\u043e\u0437 \u0438 \u043d\u044b\u043d\u0435 \u0442\u0430\u043c.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0434\u043e\u043b\u0433\u0438\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0445\u0443\u043a\u0438 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u041d\u043e\u0432\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0438\u0437\u043e \u0432\u0441\u0435\u0445 \u0441\u0438\u043b \u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0441\u0432\u043e\u0439 \u043f\u0443\u0442\u044c \u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 <code>React<\/code>, \u0430 \u0441\u0442\u0430\u0440\u044b\u0435 \u2014 \u0441\u0442\u0430\u0440\u0430\u044e\u0442\u0441\u044f \u0438\u0434\u0442\u0438 \u0432 \u043d\u043e\u0433\u0443 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c.<\/p>\n<p>  <\/p>\n<h2 id=\"semeynoe-delo\">\u0421\u0435\u043c\u0435\u0439\u043d\u043e\u0435 \u0434\u0435\u043b\u043e<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u0442\u0432\u043e\u0439 \u043e\u0442\u0435\u0446 <code>Facebook<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e. <code>Facebook<\/code> \u0445\u043e\u0442\u0435\u043b &#171;\u0421\u0431\u043b\u0438\u0437\u0438\u0442\u044c \u043b\u044e\u0434\u0435\u0439&#187; \u2014 \u044f \u0432 \u0434\u0435\u043b\u0435! \u041a\u043e\u0433\u0434\u0430 \u0431\u044b \u044f \u043d\u0438 \u043f\u0440\u0438\u0435\u0437\u0436\u0430\u043b \u043a \u0442\u0432\u043e\u0438\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f\u043c, \u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b \u043d\u043e\u0432\u044b\u0445 \u0434\u0440\u0443\u0437\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u0437\u0430\u0442\u0435\u043c \u0432\u0441\u0435 \u0441\u0442\u0430\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e. \u0422\u0432\u043e\u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0438 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0432 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Facebook%E2%80%93Cambridge_Analytica_data_scandal\">\u0441\u0445\u0435\u043c\u0435 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u043b\u043f\u043e\u0439<\/a>. \u041e\u043d\u0438 \u0438\u0437\u043e\u0431\u0440\u0435\u043b\u0438 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e &#171;\u0424\u0435\u0439\u043a\u043e\u0432\u044b\u0445 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439&#187;. \u041e\u043d\u0438 \u043d\u0430\u0447\u0430\u043b\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0431\u0435\u0437 \u0438\u0445 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u044f. \u041f\u043e\u0441\u0435\u0449\u0430\u0442\u044c \u0442\u0432\u043e\u0438\u0445 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439 \u0441\u0442\u0430\u043b\u043e \u043e\u043f\u0430\u0441\u043d\u043e \u2014 \u0434\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438, \u0447\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u0443\u0434\u0430\u043b\u0438\u043b \u0441\u0432\u043e\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 <code>Facebook<\/code>.<\/p>\n<p>  <\/p>\n<p>\u042f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u0434\u0435\u0442\u0438 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u043f\u043e\u0441\u0442\u0443\u043f\u043a\u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439. \u041d\u043e \u0442\u044b \u0432\u0441\u0435 \u0435\u0449\u0435 \u0436\u0438\u0432\u0435\u0448\u044c \u0441 \u043d\u0438\u043c\u0438. \u041e\u043d\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u0443\u044e\u0442 \u0442\u0432\u043e\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u041e\u043d\u0438 \u2014 \u0442\u0432\u043e\u0438 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438. \u0422\u044b \u0437\u0430\u0432\u0438\u0441\u0438\u0448\u044c \u043e\u0442 \u043d\u0438\u0445. \u0415\u0441\u043b\u0438 \u0432 \u043e\u0434\u0438\u043d \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0434\u0435\u043d\u044c \u043e\u043d\u0438 \u043f\u043e\u043f\u043b\u0430\u0442\u044f\u0442\u0441\u044f \u0437\u0430 \u0441\u0432\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0442\u044b \u043f\u043e\u0441\u0442\u0440\u0430\u0434\u0430\u0435\u0448\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0438\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 <code>JS-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438<\/code> \u0441\u043c\u043e\u0433\u043b\u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439. \u041e\u043d\u0438 \u0441\u0442\u0430\u043b\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u0438 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043b\u0438\u0441\u044c \u043a \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/openjsf.org\/\">OpenJS Foundation<\/a>. <code>Node.js<\/code>, <code>Electron<\/code>, <code>Webpack<\/code>, <code>Lodash<\/code>, <code>ESlint<\/code> \u0438 \u0434\u0430\u0436\u0435 <code>Jest<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u043e\u043c \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u0438 \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u043b\u0438\u0446. \u0420\u0430\u0437 \u0441\u043c\u043e\u0433\u043b\u0438 \u043e\u043d\u0438, \u0442\u044b \u0442\u043e\u0436\u0435 \u0441\u043c\u043e\u0436\u0435\u0448\u044c. \u041d\u043e \u0442\u044b \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0448\u044c. \u0422\u044b \u043e\u0441\u0442\u0430\u0435\u0448\u044c\u0441\u044f \u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f\u043c\u0438. \u041f\u043e\u0447\u0435\u043c\u0443?<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/9g\/b4\/fj\/9gb4fj6tmn4wzixaldntxjhrbik.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/9g\/b4\/fj\/9gb4fj6tmn4wzixaldntxjhrbik.gif\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<h2 id=\"eto-ne-ya-eto-ty\">\u042d\u0442\u043e \u043d\u0435 \u044f, \u044d\u0442\u043e \u0442\u044b<\/h2>\n<p>  <\/p>\n<p>\u0423 \u043d\u0430\u0441 \u0441 \u0442\u043e\u0431\u043e\u0439 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0446\u0435\u043b\u0438 \u0432 \u0436\u0438\u0437\u043d\u0438 \u2014 \u043f\u043e\u043c\u043e\u0433\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0438\u0439 <code>UI<\/code>. \u042f \u0434\u0435\u043b\u0430\u044e \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/marmelab.com\/react-admin\/\">React-admin<\/a>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0432\u044b\u0437\u043e\u0432\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0442\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0448\u044c\u0441\u044f, \u0438 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u044b \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u0438\u0434\u0442\u0438. \u0422\u0432\u043e\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0435 \u0438\u0437 \u043b\u0435\u0433\u043a\u0438\u0445, \u0438, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0442\u044b \u0440\u0435\u0448\u0430\u0435\u0448\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u043d\u0435 \u0438\u043c\u0435\u044e \u043d\u0438 \u043c\u0430\u043b\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u044f\u0442\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u044f \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0442\u0432\u043e\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438. \u041a\u043e\u0433\u0434\u0430 \u044f \u0433\u043e\u0432\u043e\u0440\u044e \u043e \u0442\u0435\u0431\u0435, \u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u044e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u2014 \u044f \u043f\u0440\u0438\u0442\u0432\u043e\u0440\u044f\u044e\u0441\u044c, \u0447\u0442\u043e \u043c\u044b \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u043f\u0430\u0440\u0430, \u0431\u0435\u0437 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043d\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0435. \u0412 <code>react-admin<\/code> \u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u043e\u0431\u043e\u0439. \u0418 \u043a\u043e\u0433\u0434\u0430 \u043b\u044e\u0434\u0438 \u0436\u0430\u043b\u0443\u044e\u0442\u0441\u044f \u043d\u0430 <code>react-admin<\/code>, \u044f \u0434\u0435\u043b\u0430\u044e \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0445\u043e\u0442\u044f \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u0442\u043e\u0431\u043e\u0439. \u0411\u0443\u0434\u0443\u0447\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u044f \u0442\u043e\u0436\u0435 \u043d\u0430\u0445\u043e\u0436\u0443\u0441\u044c \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u043e\u0432\u043e\u0439. \u042f \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0441\u044c \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445.<\/p>\n<p>  <\/p>\n<p>\u042f \u0438\u0437\u0443\u0447\u0430\u043b \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438: <code>Svelte<\/code> \u2014 \u044d\u0442\u043e \u043d\u0435 <code>JavaScript<\/code>, <code>SolidJS<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0435 \u043b\u043e\u0432\u0443\u0448\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 `SolidJS` const BlueText = props => &lt;span style=\"color: blue\">{props.text}&lt;\/span>;  \/\/ \u0430 \u044d\u0442\u043e \u043d\u0435\u0442 const BlueText = ({ text }) => &lt;span style=\"color: blue\">{text}&lt;\/span>;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u0443 \u043d\u0438\u0445 \u043d\u0435\u0442 \u0442\u0432\u043e\u0438\u0445 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432. \u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043d\u0435 \u0438\u043d\u043e\u0433\u0434\u0430 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u043a\u0430\u0442\u044c. \u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043c\u0435\u043d\u044f \u0438\u0441\u043a\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<h2 id=\"ya-ne-mogu-brosit-tebya-detka\">\u042f \u043d\u0435 \u043c\u043e\u0433\u0443 \u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0442\u0435\u0431\u044f, \u0434\u0435\u0442\u043a\u0430<\/h2>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u043d\u0435 \u043c\u043e\u0433\u0443 \u0442\u0435\u0431\u044f \u0431\u0440\u043e\u0441\u0438\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044f \u043b\u044e\u0431\u043b\u044e \u0442\u0432\u043e\u0438\u0445 \u0434\u0440\u0443\u0437\u0435\u0439. <a href=\"https:\/\/mui.com\/\">MUI<\/a>, <a href=\"https:\/\/remix.run\/\">Remix<\/a>, <a href=\"https:\/\/tanstack.com\/query\/v4\">react-query<\/a>, <a href=\"https:\/\/testing-library.com\/docs\/react-testing-library\/intro\/\">react-testing-library<\/a>, <a href=\"https:\/\/tanstack.com\/table\/v8\">react-table<\/a>\u2026 \u041a\u043e\u0433\u0434\u0430 \u044f \u0441 \u044d\u0442\u0438\u043c\u0438 \u043f\u0430\u0440\u043d\u044f\u043c\u0438, \u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0435\u043b\u0430\u044e \u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0438\u0435 \u0432\u0435\u0449\u0438. \u041e\u043d\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u043c\u0435\u043d\u044f \u043b\u0443\u0447\u0448\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u2014 \u043e\u043d\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u043c\u0435\u043d\u044f \u043b\u0443\u0447\u0448\u0435 \u043a\u0430\u043a \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430. \u042f \u043d\u0435 \u043c\u043e\u0433\u0443 \u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0442\u0435\u0431\u044f, \u043d\u0435 \u0431\u0440\u043e\u0441\u0438\u0432 \u0438\u0445.<\/p>\n<p>  <\/p>\n<p>&#171;\u042d\u0442\u043e \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u0438\u0434\u0438\u043e\u0442&#187;.<\/p>\n<p>  <\/p>\n<p>\u042f \u043d\u0435 \u0441\u043f\u043e\u0440\u044e, \u0447\u0442\u043e \u0443 \u0442\u0435\u0431\u044f \u043b\u0443\u0447\u0448\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0438 \u043b\u0443\u0447\u0448\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438. \u041d\u043e, \u0447\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u0442\u0435\u0431\u044f \u043d\u0435 \u0437\u0430 \u0442\u0432\u043e\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430, \u0430 \u0437\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u0432\u043e\u0435\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0436\u0430\u043b\u043e\u0441\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0432 \u0442\u0435\u0431\u044f \u0432\u043b\u043e\u0436\u0438\u043b. \u042f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b <a href=\"https:\/\/github.com\/marmelab\/react-admin\/pulse\">\u043e\u0433\u0440\u043e\u043c\u043d\u0443\u044e \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443<\/a>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043d\u0435 \u0441\u043e\u0439\u0434\u044f \u0441 \u0443\u043c\u0430. \u042f \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b <a href=\"https:\/\/marmelab.com\/ra-enterprise\/\">\u0431\u0438\u0437\u043d\u0435\u0441<\/a> \u0432\u043e\u043a\u0440\u0443\u0433 \u0442\u0435\u0431\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u043d\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u042f \u0437\u0430\u0432\u0438\u0448\u0443 \u043e\u0442 \u0442\u0435\u0431\u044f.<\/p>\n<p>  <\/p>\n<h2 id=\"pozvoni-mne\">\u041f\u043e\u0437\u0432\u043e\u043d\u0438 \u043c\u043d\u0435<\/h2>\n<p>  <\/p>\n<p>\u042f \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u0447\u0435\u0441\u0442\u0435\u043d \u0441 \u0442\u043e\u0431\u043e\u0439. \u0422\u0435\u043f\u0435\u0440\u044c \u0442\u0432\u043e\u0439 \u0447\u0435\u0440\u0435\u0434. \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u0448\u044c\u0441\u044f \u043b\u0438 \u0442\u044b \u0440\u0435\u0448\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438, \u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0448\u044c\u0441\u044f, \u0442\u043e \u043a\u043e\u0433\u0434\u0430? \u0427\u0442\u043e \u0442\u044b \u0434\u0443\u043c\u0430\u0435\u0448\u044c \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0432\u0440\u043e\u0434\u0435 \u043c\u0435\u043d\u044f? \u0414\u043e\u043b\u0436\u0435\u043d \u043b\u0438 \u044f \u0437\u0430\u0431\u044b\u0442\u044c \u043e \u0442\u0435\u0431\u0435? \u0418\u043b\u0438 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u043d\u0430\u0448\u0438\u043c\u0438 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f\u043c\u0438?<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435? \u0421\u043a\u0430\u0436\u0438 \u043c\u043d\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/1c\/n-\/ui\/1cn-uic2lc-umnecih8wdwwumam.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/1c\/n-\/ui\/1cn-uic2lc-umnecih8wdwwumam.gif\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<p><a href=\"https:\/\/cloud.timeweb.com\/vds-promo-8-rub?utm_source=habr&amp;utm_medium=blog_1560_476&amp;utm_campaign=habr&amp;utm_content=1560_476\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/p-\/u9\/l2\/p-u9l27ynelxi92bcmdxhu76ma8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/p-\/u9\/l2\/p-u9l27ynelxi92bcmdxhu76ma8.png\"\/><\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/timeweb\/blog\/693072\/\"> https:\/\/habr.com\/ru\/company\/timeweb\/blog\/693072\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/jc\/hw\/st\/jchwst6a3nwlxlscnmuw5tdhmry.png\" data-src=\"https:\/\/habrastorage.org\/webt\/jc\/hw\/st\/jchwst6a3nwlxlscnmuw5tdhmry.png\"\/>  <\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f!<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 <a href=\"https:\/\/marmelab.com\/blog\/2022\/09\/20\/react-i-love-you.html\">\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>, \u0432\u044b\u0437\u044b\u0432\u0430\u0432\u0448\u0435\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u043e\u043d\u0430\u043d\u0441 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 <code>React-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u0440\u043e\u0433\u043e\u0439 <a href=\"https:\/\/reactjs.org\/\">React<\/a>, \u043c\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u043c\u0441\u044f \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 10 \u043b\u0435\u0442. \u041c\u044b \u043f\u0440\u043e\u0448\u043b\u0438 <a href=\"https:\/\/marmelab.com\/react-admin\/\">\u0434\u043e\u043b\u0433\u0438\u0439 \u043f\u0443\u0442\u044c<\/a> \u0432\u043c\u0435\u0441\u0442\u0435. \u041d\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0432\u044b\u0448\u043b\u0430 \u0438\u0437-\u043f\u043e\u0434 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-339649","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/339649","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=339649"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/339649\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=339649"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=339649"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=339649"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}