I am having some strange behaviour where this.props.children
is converting to an object when I spread the result of a .map()
from the parent.
example:
const items = [
{ id: 1, name: "Name1" },
{ id: 2, name: "Name2" }
].map((item) => {
return (
<DropdownMenu_listItem key={item.id} item={item} />
);
});
render() {
return (
<DropdownMenu
label={'Some label'}
onChange={() => {}}
>
{...items}
</DropdownMenu>
);
}
// DropdownMenu.js
render() {
console.log(this.props.children); // {0: {…}, 1: {…}}
return (
// ...
);
}
The weird part is that when I omit the .map()
and pass the elements directly, they appear in this.props.children
as an array like expected:
render() {
return (
<DropdownMenu
label={'Some label'}
onChange={() => {}}
>
<DropdownMenu_listItem item={{...}} />
<DropdownMenu_listItem item={{...}} />
</DropdownMenu>
);
}
// DropdownMenu.js
render() {
console.log(this.props.children); // [{…}, {…}]
return (
// ...
);
}
Any insight into why this is happening would be greatly appreciated.
Steps: Embed the child component to the parent component. Pass the props to the child component as an argument while embedding it to the parent component. In the child component, access the data variable value by writing the name or variable only.
Essentially, props. children is a special prop, automatically passed to every component, that can be used to render the content included between the opening and closing tags when invoking a component. These kinds of components are identified by the official documentation as “boxes”.
In React, the map method is used to traverse and display a list of similar objects of a component. A map is not a feature of React. Instead, it is the standard JavaScript function that could be called on an array. The map() method creates a new array by calling a provided function on every element in the calling array.
You can use React. Children to iterate over the children, and then clone each element with new props (shallow merged) using React. cloneElement .
Its not because of map that you get children as object, but because you use spread operator for the items in
<DropdownMenu
label={'Some label'}
onChange={() => {}}
>
{...items} {/*spread operator here */}
</DropdownMenu>
Now that after map items is an array using {...items }
makes it an object since you wrap your result of spread operator with {}
, If you write {items}
, that will be fine
<DropdownMenu
label={'Some label'}
onChange={() => {}}
>
{items}
</DropdownMenu>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With