Saya baru di Bereaksi dan saya mencoba menulis aplikasi yang bekerja dengan API. Saya terus mendapatkan kesalahan ini:
TypeError: this.setState bukan fungsi
ketika saya mencoba menangani respons API. Saya curiga ada yang salah dengan pengikatan ini, tetapi saya tidak tahu cara memperbaikinya. Berikut kode komponen saya:
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
sumber
sumber
Anda dapat menghindari kebutuhan .bind (this) dengan fungsi panah ES6.
sumber
onChange={(checked) => this.toggleCheckbox()}
, 2)onChange={this.toggleCheckbox.bind(this)}
..bind(this)
, itu menetapkan nilaithis
untuk konteks induk dari manathis.toggleCheckbox()
dipanggil, jika tidakthis
akan merujuk ke tempat itu sebenarnya dieksekusi. b) Solusi panah gemuk berfungsi karena mempertahankan nilaithis
, sehingga membantu Anda dengan tidak mengubah nilaithis
. Dalam JavaScript,this
cukup merujuk ke ruang lingkup saat ini, jadi jika Anda menulis fungsi,this
apakah fungsi itu. Jika Anda meletakkan fungsi di dalamnya,this
ada di dalam fungsi anak itu. Anak panah gemuk menjaga konteks tempat dipanggilnyaAnda juga dapat menyimpan referensi
this
sebelum memohonapi
metode:sumber
Bereaksi merekomendasikan untuk mengikat ini dalam semua metode yang perlu menggunakan ini,
class
bukan ini dari dirifunction
.Atau Anda dapat menggunakannya
arrow function
sebagai gantinya.sumber
Anda hanya perlu mengikat acara Anda
untuk mantan
sumber
Sekarang ES6 memiliki fungsi panah, sangat membantu jika Anda benar-benar bingung dengan ekspresi bind (ini) Anda dapat mencoba fungsi panah
Inilah yang saya lakukan.
sumber
Anda tidak perlu menetapkan ini ke variabel lokal jika Anda menggunakan fungsi panah. Fungsi panah akan mengikat secara otomatis dan Anda dapat menghindari masalah terkait ruang lingkup.
Kode di bawah ini menjelaskan cara menggunakan fungsi panah di berbagai skenario
sumber
Sekarang dalam reaksi dengan es6 / 7 Anda dapat mengikat fungsi ke konteks saat ini dengan fungsi panah seperti ini, membuat permintaan dan menyelesaikan janji seperti ini:
Dengan metode ini Anda dapat dengan mudah memanggil fungsi ini di componentDidMount dan menunggu data sebelum membuat html Anda di fungsi render Anda.
Saya tidak tahu ukuran proyek Anda, tetapi saya pribadi menyarankan agar tidak menggunakan status komponen saat ini untuk memanipulasi data. Anda harus menggunakan kondisi eksternal seperti Redux atau Flux atau sesuatu yang lain untuk itu.
sumber
gunakan fungsi panah, karena fungsi panah menunjuk ke lingkup induk dan ini akan tersedia. (pengganti teknik mengikat)
sumber
Di sini konteks ini berubah. Gunakan fungsi panah untuk menjaga konteks kelas Bereaksi.
sumber
Jika Anda melakukan ini dan masih memiliki masalah, masalah saya adalah saya memanggil dua variabel dengan nama yang sama.
Saya memiliki
companies
objek yang dibawa dari Firebase, dan kemudian mencoba meneleponthis.setState({companies: companies})
- itu tidak berfungsi karena alasan yang jelas.sumber