2017-02-12 4 views
1

Я новичок, чтобы реагировать, поэтому я уверен, что мне не хватает чего-то основного. Я получаю undefined для этого и поэтому не могу прочитать свойство setState, пытающееся установить состояние в возврате функции, вызывающей выборку, что я делаю неправильно? Примечание. Я вызываю MyAction из onClick, и данные ответа в порядке.React setState внутри функции это не определено

var ItemComponent = React.createClass({ 

getInitialState: function() { 
    return { 
    the_message: "call that API!" 
    }; 
}, 

doFetch: function() { 
    var obj = { 
    method: 'POST', 
    headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json' 
    } 
    } 
    return fetch('http://localhost:1337/site/test', obj).then(function(response) { 
    return response.json(); 
    }).then(function(data) { 
    return data; 
    }).catch((error) => { 
    console.error(error); 
    }); 
}, 

MyAction: function(){ 
    this.doFetch().then(function(response){ 
    this.setState({ 
     the_message: response.message 
    }); 
    }) 
}, 

render: function() { 
    return (
    <div> 
    <div>{this.props.title}</div><br></br> 
    <div>{this.props.price}</div><br></br> 
    <div onClick={this.MyAction}>{this.props.qty}</div> 
    </div> 
    ); 
} 

}); 
+0

Возможный дубликат [Как работает ключевое слово this?] (Http://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work) –

ответ

2

Ваша внутренняя функция разрешения обещание не будет иметь this контекст. Один из способов это исправить:

MyAction: function(){ 
    this.doFetch().then(function(response){ 
     this.setState({ 
      the_message: response.message 
     }); 
    }.bind(this)) 
}, 

Узнайте больше о том, что на this StackOverflow question.

+0

Pefect, ваш второй исправил его, Я не уверен, что вы предлагаете в своем первом элементе, так как это мой код без изменений? В любом случае я принимаю ваш ответ, как только он позволяет мне (5 мин). Боковой вопрос, я действительно должен использовать синтаксис ES6, да? после начала работы над некоторыми учебниками, я думаю, что этот синтаксис длинный. – edencorbin

+0

Двойные возгласы, я просто предположил, что вы используете классы ES6, первое обновление было неуместным. Пожалуйста, закройте свой вопрос как дубликат. –

3

Использование Функция стрелки (() => {}), которая сохраняет последний объем (this) как есть.

MyAction: function(){ 
    this.doFetch().then((response) => { 
     this.setState({ 
      the_message: response.message 
     }); 
    }); 
}, 
+0

Это также работает, и показывает мне лучший синтаксис, потрясающий, спасибо allot! – edencorbin

+0

Добро пожаловать –

2

Простой .bind(this) бы решить вопрос:

render: function() { 
return (
<div> 
<div>{this.props.title}</div><br></br> 
<div>{this.props.price}</div><br></br> 
<div onClick={this.MyAction.bind(this)}>{this.props.qty}</div> 
</div> 
); 

Добавляя .bind(this) вы сохраняете объем в пределах вашей функции.