2015-02-11 3 views
7

Я новичок в React, и я немного схожу с ума, пытаясь понять, что я делаю неправильно. Я пытаюсь выполнить итерацию через json-массив, который я получаю от вызова ajax. Когда я издеваться данные, которые он отлично работает, но когда я делаю AJAX вызов, чтобы получить ту же самую информацию, что дает мне undefined is not a function (evaluating 'this.state.list.map()')React js map() undefined не является функцией

массив:

[ { "name": "drop1" }, { "name": "drop2" }, { "name": "drop3" } ]

функция:

var List = React.createClass({ 
    getInitialState: function() { 
    return {data: {}}; 
}, 
componentDidMount: function() { 
    $.ajax({ 
     url: ACTUAL_URL, 
     dataType: 'json', 
     success: function(data){ 
     this.setState({data: data}); 
     }.bind(this), 
     error: function(xhr, status, err){ 
     console.error(url, status, err.toString()); 
     }.bind(this) 
    }); 
    }, 
    render: function() { 
    return (
     <ul className="droplist"> 
     {this.state.data.map(function(l){ 
      return (<li>{l.name}</li>) 
     })} 
     </ul> 
    ); 
    } 
}); 

Любая помощь очень ценится.

+0

В дополнении к представленному Ответ: вы обычно не выполняете ajax-запросы от компонента. – zerkms

+0

@zerkms Не согласен, обычно, если вы не используете Flux. –

+0

@limelights, даже если вы не следуете за Flux - вам нужно использовать другой архитектурный шаблон дизайна, который отделяет презентацию от настойчивости и бизнес-логики. – zerkms

ответ

15

Изменить getInitialState(). В настоящее время ваши данные являются объектным литералом, а литералы объектов не поддерживают map(). Измените его на массив.

+0

Ничего себе ... это было простое решение. Благодаря! –

2

В моем случае я пытался использовать array.map но мои данные на самом деле был объектом, а не массив так, используя Object.keys(data) правильный способ перебрать объекты:

Object.keys(data).forEach(item => {...}); 
// OR 
Object.keys(data).map(item => {...}); 

Read details here

Смежные вопросы