To jest mój komponent Używam wbudowanej funkcji strzałki do zmiany trasy onClick
div, ale wiem, że nie jest to dobry sposób pod względem wydajności
1. Funkcja strzałki w linii
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={() => this.changeRoute("page1")}>1</div>
<div onClick={() => this.changeRoute("page2")}>2</div>
</>
)
}
2. Jeśli używam wiązania konstruktora, to jak mogę przekazywać rekwizyty?
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. Jeśli usunę funkcję strzałki, wówczas funkcja jest wywoływana na samym renderingu
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={this.changeRoute("page1")}>1</div>
<div onClick={this.changeRoute("page2")}>2</div>
</>
)
}
4. Jeśli używam wiązania wbudowanego, nie jest to również najlepsze z wydajnością
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>
</>
)
}
Więc jak mogę przejść do najlepszego sposobu przekazywania parametrów?
javascript
reactjs
Mroczny rycerz
źródło
źródło
Odpowiedzi:
Możesz użyć funkcji strzałki, aby zdefiniować
changeRoute
program obsługi.Jest to znane jako
Class field syntax
. Więcej na ten temat tutaj, w oficjalnych dokumentach dotyczących reakcji.Następnie możesz użyć tej funkcji bezpośrednio tak:
Nie musisz się martwić o wiązanie. Funkcje strzałek dziedziczą po rodzicach
this
.źródło
executing on the go
. Moja odpowiedź jest na to odpowiedzią. Próbuję powiedzieć, że Twój moduł obsługi kliknięć nie będzie,execute on the go
jeśli zdefiniujesz moduł obsługi, tak jak napisałem.Możesz dodać dane do div:
Następnie możesz pobrać te dane w module obsługi onClick:
źródło
# 1 jest w porządku.
# 2 jest również „w porządku”, ale musisz przekazać rekwizyty, wtedy funkcja renderowania będzie wyglądać dokładnie tak jak # 1 . Będziesz wywoływał funkcję
bind
d, ponieważ zastąpiłeś ją w konstruktorze.# 3 jest po prostu zły, ponieważ funkcja jest wywoływana podczas renderowania.
A jeśli chodzi o # 4, od reagujących doktorów
Powoduje to obniżenie wydajności, gdy twoja funkcja jest używana w jej komponentach potomnych i spowoduje ponowne renderowanie komponentów potomnych (w twoim przypadku tak nie jest). Więc nie powinieneś robić # 4 .
źródło
Obecnie najlepszym sposobem jest zawinięcie modułu obsługi zdarzeń,
useCallback
ponieważ uniemożliwi to utworzenie funkcji modułu obsługi za każdym razem, gdy wywoływane jest renderowanie.Aby uzyskać więcej informacji sprawdź - użyj dokumentów Callback
źródło