Mając na uwadze ten kod:
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')
);
Czy stan nie powinien się zmieniać dopiero po 3 sekundach? To się zmienia natychmiast.
Moim głównym celem jest tutaj zmiana stanu co 3 sekundy (z setInterval()
), ale ponieważ nie działała, próbowałem setTimeout()
, która też nie działa. Jakieś światła na tym? Dzięki!
javascript
reactjs
jbarradas
źródło
źródło
foo(bar())
tobar
jest wykonywany jako pierwszy, a jego wartość zwracana jest przekazywana dofoo
.foo()
tutaj jest dokładnie do wykonaniabar
po żądanym czasie. A może całkowicie się mylę i jest wykonywany od razu i zwraca wartość dopiero po zadanym czasie?bar
, a nie wywoływać go i przekazywać jego wartość zwrotną. Czy spodziewałeś się, że zachowaniefoo(bar())
się zmieni, w zależności od tego, cofoo
robi? To byłoby naprawdę dziwne.Odpowiedzi:
Robić
W przeciwnym razie przekazujesz wynik
setState
dosetTimeout
.Możesz także użyć funkcji strzałek ES6, aby uniknąć użycia
this
słowa kluczowego:źródło
setTimeout(() => {this.setState({ position: 1 })}, 3000)
@PositiveGuy nie jestem pewien, czy zbadałeś to samodzielnie od czasu opublikowania tego pytania, ale na wypadek, gdybyś tego nie zrobił: oryginalny przykład Daniela musi.bind(this)
ograniczyćthis
kontekst dosetState
- w przeciwnym razie ,this
automatycznie odnoszą się do kontekstu, w którym jest on wywoływany (w tym przypadku anonimowośćfunction
były przekazywane dosetTimeout
). Funkcje strzałkowe ES6 mają jednak zasięg leksykalny - ograniczająthis
się do kontekstu, w którym są wywoływane.Powyższe działałoby również, ponieważ funkcja strzałki ES6 nie zmienia kontekstu
this
.źródło
this
.Za każdym razem, gdy tworzymy limit czasu, powinniśmy wyczyścić go na componentWillUnmount, jeśli jeszcze nie został uruchomiony.
źródło
Wiem, że jest to trochę stare, ale ważne jest, aby zauważyć, że React zaleca wyczyszczenie interwału po odinstalowaniu komponentu: https://reactjs.org/docs/state-and-lifecycle.html
Więc chciałbym dodać tę odpowiedź do tej dyskusji:
źródło
setState
jest wywoływana natychmiast z powodu nawiasów! Owiń to w anonimową funkcję, a następnie nazwij ją:źródło
Nie powiedziałeś, kto dzwonił do setTimeout
Tutaj możesz wywołać limit czasu bez wywoływania dodatkowych funkcji.
1. Możesz to zrobić bez wykonywania dodatkowych funkcji.
Używa function.prototype.bind ()
setTimeout przyjmuje lokalizację funkcji i utrzymuje ją w kontekście.
2. Innym sposobem, aby zrobić to samo, nawet pisząc jeszcze mniej kodu.
Prawdopodobnie w pewnym momencie używa tej samej metody wiązania
SetTimeout przyjmuje tylko lokalizację funkcji, a funkcja ma już kontekst? W każdym razie działa!
UWAGA: Działają one z każdą funkcją używaną w js.
źródło
Zasięg kodu (
this
) będzie twoimwindow
obiektem, a nie komponentem reagowania, i dlategosetTimeout(this.setState({position: 1}), 3000)
ulegnie awarii w ten sposób.To pochodzi z javascript, a nie z React, jest to zamknięcie js
Tak więc, aby powiązać obecny zakres komponentu React, wykonaj następujące czynności:
Lub jeśli twoja przeglądarka obsługuje es6 lub twoje projs obsługują kompilację es6 do es5, wypróbuj również funkcję strzałki, ponieważ strzałka func ma rozwiązać ten problem:
źródło
Istnieją 3 sposoby uzyskania dostępu do zakresu wewnątrz funkcji „setTimeout”
Pierwszy,
Po drugie, użyj funkcji strzałkowej ES6, ponieważ funkcja strzałkowa nie miała swojego zakresu (to)
Trzecim jest powiązanie zakresu wewnątrz funkcji
źródło
Wystąpił błąd w deklaracji składni, użyj właściwej deklaracji setTimeout
źródło