I had a javascript array that was rendering components using array.map
. I switched this array to an es6 Map
in order to be able to use key-value pairs to find items more easily, and switched from a .map
to a forEach
over the Map. Inside the forEach
I call a render method that returns a React component, but it isn't being rendered. How do I render a component inside the forEach
?
<div className='gallery__items'>
{resultsByGuid.forEach((result, index) => {
key++;
this.renderGalleryItem(result, key);
})}
</div>
Here is the renderGalleryItem method:
renderGalleryItem = (item, index) => {
const { gridItemSelected, itemThumbnailRequested } = this.props;
return (
<GalleryItem
key={index}
item={item}
onClick={gridItemSelected}
fetchThumbnailFunc={itemThumbnailRequested}
/>
);
};
I understand that forEach doesn't return anything but does that mean I can't render inside it?
forEach method can be used when you need to call a function for every element in an array. However, forEach() can't be used to iterate over an array directly in your JSX code.
You are correct, forEach doesn't return anything, use map instead, it will return an array of JSX components.
The main difference between map and forEach is that the map method returns a new array by applying the callback function on each element of an array, while the forEach method doesn't return anything. You can use the forEach method to mutate the source array, but this isn't really the way it's meant to be used.
map() is chainable but forEach isn't. This means that one could use reduce(), sort(), and other methods after map() but that's not possible with foreach() because it returns undefined.
You are correct, forEach
doesn't return anything, use map
instead, it will return an array of JSX components.
Map will allow you to access the key as well: resultsByGuid.map((item, key) => { })
Edit I apologize for jumping the gun and not reading that you were using a Map
data structure. forEach
won't render anything because you need the return value, you could implement your own Array.map
like iterator:
const mapIterator = (map, cb) => {
const agg = [];
for(let [key, value] of map) {
agg.push(cb(value, key));
}
return agg;
};
<div className='gallery__items'>
{mapIterator(resultsByGuid, (result, index) => {
key++;
return this.renderGalleryItem(result, key);
})}
</div>
Edit 2 And thanks to @zerkms for pointing out what should've been obvious to me:
<div className='gallery__items'>
{Array.from(resultsByGuid.values()).map((result, index) => {
key++;
return this.renderGalleryItem(result, key);
})}
</div>
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