Я новичок в React и пытаюсь написать приложение, работающее с API. Я продолжаю получать эту ошибку:
Ошибка типа: this.setState не является функцией
когда я пытаюсь обработать ответ API. Я подозреваю, что с этим переплетом что-то не так, но я не могу понять, как это исправить. Вот код моего компонента:
var AppMain = React.createClass({
getInitialState: function() {
return{
FirstName: " "
};
},
componentDidMount:function(){
VK.init(function(){
console.info("API initialisation successful");
VK.api('users.get',{fields: 'photo_50'},function(data){
if(data.response){
this.setState({ //the error happens here
FirstName: data.response[0].first_name
});
console.info(this.state.FirstName);
}
});
}, function(){
console.info("API initialisation failed");
}, '5.34');
},
render:function(){
return (
<div className="appMain">
<Header />
</div>
);
}
});
javascript
reactjs
Иван
источник
источник
Вы можете избежать необходимости .bind (this) с помощью функции стрелки ES6.
источник
onChange={(checked) => this.toggleCheckbox()}
, 2)onChange={this.toggleCheckbox.bind(this)}
..bind(this)
, оно устанавливает значениеthis
родительского контекста, из которогоthis.toggleCheckbox()
вызывается, иначеthis
будет ссылаться на то, где оно фактически было выполнено. б) Решение с помощью жирной стрелки работает, потому что оно сохраняет значениеthis
, поэтому оно помогает вам, не насильственно изменяя значениеthis
. В JavaScriptthis
просто ссылается на текущую область видимости, поэтому, если вы пишете функцию,this
это функция. Если вы поместите функцию внутри него, тоthis
внутри этой дочерней функции. Жирные стрелки сохраняют контекст, откуда они были вызваныВы также можете сохранить ссылку
this
до вызоваapi
метода:источник
React рекомендует связать это во всех методах, которые должны использовать это
class
вместо этого себяfunction
.Или вы можете использовать
arrow function
вместо этого.источник
Вам просто нужно связать ваше мероприятие
для экс-
источник
Теперь у ES6 есть функция стрелки, это действительно полезно, если вы действительно путаете с выражением bind (this), вы можете попробовать функцию стрелки
Это как я.
источник
Вам не нужно присваивать это локальной переменной, если вы используете функцию стрелки. Функции стрелок автоматически связываются, и вы можете избежать проблем, связанных с областью действия.
Ниже код объясняет, как использовать функцию стрелки в разных сценариях
источник
Теперь, реагируя на es6 / 7, вы можете привязать функцию к текущему контексту с помощью функции стрелки, подобной этой, сделать запрос и разрешить обещания следующим образом:
С помощью этого метода вы можете легко вызвать эту функцию в componentDidMount и подождать данных, прежде чем рендерить ваш html в вашей функции рендеринга.
Я не знаю размер вашего проекта, но я лично не рекомендую использовать текущее состояние компонента для манипулирования данными. Вы должны использовать внешнее состояние, такое как Redux или Flux или что-то еще для этого.
источник
используйте функции стрелок, так как функции стрелок указывают на родительскую область видимости, и это будет доступно. (замена техники связывания)
источник
Здесь ЭТОТ контекст меняется. Используйте функцию стрелки, чтобы сохранить контекст класса React.
источник
Если вы делаете это и у вас все еще есть проблема, моя проблема в том, что я вызывал две переменные с одинаковым именем
Я получил
companies
объект, привезенный из Firebase, а затем пытался позвонитьthis.setState({companies: companies})
- он не работал по понятным причинам.источник