Memperhatikan kode ini:
var Component = React.createClass({
getInitialState: function () {
return {position: 0};
},
componentDidMount: function () {
setTimeout(this.setState({position: 1}), 3000);
},
render: function () {
return (
<div className="component">
{this.state.position}
</div>
);
}
});
ReactDOM.render(
<Component />,
document.getElementById('main')
);
Bukankah keadaan seharusnya berubah hanya setelah 3 detik? Ini segera berubah.
Tujuan utama saya di sini adalah mengubah status setiap 3 detik (dengan setInterval()
), tetapi karena tidak berhasil, saya mencoba setTimeout()
, yang juga tidak berfungsi. Ada lampu di sini? Terima kasih!
javascript
reactjs
jbarradas.dll
sumber
sumber
foo(bar())
makabar
yang dieksekusi pertama dan nilai kembali diteruskan kefoo
.foo()
sini persis untuk mengeksekusibar
setelah waktu tunggu yang diinginkan. Atau apakah saya benar-benar salah dan langsung dijalankan, dan hanya mengembalikan nilai setelah waktu yang diinginkan?bar
, bukan menyebutnya dan meneruskan nilai kembaliannya. Apakah Anda mengharapkan perilakufoo(bar())
berubah, tergantung apafoo
yang dilakukannya? Itu akan sangat aneh.Jawaban:
Melakukan
Jika tidak, Anda meneruskan hasil dari
setState
kesetTimeout
.Anda juga dapat menggunakan fungsi panah ES6 untuk menghindari penggunaan
this
kata kunci:sumber
setTimeout(() => {this.setState({ position: 1 })}, 3000)
@PositiveGuy tidak yakin apakah Anda telah meneliti ini sendiri sejak pertanyaan ini diposting, tetapi jika Anda belum: Contoh asli Daniel perlu.bind(this)
membatasithis
konteks kesetState
- jika tidak ,this
akan secara otomatis merujuk ke konteks di mana ia dipanggil (dalam hal ini, anonimfunction
sedang diteruskansetTimeout
). Fungsi panah ES6, bagaimanapun, dibatasi secara leksikal - mereka membatasithis
pada konteks di mana mereka dipanggil.Di atas juga akan berfungsi karena fungsi panah ES6 tidak mengubah konteks
this
.sumber
this
.Setiap kali kita membuat waktu tunggu, kita harus menghapusnya di componentWillUnmount, jika belum diaktifkan.
sumber
Saya tahu ini agak lama, tetapi penting untuk diperhatikan bahwa React merekomendasikan untuk menghapus interval ketika komponen dilepas: https://reactjs.org/docs/state-and-lifecycle.html
Jadi saya ingin menambahkan jawaban ini ke diskusi ini:
sumber
setState
sedang dipanggil segera karena tanda kurung! Bungkus dalam fungsi anonim, lalu panggil:sumber
Anda tidak memberi tahu siapa yang menelepon setTimeout
Di sini cara Anda memanggil waktu tunggu tanpa memanggil fungsi tambahan.
1. Anda dapat melakukan ini tanpa membuat fungsi tambahan.
Menggunakan function.prototype.bind ()
setTimeout mengambil lokasi fungsi dan menyimpannya dalam konteks.
2. Cara lain untuk melakukan hal yang sama bahkan dengan menulis lebih sedikit kode.
Mungkin menggunakan metode mengikat yang sama di beberapa titik
SetTimeout hanya mengambil lokasi fungsi dan fungsi tersebut sudah memiliki konteks? Bagaimanapun, itu berhasil!
CATATAN: Ini bekerja dengan fungsi apa pun yang Anda gunakan di js.
sumber
Cakupan kode Anda (
this
) akan menjadiwindow
objek Anda , bukan komponen react Anda, dan itulah sebabnyasetTimeout(this.setState({position: 1}), 3000)
akan crash seperti ini.Itu berasal dari javascript bukan React, itu adalah js closure
Jadi, untuk mengikat ruang lingkup komponen reaksi Anda saat ini, lakukan ini:
Atau jika browser Anda mendukung es6 atau projs Anda memiliki dukungan untuk mengkompilasi es6 ke es5, coba fungsi panah juga, karena fungsi panah untuk memperbaiki masalah 'ini':
sumber
Ada 3 cara untuk mengakses cakupan di dalam fungsi 'setTimeout'
Pertama,
Kedua adalah menggunakan fungsi panah ES6, karena fungsi panah tidak memiliki ruang lingkup sendiri (ini)
Yang ketiga adalah mengikat ruang lingkup di dalam fungsi
sumber
Anda melakukan kesalahan deklarasi sintaks, gunakan deklarasi setTimeout yang tepat
sumber