Saya mendapatkan kesalahan berikut
UnEught TypeError: Tidak dapat membaca properti 'setState' dari undefined
bahkan setelah mengikat delta di konstruktor.
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {
count : 1
};
this.delta.bind(this);
}
delta() {
this.setState({
count : this.state.count++
});
}
render() {
return (
<div>
<h1>{this.state.count}</h1>
<button onClick={this.delta}>+</button>
</div>
);
}
}
javascript
reactjs
Dangling_pointer
sumber
sumber
Jawaban:
Ini karena
this.delta
tidak terikatthis
.Untuk mengikat set
this.delta = this.delta.bind(this)
di konstruktor:Saat ini, Anda menelepon bind. Tapi binding mengembalikan fungsi terikat. Anda perlu mengatur fungsi ke nilai terikatnya.
sumber
this
pengikatan leksikal yang tepat , dan kemudian bahkan tidak memaparkan sintaks untuk mengikat konteks mereka langsung pada definisi mereka !?delta
sebagaidelta = () => { return this.setState({ count: this.state.count++ }); };
kode juga akan berfungsi. Dijelaskan di sini: hackernoon.com/...Dalam ES7 + (ES2016) Anda dapat menggunakan fungsi sintaks mengikat operator sintaks
::
untuk mengikat. Ini adalah gula sintaksis dan akan melakukan hal yang sama dengan jawaban Davin Tryon.Anda kemudian dapat menulis ulang
this.delta = this.delta.bind(this);
untukthis.delta = ::this.delta;
Untuk ES6 + (ES2015) Anda juga dapat menggunakan fungsi panah ES6 + (
=>
) untuk dapat digunakanthis
.Mengapa Dari dokumen Mozilla:
sumber
Ada perbedaan konteks antara kelas ES5 dan ES6. Jadi, akan ada sedikit perbedaan antara implementasi juga.
Ini adalah versi ES5:
dan ini adalah versi ES6:
Hanya hati-hati, di samping perbedaan sintaks dalam implementasi kelas, ada perbedaan dalam pengikatan event handler.
Dalam versi ES5, ini
Dalam versi ES6, itu:
sumber
Bila menggunakan kode ES6 di bereaksi selalu menggunakan panah fungsi, karena ini konteks secara otomatis binded dengan itu
Gunakan ini:
dari pada:
sumber
this.setState({videos});
Anda tidak perlu mengikat apa pun, cukup gunakan fungsi Panah seperti ini:
sumber
Anda juga bisa menggunakan:
Atau:
Jika Anda melewati beberapa params ..
sumber
Anda perlu mengikat ini ke konstruktor dan ingat bahwa perubahan pada konstruktor perlu me-restart server. Atau yang lain, Anda akan berakhir dengan kesalahan yang sama.
sumber
Anda harus mengikat metode Anda dengan 'ini' (objek default). Jadi, apa pun fungsi Anda mungkin hanya mengikat itu di konstruktor.
sumber
Kesalahan ini dapat diatasi dengan berbagai metode-
Jika Anda menggunakan sintaks ES5 , maka sesuai Bereaksi Dokumentasi js Anda harus menggunakan metode bind .
Sesuatu seperti ini untuk contoh di atas:
this.delta = this.delta.bind(this)
Jika Anda menggunakan sintaks ES6 , maka Anda tidak perlu menggunakan metode bind , Anda dapat melakukannya dengan sesuatu seperti ini:
delta=()=>{ this.setState({ count : this.state.count++ }); }
sumber
Ada dua solusi untuk masalah ini:
Solusi pertama adalah menambahkan konstruktor ke komponen Anda dan mengikat fungsi Anda seperti di bawah ini:
Jadi lakukan ini:
Alih-alih ini:
Solusi kedua adalah dengan menggunakan fungsi panah:
Sebenarnya fungsi panah TIDAK mengikat itu sendiri
this
. Fungsi Panah secara leksikalbind
konteksnya sehinggathis
sebenarnya merujuk pada konteks asal .Untuk informasi lebih lanjut tentang fungsi bind:
Bind function Memahami JavaScript Bind ()
Untuk informasi lebih lanjut tentang fungsi panah:
Javascript ES6 - Fungsi Panah dan Leksikal
this
sumber
Anda harus mengikat acara baru dengan kata kunci ini seperti yang saya sebutkan di bawah ...
sumber
Menambahkan
akan menyelesaikan masalah. kesalahan ini datang ketika kita mencoba memanggil fungsi kelas ES6, Jadi kita perlu mengikat metode ini.
sumber
Fungsi panah bisa membuat hidup Anda lebih mudah untuk menghindari pengikatan kata kunci ini . Seperti itu:
sumber
meskipun pertanyaan ini sudah memiliki solusi, saya hanya ingin membagikan milik saya untuk diselesaikan, semoga bisa membantu:
sumber
sumber
Ubah saja pernyataan bind Anda dari apa yang Anda harus => this.delta = this.delta.bind (this);
sumber
2. Periksa (ini) jika Anda melakukan setState di dalam fungsi apa pun (mis. HandleChange) periksa apakah fungsi mengikat ini atau fungsi tersebut harus fungsi panah.
## 3 cara untuk mengikat ini ke fungsi di bawah ini ##
sumber
jika Anda menggunakan sintaks ES5 maka Anda harus mengikatnya dengan benar
dan jika Anda menggunakan ES6 dan di atas Anda dapat menggunakan fungsi panah, maka Anda tidak perlu menggunakan bind () itu
sumber