18

I am new to React JS, I was testing out some functions in fiddler. I am not sure why I get an error pointing to the map function. I am not able to render the array i defined.

Relevant snippet:

      {this.props.data.productSpecs.map(function(productSpec){
        <b>Category Name:</b> {productSpec};
      })}

Full code:

var productCategory = {
    productName: 'SamamgaTV1',
  productCategory: 'Television', 
  productSpecs: ['32inch','black','hd']
};

var ProductComponent = React.createClass({
  render: function() {
    return( <div>
                        <h2>Product</h2>
              <b>Product Name:</b> {this.props.data.productName}
              <h2>Category</h2>
              <b>Category Name:</b> {this.props.data.productCategory}
              <h2>Specs</h2>
              {this.props.data.productSpecs.map(function(productSpec){
                <b>Category Name:</b> {productSpec};
              })}
           </div>);
  }
});

ReactDOM.render(
  <ProductComponent data={productCategory} />,
  document.getElementById('container')
);
Vanuan
  • 31,770
  • 10
  • 98
  • 102
floormind
  • 1,868
  • 5
  • 31
  • 85

3 Answers3

43

First you missed to return, then you must return ONE element. Here you return a <p> and a TextNode

Moreover you need to provide a unique key.

Try with this :

{this.props.data.productSpecs.map(function(productSpec, i){
        return <span key={i}><b>Category Name:</b> {productSpec}</span>;
})}
Steeve Pitis
  • 4,283
  • 1
  • 21
  • 24
  • Thanks.. this did the job... i dont think i need the key, but it helps when working with bigger applications, it shows how i can pass in IDs .. – floormind Oct 12 '16 at 13:28
  • 2
    I've just spent almost an hour before I realized I had forgotten the 'return' keyword... #rusty The key is needed to avoid a warning in the console and avoid a potential mess between items of the list – Jérôme Oudoul Jan 02 '20 at 15:05
2

You need to return value from map handler.

{this.props.data.productSpecs.map(function(productSpec){
    return (<span><b>Category Name:</b> {productSpec}<span>);
})}

If you do not want to (or can't in some situations) wrap content in span, you can create & return fragment (very handy)

const createFragment = require('react-addons-create-fragment');

{this.props.data.productSpecs.map(function(productSpec){
    return createFragment({
        bold: <b>Category Name:</b>,
        spec: productSpec,
    });
})}
Andreyco
  • 22,476
  • 5
  • 61
  • 65
0

It might be that you are using a string so you have to use the split method and pass in an empty string such as myValue.split('').map();

Tyrone Moodley
  • 3,442
  • 1
  • 15
  • 16