Eu sou novo no React e estou tentando escrever um aplicativo trabalhando com uma API. Eu continuo recebendo esse erro:
TypeError: this.setState não é uma função
quando tento lidar com a resposta da API. Eu suspeito que há algo errado com essa ligação, mas não consigo descobrir como corrigi-la. Aqui está o código do meu componente:
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
Ivan
fonte
fonte
Você pode evitar a necessidade de .bind (this) com uma função de seta ES6.
fonte
onChange={(checked) => this.toggleCheckbox()}
, 2)onChange={this.toggleCheckbox.bind(this)}
..bind(this)
, define o valorthis
para o contexto pai de ondethis.toggleCheckbox()
é chamado; caso contrário,this
se refere ao local onde foi realmente executado. b) A solução de seta gorda funciona porque retém o valor dethis
, portanto, está ajudando você a não alterar violentamente o valor dethis
. Em JavaScript,this
simplesmente se refere ao escopo atual; portanto, se você escreve uma função,this
essa é a função. Se você colocar uma função dentro dela,this
está dentro dessa função filho. Flechas de gordura manter o contexto de onde chamou devocê também pode salvar uma referência
this
antes de invocar oapi
método:fonte
A React recomenda vincular isso em todos os métodos que precisam usá-lo, em
class
vez disso, de si mesmofunction
.Ou você pode usar em seu
arrow function
lugar.fonte
Você só precisa vincular seu evento
por exemplo
fonte
Agora o ES6 tem a função de seta, é realmente útil se você realmente confundir com a expressão bind (this), você pode tentar a função de seta
É assim que eu faço.
fonte
Você não precisa atribuir isso a uma variável local se usar a função de seta. As funções de seta são vinculadas automaticamente e você pode evitar problemas relacionados ao escopo.
O código abaixo explica como usar a função de seta em diferentes cenários
fonte
Agora, em reagir com o es6 / 7, você pode vincular a função ao contexto atual com a função de seta como esta, fazer solicitações e resolver promessas como esta:
Com esse método, você pode facilmente chamar essa função no componentDidMount e aguardar os dados antes de renderizar seu html na função de renderização.
Não sei o tamanho do seu projeto, mas pessoalmente aconselho a não usar o estado atual do componente para manipular dados. Você deve usar um estado externo como Redux ou Flux ou algo mais para isso.
fonte
use as funções de seta, pois as funções de seta apontam para o escopo pai e isso estará disponível. (substituto da técnica de ligação)
fonte
Aqui, este contexto está sendo alterado. Use a função de seta para manter o contexto da classe React.
fonte
Se você está fazendo isso e ainda está tendo um problema, meu problema é que eu estava chamando duas variáveis com o mesmo nome.
Eu tinha
companies
como objeto trazido do Firebase e estava tentando ligarthis.setState({companies: companies})
- não estava funcionando por razões óbvias.fonte