Ini adalah komponen saya, saya menggunakan fungsi panah sebaris untuk mengubah rute onClick
div tetapi saya tahu itu bukan cara yang baik dalam hal kinerja
1. Fungsi panah sebaris
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={() => this.changeRoute("page1")}>1</div>
<div onClick={() => this.changeRoute("page2")}>2</div>
</>
)
}
2. Jika saya menggunakan binding konstruktor maka bagaimana saya bisa lulus alat peraga?
constructor() {
super(props)
this.changeRoute = this.changeRoute.bind(this)
}
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={this.changeRoute}>1</div>
<div onClick={this.changeRoute}>2</div>
</>
)
}
3. Jika saya menghapus fungsi panah maka fungsi dipanggil pada render itu sendiri
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={this.changeRoute("page1")}>1</div>
<div onClick={this.changeRoute("page2")}>2</div>
</>
)
}
4. Jika saya menggunakan inline binding maka itu juga tidak terbaik dengan kinerja
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={this.changeRoute.bind(this, "page1")}>1</div>
<div onClick={this.changeRoute.bind(this, "page2")}>2</div>
</>
)
}
Lalu bagaimana saya bisa melanjutkan dengan cara terbaik melewati parameter?
javascript
reactjs
Kesatria Kegelapan
sumber
sumber
Jawaban:
Anda dapat menggunakan fungsi panah untuk menentukan
changeRoute
handler .Ini dikenal sebagai
Class field syntax
. Lebih lanjut tentang ini di sini di dokumen reaksi resmi.Maka Anda dapat menggunakan fungsi ini secara langsung seperti:
Anda tidak perlu khawatir tentang pengikatan. Fungsi panah mewarisi milik orang tua mereka
this
.sumber
executing on the go
. Jawaban saya adalah menanggapi hal itu. Saya mencoba memberi tahu Anda bahwa penangan klik tidak akan melakukannyaexecute on the go
jika Anda menetapkan penangan seperti yang telah saya kirim .Anda dapat menambahkan data ke div Anda:
Kemudian Anda dapat mengambil data itu di handler onClick Anda:
sumber
# 1 baik-baik saja.
# 2 juga 'baik', tetapi Anda harus melewati alat peraga, maka fungsi render akan terlihat persis seperti # 1 . Anda akan memanggil
bind
fungsi d, karena Anda menggantinya di konstruktor.# 3 salah, karena fungsi dipanggil saat render.
Dan mengenai # 4, dari dokumen reaksi
Ini menyebabkan penalti kinerja ketika fungsi Anda digunakan dalam komponen turunannya dan akan menyebabkan komponen turunan ulang (tidak ada dalam kasus Anda). Jadi Anda tidak harus melakukan # 4 .
sumber
Cara terbaik saat ini adalah dengan membungkus event handler Anda di
useCallback
hook karena itu akan mencegah fungsi handler Anda dibuat setiap kali render dipanggil.Untuk info lebih lanjut, periksa - useCallback docs
sumber