{"componentChunkName":"component---src-templates-post-js","path":"/javascript/pogruzhaemsya-v-raboty-s-children-na-react/","result":{"pageContext":{"slug":"pogruzhaemsya-v-raboty-s-children-na-react","content":"\n<p>В этой статье мы погрузимся в работу с&nbsp;<code>children</code>&nbsp;на React и узнаем как можно с ними работать на реальных примерах.</p>\n\n\n\n<p class=\"author\"><em>Перевод&nbsp;</em><a href=\"https://mxstbr.blog/2017/02/react-children-deepdive/#child-components\"><em>A deep dive into children in React</em></a></p>\n\n\n\n<p id=\"1e54\">Основа React это компоненты. Вы можете вкладывать компоненты друг в друга также, как вы вкладываете друг в друга HTML теги, что упрощает работу с JSX, который собственно и напоминает HTML.</p>\n\n\n\n<p id=\"baa2\">Когда я впервые увидел React, то я подумал, что нужно просто использовать&nbsp;<code>props.children</code>&nbsp;и дело в шляпе. Но как же сильно я ошибался.</p>\n\n\n\n<p id=\"0bb8\">Так как мы работаем с JavaScript, то мы можем делать с дочерними элементами (<code>children</code>) буквально всё, что угодно. Мы можем смело задавать им конкретные свойства, решать нужно ли их рендерить, ну и конечно же, управлять ими так, как нам надо. Так что дело это полезное и уж давайте при случае как можно глубже познаем всю прелесть работы с&nbsp;<code>children</code>&nbsp;на React.</p>\n\n\n\n<p id=\"9ff5\">Поехали!</p>\n\n\n\n<h2 id=\"75c4\">Дочерние компоненты</h2>\n\n\n\n<p id=\"7de1\">Предположим, что у нас есть компонент&nbsp;<code>&lt;Grid /&gt;</code>, который может содержать в себе компоненты&nbsp;<code>&lt;Row /&gt;</code>. Мы бы написали это так:</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>&lt;Grid>\n  &lt;Row />\n  &lt;Row />\n  &lt;Row />\n&lt;/Grid></code></pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"700\" height=\"256\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_8qVzwdrogSF1hK-plv86bw.png\" alt=\"\" class=\"wp-image-183\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_8qVzwdrogSF1hK-plv86bw.png 700w, https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_8qVzwdrogSF1hK-plv86bw-300x110.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" /></figure>\n\n\n\n<p>Эти три компонента&nbsp;<code>Row</code>&nbsp;передаются компоненту&nbsp;<code>Grid</code>&nbsp;как&nbsp;<code>props.children</code>. Используя контейнер для выражения (<em>expression container это технический термин для этих волнистых скобок в JSX</em>) родители могут рендерить свои дочерние элементы:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>class Grid extends React.Component {\n  render() {\n    return &lt;div>{this.props.children}&lt;/div>\n  }\n}</code></pre>\n\n\n\n<p>Родительские элементы также могут и не рендерить своих потомков или могут производить с ними какие-либо действия перед рендерингом. Для примера, этот компонент.&nbsp;<code>&lt;Fullstop /&gt;</code>&nbsp;вообще не будет рендерить свои дочерние элементы:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>class Fullstop extends React.Component {\n  render() {\n    return &lt;h1>Hello world!&lt;/h1>\n  }\n}</code></pre>\n\n\n\n<p id=\"87dd\">Совершенно неважно какие дочерние элементы будут переданы этому компоненту, он просто будет всегда показывать&nbsp;<code>\"Hello world!\"</code>&nbsp;и ничего более.</p>\n\n\n\n<p id=\"13b1\">Обратите внимание, что&nbsp;<code>h1</code>&nbsp;в примере выше рендерит свои дочерние элементы, в нашем случае это&nbsp;<code>\"Hello world!\"</code>.</p>\n\n\n\n<h3 id=\"b980\"><strong>Дочерним элементом может быть все, что угодно</strong></h3>\n\n\n\n<p id=\"d383\"><code>Children</code>&nbsp;в React не обязательно быть компонентами, они могут быть всем, чем угодно. Для примера, мы можем передать нашему вышеупомянутому компоненту&nbsp;<code>&lt;Grid /&gt;</code>&nbsp;какой-либо текст в виде&nbsp;<code>children</code>&nbsp;и всё будет прекрасно работать:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>&lt;Grid>Hello world!&lt;/Grid></code></pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"700\" height=\"69\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_BMyhht5dTdh2ncWJLdLezA.png\" alt=\"\" class=\"wp-image-184\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_BMyhht5dTdh2ncWJLdLezA.png 700w, https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_BMyhht5dTdh2ncWJLdLezA-300x30.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" /></figure>\n\n\n\n<p id=\"fe2c\">JSX автоматически удалит пробелы вначале и конце строки, а вместе с ними и пустые строки. Также пустые строки в середине строкового литерала преобразуются в один пробел.</p>\n\n\n\n<p id=\"97a9\">Это означает то, что все эти примеры ниже отрендерят одно и тоже:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>&lt;Grid>Hello world!&lt;/Grid>\n\n&lt;Grid>\n  Hello world!\n&lt;/Grid>\n\n&lt;Grid>\n  Hello\n  world!\n&lt;/Grid>\n\n&lt;Grid>\n\n  Hello world!\n&lt;/Grid></code></pre>\n\n\n\n<p>Вы также можете смежно использовать разные типы дочерних элементов:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>&lt;Grid>\n  Here is a row:\n  &lt;Row />\n  Here is another row:\n  &lt;Row />\n&lt;/Grid></code></pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"700\" height=\"265\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_g2Uq7Sd2nUKpCceozwKqjw.png\" alt=\"\" class=\"wp-image-185\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_g2Uq7Sd2nUKpCceozwKqjw.png 700w, https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_g2Uq7Sd2nUKpCceozwKqjw-300x114.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" /></figure>\n\n\n\n<h3 id=\"ff04\"><strong>Функция как дочерний элемент</strong></h3>\n\n\n\n<p id=\"7f02\">Мы можем передать любое JavaScript выражение, как дочерний элемент. И функции не исключение.</p>\n\n\n\n<p id=\"03c1\">Чтобы показать то, как это выглядит, посмотрите на этот компонент, который выполняет функцию, которая была передана как дочерний элемент:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>class Executioner extends React.Component {\n  render() {\n    // Обратите внимание на то, как мы вызываем дочерний элемент,    как функцию?\n    // ↓\n    return this.props.children()\n  }\n}</code></pre>\n\n\n\n<p>Вы бы могли вызвать этот компонент так:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>&lt;Executioner>\n  {() => &lt;h1>Hello World!&lt;/h1>}\n&lt;/Executioner></code></pre>\n\n\n\n<p id=\"b1be\">Это конечно не совсем пригодный пример, но он показывает саму идею.</p>\n\n\n\n<p id=\"a28d\">Представьте, что вам надо подтянуть какие-либо данные с сервера. Вы могли бы сделать это несколькими способами и это возможно сделать с этим&nbsp;<em>function-as-a-child</em>&nbsp;паттерном:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>&lt;Fetch url=\"api.myself.com\">\n  {(result) => &lt;p>{result}&lt;/p>}\n&lt;/Fetch></code></pre>\n\n\n\n<p>Не переживайте, если код выше смутил вас. Все, что я хотел сделать это то, чтобы вы не удивились увидев нечто подобное в реальной жизни. С&nbsp;<code>children</code>&nbsp;возможно всё.</p>\n\n\n\n<h2 id=\"3724\"><strong>Управление children</strong></h2>\n\n\n\n<p id=\"27ab\">Если вы посмотрите на документацию React, то вы увидите там , что “<em>children это непрозрачная структура данных</em>”. На самом деле они нам говорят о том, что&nbsp;<code>props.children</code>&nbsp;может быть любым типом данных, например таким как массив, функция, объект и тп. В общем, это может быть всем чем угодно.</p>\n\n\n\n<p id=\"d690\">В React есть несколько вспомогательных функций, которые могут помочь управлять&nbsp;<code>children</code>&nbsp;довольно легко и без лишних заморочек. Доступны они в&nbsp;<code>React.Children</code>.</p>\n\n\n\n<h3><strong>Проходимся циклом по</strong> children</h3>\n\n\n\n<p>Две самых очевидных из вышеупомянутых функций это&nbsp;<code>React.Children.map</code>&nbsp;и&nbsp;<code>React.Children.forEach</code>. Они работают так же как и их коллеги из методов массивов, за исключением того, что они также работают в момент передачи функции, объекта или чего-нибудь ещё непосредственно в&nbsp;<code>children</code>.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>class IgnoreFirstChild extends React.Component {\n  render() {\n    const children = this.props.children\n    return (\n      &lt;div>\n        {React.Children.map(children, (child, i) => {\n          // игнорируем первого потомка\n          if (i &lt; 1) return\n          return child\n        })}\n      &lt;/div>\n    )\n  }\n}</code></pre>\n\n\n\n<p><code>&lt;IgnoreFirstChild /&gt;</code>&nbsp;компонент из кода выше, проходится по всем своим потомкам, игнорируя первый и возвращая всех остальных.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>&lt;IgnoreFirstChild>\n  &lt;h1>First&lt;/h1>\n  &lt;h1>Second&lt;/h1> // &lt;- Only this is rendered\n&lt;/IgnoreFirstChild></code></pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"700\" height=\"68\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_XAaXg_Pz8VUymyCAOAXoVw.png\" alt=\"\" class=\"wp-image-186\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_XAaXg_Pz8VUymyCAOAXoVw.png 700w, https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_XAaXg_Pz8VUymyCAOAXoVw-300x29.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" /></figure>\n\n\n\n<p>В нашем случае мы бы могли также использовать&nbsp;<code>this.props.children.map</code>. Но чтобы произошло в случае, когда кто-нибудь бы передал функцию как потомка?&nbsp;<code>this.props.children</code>&nbsp;был бы функцией, а не массивом и мы бы словили ошибку.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"700\" height=\"40\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_WxuWukVXXs5AJ4zfIi4Ltg.png\" alt=\"\" class=\"wp-image-187\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_WxuWukVXXs5AJ4zfIi4Ltg.png 700w, https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_WxuWukVXXs5AJ4zfIi4Ltg-300x17.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" /></figure>\n\n\n\n<p>Но а с&nbsp;<code>React.Children.map</code>&nbsp;это не будет вообще проблемой:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>&lt;IgnoreFirstChild>\n  {() => &lt;h1>First&lt;/h1>} // &lt;- Ignored 💪\n&lt;/IgnoreFirstChild></code></pre>\n\n\n\n<h3 id=\"6247\">Считаем children</h3>\n\n\n\n<p id=\"b944\">Так как&nbsp;<code>this.props.children</code>&nbsp;может быть совершенно любым типом данных, проверка количества потомков у компонента может быть довольно сложным процессом. Наивно написав&nbsp;<code>this.props.children.length</code>&nbsp;вы получите 12, если станете проверять строку&nbsp;<code>\"Hello World!\"</code>, хоть там и будет один потомок.</p>\n\n\n\n<p id=\"036b\">Именно поэтому у нас и есть&nbsp;<code>React.Children.count</code>:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>class ChildrenCounter extends React.Component {\n  render() {\n    return &lt;p>React.Children.count(this.props.children)&lt;/p>\n  }\n}</code></pre>\n\n\n\n<p>Так мы получим количество потомков, вне зависимости от их типа данных:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// Renders \"1\"\n&lt;ChildrenCounter>\n  Second!\n&lt;/ChildrenCounter>\n\n// Renders \"2\"\n&lt;ChildrenCounter>\n  &lt;p>First&lt;/p>\n  &lt;ChildComponent />\n&lt;/ChildrenCounter>\n\n// Renders \"3\"\n&lt;ChildrenCounter>\n  {() => &lt;h1>First!&lt;/h1>}\n  Second!\n  &lt;p>Third!&lt;/p>\n&lt;/ChildrenCounter></code></pre>\n\n\n\n<h3 id=\"5702\">Конвертируем children в массив</h3>\n\n\n\n<p id=\"8415\">Ну и под конец, если ни один из методов выше вам не подходит, то вы можете конвертировать&nbsp;<code>children</code>&nbsp;в массив при помощи метода&nbsp;<code>React.Children.toArray</code>. Это было бы полезно в случае сортировки, например:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>class Sort extends React.Component {\n  render() {\n    const children = React.Children.toArray(this.props.children)\n    return &lt;p>{children.sort().join(' ')}&lt;/p>\n  }\n}\n&lt;Sort>\n  // Тут мы используем контейнеры выражений, чтобы убедиться в том,    что наши строки\n  // переданы как три отдельных потомка, а не как одна строка\n  {'bananas'}{'oranges'}{'apples'}\n&lt;/Sort></code></pre>\n\n\n\n<p id=\"b88c\">Пример выше рендерит строки, но уже отсортированные:</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"700\" height=\"70\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_KuWvpsCo-OlyVOt6sMtXyQ.png\" alt=\"\" class=\"wp-image-188\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_KuWvpsCo-OlyVOt6sMtXyQ.png 700w, https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_KuWvpsCo-OlyVOt6sMtXyQ-300x30.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" /></figure>\n\n\n\n<p id=\"a6e1\">Обратите внимание, что возвращаемый&nbsp;<code>React.Children.toArray</code>&nbsp;массив не содержит потомков с типом функция, а только&nbsp;<code>React.Element</code>&nbsp;или строки.</p>\n\n\n\n<h3 id=\"7457\"><strong>Один единственный потомок</strong></h3>\n\n\n\n<p id=\"abbc\">Если вы вспомните о предыдущем компоненте&nbsp;<code>&lt;Executioner /&gt;</code>, то он работает с одним потомком, который является функцией.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>class Executioner extends React.Component {\n  render() {\n    return this.props.children()\n  }\n}</code></pre>\n\n\n\n<p>Мы можем уточнить это условие с помощью&nbsp;<code>propTypes</code>, что будет выглядеть примерно таким образом:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>Executioner.propTypes = {\n  children: React.PropTypes.func.isRequired,\n}</code></pre>\n\n\n\n<p>Тут выйдет сообщение в консоль, которое в принципе будет проигнорировано разработчиком. Вместо этого мы можем использовать&nbsp;<code>React.Children.only</code>&nbsp;внутри рендера.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>class Executioner extends React.Component {\n  render() {\n    return React.Children.only(this.props.children)()\n  }\n}</code></pre>\n\n\n\n<p>В этом случае отрендерится только один единственный потомок в&nbsp;<code>this.props.children</code>. Если их будет больше, чем один, то нам выкинет ошибку, следовательно, работа приложения будет приостановлена — идеально для тех случаев, когда ленивый разработчик пытается разобраться с вашим приложением.</p>\n\n\n\n<h3 id=\"91e5\">Редактирование children</h3>\n\n\n\n<p id=\"b437\">Мы можем рендерить произвольные компоненты как&nbsp;<code>children</code>. Но продолжать контролировать их из родителя, а не из компонента из которого мы их рендерим. Давайте посмотрим на этот момент повнимательнее. Представим, что у нас есть компонент&nbsp;<code>RadioGroup</code>, который может включать в себя несколько компонентов&nbsp;<code>RadioButton</code>. (которые рендерят&nbsp;<code>&lt;input type=\"radio\"&gt;</code>)</p>\n\n\n\n<p id=\"7621\">RadioButton’ы не рендерятся из&nbsp;<code>RadioGroup</code>&nbsp;сами по себе, а используются как&nbsp;<code>Children</code>. Что говорит о том, что где-то в нашем приложении у нас есть такой код:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>render() {\n  return(\n    &lt;RadioGroup>\n      &lt;RadioButton value=\"first\">First&lt;/RadioButton>\n      &lt;RadioButton value=\"second\">Second&lt;/RadioButton>\n      &lt;RadioButton value=\"third\">Third&lt;/RadioButton>\n    &lt;/RadioGroup>\n  )\n}</code></pre>\n\n\n\n<p>В этом коде есть небольшая проблемка. Инпуты не сгруппированы, что приводит к такому результату:</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"700\" height=\"339\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_c-_IqGC8PTEfLUMg8CXM5Q.png\" alt=\"\" class=\"wp-image-189\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_c-_IqGC8PTEfLUMg8CXM5Q.png 700w, https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_c-_IqGC8PTEfLUMg8CXM5Q-300x145.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" /></figure>\n\n\n\n<p>Чтобы их сгруппировать им всем нужно иметь одинаковый атрибут&nbsp;<code>name</code>. Мы бы конечно могли бы сразу назначить&nbsp;<code>name</code>&nbsp;каждому&nbsp;<code>RadioButton</code>:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>&lt;RadioGroup>\n  &lt;RadioButton name=\"g1\" value=\"first\">First&lt;/RadioButton>\n  &lt;RadioButton name=\"g1\" value=\"second\">Second&lt;/RadioButton>\n  &lt;RadioButton name=\"g1\" value=\"third\">Third&lt;/RadioButton>\n&lt;/RadioGroup></code></pre>\n\n\n\n<p>Но это скучно и возможно приведёт к ошибкам. А ведь у нас в руках вся сила JavaScript! Можем ли мы использовать её, чтобы автоматически указать&nbsp;<code>RadioGroup</code>&nbsp;нужное нам&nbsp;<code>name</code>&nbsp;для всех его&nbsp;<code>children</code>?</p>\n\n\n\n<h3 id=\"fecc\"><strong>Меняем props у Children</strong></h3>\n\n\n\n<p id=\"d5a2\">Итак, в&nbsp;<code>RadioGroup</code>&nbsp;мы добавим новый метод под названием renderChildren, который будет редактировать пропсы у&nbsp;<code>children</code>:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>class RadioGroup extends React.Component {\n  constructor() {\n    super()\n    this.renderChildren = this.renderChildren.bind(this)\n  }\n\n  renderChildren() {\n    return this.props.children\n  }\n\n  render() {\n    return (\n      &lt;div className=\"group\">\n        {this.renderChildren()}\n      &lt;/div>\n    )\n  }\n}</code></pre>\n\n\n\n<p>Давайте пробежимся по всем потомкам, чтобы получить каждого из них по отдельности:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>renderChildren() {\n  return React.Children.map(this.props.children, child => {\n    return child\n  })\n}</code></pre>\n\n\n\n<p>Отлично, но как теперь мы можем редактировать их свойства?</p>\n\n\n\n<h3 id=\"c5da\">Имутабельно клонируем элементы</h3>\n\n\n\n<p id=\"17a0\">И вот тут в игру вступает последний вспомогательный метод. Как и подразумевается под его названием,&nbsp;<code>React.cloneElement</code>&nbsp;клонирует элемент. Мы передаём ему элемент, который желаем скопировать, как первый аргумент, а затем вторым аргументом передаём объект с пропсами, которые должны быть выставлены уже склонированному элементу:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const cloned = React.cloneElement(element, {\n  new: 'yes!'\n})</code></pre>\n\n\n\n<p id=\"3db0\">Теперь элемент&nbsp;<code>cloned</code>&nbsp;будет иметь пропс&nbsp;<code>new</code>&nbsp;со значением&nbsp;<code>\"yes!\"</code>.</p>\n\n\n\n<p id=\"8c5b\">И это именно то, что нам нужно для завершения&nbsp;<code>RadioGroup</code>. Мы клонируем каждого потомка и выставляем ему пропс&nbsp;<code>name</code>&nbsp;со значением&nbsp;<code>this.props.name</code>.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>renderChildren() {\n  return React.Children.map(this.props.children, child => {\n    return React.cloneElement(child, {\n      name: this.props.name\n    })\n  })\n}</code></pre>\n\n\n\n<p>Последним шагом мы передадим уникальный&nbsp;<code>name</code>&nbsp;к&nbsp;<code>RadioGroup</code>:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>&lt;RadioGroup name=\"g1\">\n  &lt;RadioButton value=\"first\">First&lt;/RadioButton>\n  &lt;RadioButton value=\"second\">Second&lt;/RadioButton>\n  &lt;RadioButton value=\"third\">Third&lt;/RadioButton>\n&lt;/RadioGroup></code></pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"700\" height=\"338\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_IvXCEAgQmDEKAMiMk3-qmA.png\" alt=\"\" class=\"wp-image-190\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_IvXCEAgQmDEKAMiMk3-qmA.png 700w, https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_IvXCEAgQmDEKAMiMk3-qmA-300x145.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" /></figure>\n\n\n\n<p>Работает! Вместо указания вручную атрибутов для каждого&nbsp;<code>RadioButton</code>, мы просто можем указать&nbsp;<code>RadioGroup</code>&nbsp;то, что нам нужно, чтобы было name и дальше он позаботиться об этом.</p>\n\n\n\n<h2 id=\"5167\"><strong>Заключение</strong></h2>\n\n\n\n<p id=\"2961\"><code>Children</code>&nbsp;заставляют компоненты в React вести себя как элементы разметки, а не отдельные объекты. Используя силу JavaScript и некоторые вспомогательные функции React, мы можем смело с ними работать для создания декларативных API и вообще для упрощения в целом для упрощения рабочего процесса.</p>\n","type":"js","date":"2021-02-04T15:28:14.000Z","acf":{"seo_desc":"В этой статье мы погрузимся в работу с children на React и узнаем как можно с ними работать на реальных примерах.","keywords":"children в react, методы children react, работа с children в react, react children","pub_date":"2020-02-10","tags":"React, JavaScript, React Children"},"title":"Погружаемся в работу с children на React","id":"1cd8d816-e812-5b16-8a98-56445f23c179","excerpt":"<p>В этой статье мы погрузимся в работу с children на React и узнаем как можно с ними работать на реальных примерах.</p>\n","featured_media":{"source_url":"https://stasonmars.ru/wp/wp-content/uploads/2021/02/reactchildrenksdjnfk.jpg"},"interesting":[{"title":"JavaScript. Почему 3 + true = 4? И другие хитрые уравнения приведения типов","slug":"javascript-pochemu-3true4-i-drugie-hitrye-uravneniya-privedeniya-tipov","type":"js"},{"title":"15 методов работы с элементами про которые вы возможно не слышали","slug":"15-metodov-raboty-s-elementami-pro-kotorie-vy-ne-slyshaly-vozmozhno","type":"js"},{"title":"13 интересных моментов по стилизации JavaScript кода от Google","slug":"13-interesnih-momentov-po-stilizacii-koda-ot-google","type":"js"}]}},"staticQueryHashes":["3576131997","63159454"]}