Что такое {this.props.children} и когда его следует использовать?

Будучи новичком в мире React, я хочу глубоко понять, что происходит, когда я использую {this.props.children}, и в каких ситуациях можно использовать то же самое. Насколько это актуально в приведенном ниже фрагменте кода?

render() {
  if (this.props.appLoaded) {
    return (
      <div>
        <Header
          appName = {this.props.appName}
          currentUser = {this.props.currentUser}
        />
        {this.props.children}
      </div>
    );
  }
}

Возможный дубликат ReactJS: Зачем использовать this.props.children?

maazadeeb 07.04.2018 13:20

В данной ссылке не было ясно, что происходит, когда я использую {this.props.children} внутри компонента.

nim007 07.04.2018 13:49

Лучший ресурс mxstbr.blog/2017/02/react-children-deepdive

Akshay Vijay Jain 23.02.2019 12:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
151
3
132 787
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я предполагаю, что вы видите это в методе render компонента React, например (изменить: ваш отредактированный вопрос действительно показывает это):

class Example extends React.Component {
  render() {
    return <div>
      <div>Children ({this.props.children.length}):</div>
      {this.props.children}
    </div>;
  }
}

class Widget extends React.Component {
  render() {
    return <div>
      <div>First <code>Example</code>:</div>
      <Example>
        <div>1</div>
        <div>2</div>
        <div>3</div>
      </Example>
      <div>Second <code>Example</code> with different children:</div>
      <Example>
        <div>A</div>
        <div>B</div>
      </Example>
    </div>;
  }
}

ReactDOM.render(
  <Widget/>,
  document.getElementById("root")
);
<div id = "root"></div>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

children - это специальное свойство компонентов React, которое содержит любые дочерние элементы, определенные внутри компонента, например divs внутри Example выше. {this.props.children} включает эти дочерние элементы в результат рендеринга.

...what are the situations to use the same

Вы бы сделали это, когда захотите включить дочерние элементы в визуализированный вывод напрямую, без изменений; и нет, если вы этого не сделали.

Если повторное использование не касается дочерних узлов, есть ли разница в производительности при вызове {props.children} из дочернего компонента, чем при его использовании внутри дочернего компонента?

nim007 07.04.2018 13:55

@ Нимми: Извините, я не понимаю, что вы имеете в виду под * "... чем использовать его внутри дочернего компонента".

T.J. Crowder 07.04.2018 14:16

Я имел в виду «вызов {this.props.children} в дочернем компоненте, а не запись узлов непосредственно в соответствующий дочерний компонент».

nim007 07.04.2018 14:47

@ Нимми: Прости, я все еще не понимаю. Можете ли вы сказать, что бы вы сделали по-другому с помощью приведенного выше кода?

T.J. Crowder 07.04.2018 14:53

@ Нимми, я полагаю, вы думаете, почему я должен поставить {this.props.children} вместо этого, я могу это записать, я это знаю. В таком случае сделайте это и получите небольшое преимущество в производительности. Но ваш компонент будет статическим, его нельзя будет повторно использовать с набором разных дочерних элементов в другом месте вашей кодовой базы.

Subin Sebastian 07.04.2018 15:39

@ssk: А! Хороший. Нимми - Да, вы можете записать детей прямо в ваш render, но они будут одними и теми же детьми во всех случаях. Принимая дочерние элементы (где это необходимо), каждый экземпляр вашего компонента может иметь разное содержимое. Я обновил пример в ответе.

T.J. Crowder 07.04.2018 15:56

Где мы должны использовать {this.props.children} и где свойства рендеринга react? В чем разница между ними?

SJxD 28.10.2020 00:15
Ответ принят как подходящий

What even is ‘children’?

The React docs say that you can use props.children on components that represent ‘generic boxes’ and that don’t know their children ahead of time. For me, that didn’t really clear things up. I’m sure for some, that definition makes perfect sense but it didn’t for me.

My simple explanation of what this.props.children does is that it is used to display whatever you include between the opening and closing tags when invoking a component.

A simple example:

Here’s an example of a stateless function that is used to create a component. Again, since this is a function, there is no this keyword so just use props.children

const Picture = (props) => {
  return (
    <div>
      <img src = {props.src}/>
      {props.children}
    </div>
  )
}

This component contains an <img> that is receiving some props and then it is displaying {props.children}.

Whenever this component is invoked {props.children} will also be displayed and this is just a reference to what is between the opening and closing tags of the component.

//App.js
render () {
  return (
    <div className='container'>
      <Picture key = {picture.id} src = {picture.src}>
          //what is placed here is passed as props.children  
      </Picture>
    </div>
  )
}

Instead of invoking the component with a self-closing tag <Picture /> if you invoke it will full opening and closing tags <Picture> </Picture> you can then place more code between it.

This de-couples the <Picture> component from its content and makes it more reusable.

Ссылка: Краткое введение в props.children React

Если повторное использование не касается дочерних узлов, есть ли разница в производительности при вызове {props.children} из дочернего компонента, чем при его использовании внутри дочернего компонента?

nim007 07.04.2018 13:53

@Nimmy при использовании {props.children} у нас нет проблем с производительностью, просто нужно передать компонент в качестве реквизита. и когда мы можем использовать дочерние элементы внутри дочернего компонента, не нужно использовать {props.children}

Soroush Chehresa 07.04.2018 14:17

Действительно хорошее чтение: daveceddia.com/pluggable-slots-in-react-components/…

Morris 31.07.2018 21:20

Пример взят из codeburst.io/…

Alpit Anand 03.02.2019 11:44

@AlpitAnand Вы можете увидеть ссылку в конце ответа: |

Soroush Chehresa 03.02.2019 11:48

ладно, жаль, читал рядом, но не дошел до конца: p

Alpit Anand 03.02.2019 12:11

@AlpitAnand Обычно ссылка на основной ответ или статью является концом ответа. Это обычная практика, когда вам нужно просто ответить, чтобы решить вашу проблему. Спасибо за внимание ;)

Soroush Chehresa 03.02.2019 12:26

Большое спасибо. Очень красиво объяснено.

Alok Ranjan 10.08.2020 12:48

Мне нравится, как вы использовали кавычки в своем тексте.

dawn 17.09.2020 18:57

props.children представляет содержимое между открывающим и закрывающим тегами при вызове / рендеринге компонента:

const Foo = props => (
  <div>
    <p>I'm {Foo.name}</p>
    <p>abc is: {props.abc}</p>

    <p>I have {props.children.length} children.</p>
    <p>They are: {props.children}.</p>
    <p>{Array.isArray(props.children) ? 'My kids are an array.' : ''}</p>
  </div>
);

const Baz = () => <span>{Baz.name} and</span>;
const Bar = () => <span> {Bar.name}</span>;

вызвать / вызвать / отобразить Foo:

<Foo abc = {123}>
  <Baz />
  <Bar />
</Foo>

props and props.children

Спасибо. Это было намного проще, лаконичнее и полезная демонстрация.

Ken Ingram 22.10.2020 00:42

Другие вопросы по теме