Otrzymuję następujący błąd
Uncaught TypeError: Nie można odczytać właściwości „setState” niezdefiniowanej
nawet po powiązaniu delty w konstruktorze.
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
źródło
źródło
Odpowiedzi:
Wynika to z
this.delta
braku bycia związanymthis
.Aby powiązać zestaw
this.delta = this.delta.bind(this)
w konstruktorze:Obecnie nazywasz się bind. Ale bind zwraca funkcję powiązaną. Musisz ustawić funkcję na związaną wartość.
źródło
this
powiązania leksykalnego , a następnie nawet nie ujawniają składni dla powiązania swojego kontekstu bezpośrednio z ich definicją !?delta
jakodelta = () => { return this.setState({ count: this.state.count++ }); };
kod, działałoby również. Wyjaśniono tutaj: hackernoon.com/…W ES7 + (ES2016) do powiązania można użyć operatora eksperymentalnej funkcji składni
::
powiązania. Jest to cukier składniowy i zrobi to samo, co odpowiedź Davina Tryona.Następnie możesz przepisać
this.delta = this.delta.bind(this);
nathis.delta = ::this.delta;
W przypadku ES6 + (ES2015) można również użyć funkcji strzałki ES6 + (
=>
), aby móc korzystaćthis
.Dlaczego ? Z dokumentu Mozilli:
źródło
Istnieje różnica kontekstu między klasą ES5 i ES6. Tak więc będzie także niewielka różnica między implementacjami.
Oto wersja ES5:
a oto wersja ES6:
Bądź ostrożny, poza różnicą składniową w implementacji klasy, istnieje różnica w powiązaniu modułu obsługi zdarzeń.
W wersji ES5 jest to
W wersji ES6 jest to:
źródło
Korzystając z kodu ES6 w React, zawsze używaj funkcji strzałek, ponieważ ten kontekst jest z nim automatycznie powiązany
Użyj tego:
zamiast:
źródło
this.setState({videos});
Nie musisz nic wiązać, po prostu użyj funkcji strzałek w następujący sposób:
źródło
Możesz także użyć:
Lub:
Jeśli mijasz jakieś parametry ...
źródło
Musisz powiązać to z konstruktorem i pamiętać, że zmiany w konstruktorze wymagają zrestartowania serwera. Albo skończysz z tym samym błędem.
źródło
Musisz powiązać swoje metody z „tym” (obiekt domyślny). Więc cokolwiek twoja funkcja może być po prostu powiązać to w konstruktorze.
źródło
Ten błąd można rozwiązać różnymi metodami
Jeśli używasz składni ES5 , to zgodnie z dokumentacją React js musisz użyć metody bind .
Coś takiego w powyższym przykładzie:
this.delta = this.delta.bind(this)
Jeśli używasz składni ES6 , nie musisz używać metody bind , możesz to zrobić w następujący sposób:
delta=()=>{ this.setState({ count : this.state.count++ }); }
źródło
Istnieją dwa rozwiązania tego problemu:
Pierwszym rozwiązaniem jest dodanie konstruktora do komponentu i powiązanie funkcji w następujący sposób:
Więc zrób to:
Zamiast tego:
Drugim rozwiązaniem jest użycie zamiast tego funkcji strzałki:
W rzeczywistości funkcja strzałki NIE Wiąże własnego
this
. Funkcje strzałek leksykalniebind
ich kontekst, więcthis
faktycznie odnosi się do kontekstu źródłowego .Aby uzyskać więcej informacji o funkcji wiązania:
Funkcja wiązania Zrozumienie JavaScript Bind ()
Aby uzyskać więcej informacji na temat funkcji strzałek:
JavaScript ES6 - Funkcje strzałek i leksykalne
this
źródło
musisz powiązać nowe wydarzenie z tym słowem kluczowym, jak wspomniałem poniżej ...
źródło
Dodawanie
rozwiąże problem. ten błąd pojawia się, gdy próbujemy wywołać funkcję klasy ES6, więc musimy powiązać metodę.
źródło
Funkcja strzałki może ułatwić ci życie, unikając wiązania tego słowa kluczowego. Tak jak:
źródło
choć to pytanie miało już rozwiązanie, chcę tylko udostępnić moje, aby je rozwiązać, mam nadzieję, że może pomóc:
źródło
źródło
Po prostu zmień instrukcję bind z tego, co musisz => this.delta = this.delta.bind (this);
źródło
2. Zaznacz (this), jeśli wykonujesz setState wewnątrz dowolnej funkcji (tj. HandleChange), sprawdź, czy funkcja wiąże się z tą funkcją, czy funkcja powinna być funkcją strzałki.
## 3 sposoby na powiązanie tego z poniższą funkcją ##
źródło
jeśli używasz składni ES5, musisz ją odpowiednio powiązać
i jeśli używasz ES6 i powyżej można użyć strzałek funkcji, wtedy nie trzeba używać bind () to
źródło