Jestem nowy w React i próbuję napisać aplikację współpracującą z interfejsem API. Wciąż pojawia się ten błąd:
TypeError: this.setState nie jest funkcją
kiedy próbuję obsłużyć odpowiedź API. Podejrzewam, że coś jest nie tak z tym wiązaniem, ale nie mogę wymyślić, jak to naprawić. Oto kod mojego komponentu:
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
źródło
źródło
Możesz uniknąć potrzeby .bind (this) dzięki funkcji strzałki ES6.
źródło
onChange={(checked) => this.toggleCheckbox()}
, 2)onChange={this.toggleCheckbox.bind(this)}
..bind(this)
, ustawia wartośćthis
kontekstu nadrzędnego, z któregothis.toggleCheckbox()
jest wywoływany, w przeciwnymthis
razie odnosi się do miejsca, w którym został faktycznie wykonany. b) Rozwiązanie grubej strzały działa, ponieważ zachowuje wartośćthis
, więc pomaga ci, nie gwałtownie zmieniając wartośćthis
. W JavaScript,this
po prostu odnosi się do bieżącego zakresu, więc jeśli napiszesz funkcję,this
jest to funkcja. Jeśli umieścisz w nim funkcję, znajdzie sięthis
ona w tej funkcji potomnej. Grube strzały utrzymują kontekst, skąd zostały wywołanemożesz również zapisać odwołanie
this
przed wywołaniemapi
metody:źródło
React zaleca powiązanie tego we wszystkich metodach, które muszą tego użyć
class
zamiast tego samegofunction
.Lub możesz użyć
arrow function
zamiast tego.źródło
Musisz tylko powiązać swoje wydarzenie
dla byłych
źródło
Teraz ES6 ma funkcję strzałki, więc naprawdę pomocne, jeśli naprawdę mylisz się z wyrażeniem bind (to), możesz wypróbować funkcję strzałki
Tak właśnie robię.
źródło
Nie musisz przypisywać tego do zmiennej lokalnej, jeśli używasz funkcji strzałki. Funkcje strzałek wiążą się automatycznie i można uniknąć problemów związanych z zasięgiem.
Poniższy kod wyjaśnia, jak używać funkcji strzałek w różnych scenariuszach
źródło
Teraz w reakcji z es6 / 7 możesz powiązać funkcję z bieżącym kontekstem za pomocą funkcji strzałki w ten sposób, wysyłać żądania i rozwiązywać takie obietnice:
Za pomocą tej metody można łatwo wywołać tę funkcję w module componentDidMount i poczekać na dane przed renderowaniem kodu HTML w funkcji renderowania.
Nie znam wielkości twojego projektu, ale osobiście odradzam używanie obecnego stanu komponentu do manipulowania danymi. Powinieneś użyć do tego stanu zewnętrznego, takiego jak Redux lub Flux lub coś innego.
źródło
użyj funkcji strzałek, ponieważ funkcje strzałek wskazują zakres nadrzędny, a to będzie dostępne. (substytut techniki wiązania)
źródło
Tutaj ten kontekst się zmienia. Użyj funkcji strzałki, aby zachować kontekst klasy React.
źródło
Jeśli to robisz i nadal masz problem, moim problemem jest to, że nazwałem dwie zmienne o tej samej nazwie.
Miałem
companies
jako przedmiot przywieziony z Firebase, a potem próbowałem zadzwonićthis.setState({companies: companies})
- z oczywistych powodów nie działało.źródło