React props.children не массив
В соответствии с отредактировать документы, если у компонента есть несколько дочерних элементов, this.props.children должен быть массивом.
У меня есть следующий компонент:
export class Two extends React.Component {
componentDidMount() {
console.log(Array.isArray(this.props.children)); // false
}
render() {
return(
<div>
{this.props.children}
</div>
);
}
};
Что я передаю детям в другой метод render() компонента:
<Two>
<Img src="/photos/tomato.jpg"/>
<Img src="/photos/tomato.jpg"/>
</Two>
Почему this.props.children не массив? Что еще более важно, как я могу заставить его быть одним?
Ответы
Ответ 1
Нашел лучшее решение для этого после некоторого рывка в источнике React.Children. Похоже, что метод .toArray()
был добавлен в React 0.14, который вскоре будет выпущен.
Как только он исчезнет, мы сможем просто сделать что-то вроде этого:
let children = React.Children.toArray(this.props.children);
Ответ 2
Я нашел это решение. Это сделает всех детей, одного или нескольких.
const BigMama = ({ children, styles, className }) => {
return (
<div
styles={{styles}}
className={(className ? className : '')}
>
{
React.Children.map(children, (child) =>
<React.Fragment>{child}</React.Fragment>)
}
</div>)
}
<BigMama
styles={{border: 'solid groove'}}
className='bass-player'
>
<h1>Foo</h1>
<h2>Bar</h2>
<h3>Baz</h3>
<h4>Impossibru!</h4>
<BigMama>
Ответ 3
Есть много способов, и некоторые из них уже упомянуты выше, но если вы хотите сделать это простым и хотите достичь этого без какой-либо утилиты, то ниже должно работать
const content = [
<Img src="/photos/tomato.jpg"/>,
<Img src="/photos/tomato.jpg"/>
];
<Two>
{content}
</Two>
Ответ 4
В этом случае вам может пригодиться синтаксис распространения. Вы пробовали это?
<div>
{ [...this.props.children] }
</div>
Объедините с картой, чтобы управлять выводом.
<div>
{ [...this.props.children].map(obj => <div style="someStyling"> {obj} </div> ) }
</div>