Rendering an array.map() in React

前端 未结 9 1909
渐次进展
渐次进展 2020-12-04 11:17

I am having a problem where I am trying to use array of data to render a

    element. In the code below the console.log\'s are working fine,
相关标签:
9条回答
  • 2020-12-04 11:49

    You are implicitly returning undefined. You need to return the element.

    this.state.data.map(function(item, i){
      console.log('test');
      return <li>Test</li>
    })
    
    0 讨论(0)
  • 2020-12-04 11:55

    Dmitry Brin's answer worked for me, with one caveat. In my case, I needed to run a function between the list tags, which requires nested JSX braces. Example JSX below, which worked for me:

    {this.props.data().map(function (object, i) { return <li>{JSON.stringify(object)}</li> })}
    

    If you don't use nested JSX braces, for example:

    {this.props.data().map(function (object, i) { return <li>JSON.stringify(object)</li>})}
    

    then you get a list of "JSON.stringify(object)" in your HTML output, which probably isn't what you want.

    0 讨论(0)
  • 2020-12-04 11:56

    Add up to Dmitry's answer, if you don't want to handle unique key IDs manually, you can use React.Children.toArray as proposed in the React documentation

    React.Children.toArray

    Returns the children opaque data structure as a flat array with keys assigned to each child. Useful if you want to manipulate collections of children in your render methods, especially if you want to reorder or slice this.props.children before passing it down.

    Note:

    React.Children.toArray() changes keys to preserve the semantics of nested arrays when flattening lists of children. That is, toArray prefixes each key in the returned array so that each element’s key is scoped to the input array containing it.

     <div>
        <ul>
          {
            React.Children.toArray(
              this.state.data.map((item, i) => <li>Test</li>)
            )
          }
        </ul>
      </div>
    
    0 讨论(0)
  • 2020-12-04 11:58
    import React, { Component } from 'react';
    
    class Result extends Component {
    
    
        render() {
    
               if(this.props.resultsfood.status=='found'){
    
                var foodlist = this.props.resultsfood.items.map(name=>{
    
                       return (
    
    
                       <div className="row" key={name.id} >
    
                      <div className="list-group">   
    
                      <a href="#" className="list-group-item list-group-item-action disabled">
    
                      <span className="badge badge-info"><h6> {name.item}</h6></span>
                      <span className="badge badge-danger"><h6> Rs.{name.price}/=</h6></span>
    
                      </a>
                      <a href="#" className="list-group-item list-group-item-action disabled">
                      <div className="alert alert-dismissible alert-secondary">
    
                        <strong>{name.description}</strong>  
                        </div>
                      </a>
                    <div className="form-group">
    
                        <label className="col-form-label col-form-label-sm" htmlFor="inputSmall">Quantitiy</label>
                        <input className="form-control form-control-sm" placeholder="unit/kg"  type="text" ref="qty"/>
                        <div> <button type="button" className="btn btn-success"  
                        onClick={()=>{this.props.savelist(name.item,name.price);
                        this.props.pricelist(name.price);
                        this.props.quntylist(this.refs.qty.value);
                        }
                        }>ADD Cart</button>
                            </div>
    
    
    
                      <br/>
    
                          </div>
    
                    </div>
    
                    </div>
    
                       )
                })
    
    
    
               }
    
    
    
            return (
    <ul>
       {foodlist}
    </ul>
            )
        }
    }
    
    export default Result;
    
    0 讨论(0)
  • 2020-12-04 12:04

    Gosha Arinich is right, you should return your <li> element. But, nevertheless, you should get nasty red warning in the browser console in this case

    Each child in an array or iterator should have a unique "key" prop.

    so, you need to add "key" to your list:

    this.state.data.map(function(item, i){
      console.log('test');
      return <li key={i}>Test</li>
    })
    

    or drop the console.log() and do a beautiful oneliner, using es6 arrow functions:

    this.state.data.map((item,i) => <li key={i}>Test</li>)
    

    IMPORTANT UPDATE:

    The answer above is solving the current problem, but as Sergey mentioned in the comments: using the key depending on the map index is BAD if you want to do some filtering and sorting. In that case use the item.id if id already there, or just generate unique ids for it.

    0 讨论(0)
  • 2020-12-04 12:04
    let durationBody = duration.map((item, i) => {
          return (
            <option key={i} value={item}>
              {item}
            </option>
          );
        });
    
    0 讨论(0)
提交回复
热议问题