Оказание array.map() в Реагировании

У меня возникла проблема, когда я пытаюсь использовать массив данных для визуализации элемента <ul>. В приведенном ниже коде console.log работают нормально, но элементы списка не отображаются.

var Main = React.createClass({
  getInitialState: function(){
    return {
      data: dataRecent
    }
  },

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

ReactDOM.render(<Main />, document.getElementById('app')); 

Что я делаю не так? Пожалуйста, не стесняйтесь указывать на то, что не является лучшей практикой. Благодарю.

Ответы

Ответ 1

Гоша Аринич прав, вы должны вернуть свой элемент <li>. Но, тем не менее, в этом случае вы должны получить неприятное красное предупреждение в консоли браузера

Каждый дочерний элемент в массиве или итераторе должен иметь уникальную "ключевую" опору.

Итак, вам нужно добавить "ключ" в ваш список:

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

или отбросьте console.log() и сделайте красивый oneliner, используя функции стрелок es6:

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

ВАЖНОЕ ОБНОВЛЕНИЕ:

Ответ выше решает текущую проблему, но, как Сергей упомянул в комментариях: использование ключа в зависимости от индекса карты - ПЛОХО, если вы хотите выполнить некоторую фильтрацию и сортировку. В этом случае используйте item.id если id уже существует, или просто создайте для него уникальные идентификаторы.

Ответ 2

Вы не возвращаетесь. Изменить на

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

Ответ 3

Вы неявно возвращаетесь к undefined. Вам нужно вернуть элемент.

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

Ответ 4

let durationBody = duration.map((item, i) => {
      return (
        <option key={i} value={item}>
          {item}
        </option>
      );
    });

Ответ 5

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;