Если я правильно понимаю ваш вопрос, вы ищете что-то вроде специальной children
опоры, которая передается каждый компонент по React (из документации)
Это особенно применимо, если вы не знаете, что дети для компонента будут раньше времени.
В вашем случае, это может быть реализовано примерно следующим образом -
class Products extends React.Component {
render() {
/* this.props.children here will be an array of all
* the children which can be custom components
* enclosed within the <Products> component
* when it is rendered
*/
return (
<div className='products'>
{this.props.children}
</div>
)
}
}
В реальном сценарии, если вы хотите, чтобы гнездиться в ProductDetail
компонент внутри Products
компонента, потому что вы хотите Products
каким-то образом передать некоторую опору для каждого ProductDetail
он содержит, вы можете использовать различные хорошо документированные утилиты, предоставляемые React.Children
(документы)
так практический пример будет выглядеть следующим образом -
class Products extends React.Component {
getTransformedChildren() {
return React.Children.map(this.props.children, child => {
// if child is of type ProductsDetail, clone it so you can
// pass your own prop to it else return the child
const newChild = (child.type === ProductsDetail) ?
React.cloneElement(child, { category: this.props.category }) :
child
return newChild
}
render() {
return (
<div className='products'>
{this.getTransformedChildren()}
</div>
)
}
}
Так что ваше утверждение визуализации будет выглядеть следующим образом:
<Products category='groceries'>
<ProductDetails id='1' />
<ProductDetails id='2' />
<HelloWorld />
</Products>
И в этом случае все внутренние ProductDetails
дети будут иметь набор проп categories
к groceries
. Однако внутренний компонент HelloWorld
не будет передаваться опорой categories
, потому что это не тип ProductDetails
.
Другое практическое приложение, в котором используется эта парадигма, - это если вы хотите, чтобы родительский пользовательский компонент передавал встроенные стили всем или некоторым его дочерним элементам и может быть очень полезен, если, например, вы пишете свои собственные библиотеки.
благодарит за ответ @yining – kcak11