Mam usecase, gdzie muszę odmontować mój składnik reagowania. Ale w niektórych przypadkach dany składnik reagujący jest odmontowywany przez inną funkcję. Dlatego muszę sprawdzić, czy komponent jest zamontowany przed odmontowaniem go.Czy istnieje sposób sprawdzenia, czy komponent reagowania nie jest podłączony?
Odpowiedz
Od isMounted()
jest oficjalnie przestarzała, można to zrobić w składniku:
componentDidMount() {
this._ismounted = true;
}
componentWillUnmount() {
this._ismounted = false;
}
Ten wzór utrzymania własnego state
zmienną jest szczegółowo w dokumentacji ReactJS: https://facebook.github.io/react/blog/2015/12/16/ismounted-antipattern.html
okazało się, że komponent zostanie odmontowany, wygeneruj wypełnienie tego var
if(!this._calledComponentWillUnmount)this.setState({vars});
Dostałem się tutaj, ponieważ szukałem sposobu na zatrzymanie interfejsu API polling
.
W przypadku react docs obejmuje ona obudowę websocket
, ale nie tę dotyczącą odpytywania.
Sposób pracowałem wokół niego
// React component
let allowPolling = true
React.createClass({
poll() {
if (!allowPolling) {
return
}
// otherwise, call the api
}
componentWillMount() {
allowPolling = true
}
componentWillUnmount() {
allowPolling = false
}
})
to działa. Nadzieję, że pomoże
Proszę dać mi znać, jeśli znacie żadnego uszkodzonego przypadek testowy dla tego =]
myślę że Shubham odpowiedź jest rozwiązanie sugerowane przez reagują dla osób, które muszą przechodzić swój kod, aby zaprzestać używania Wzorzec przeciwwstrząsowy isMounted
.
To nie musi być złe, ale warto wymienić prawdziwe rozwiązania tego problemu.
The article linked by Shubham oferuje 2 sugestie, aby uniknąć tego wzorca. Ten, którego potrzebujesz, zależy od tego, dlaczego wywołujesz setState, gdy komponent jest odmontowany.
jeśli używasz Flux sklep w swojej komponentu, należy wypisać w componentWillUnmount
class MyComponent extends React.Component {
componentDidMount() {
mydatastore.subscribe(this);
}
render() {
...
}
componentWillUnmount() {
mydatastore.unsubscribe(this);
}
}
Jeśli używasz ES6 obiecuje, może być konieczne, by zakończyć swoją obietnicę w celu dokonania to można anulować.
const cancelablePromise = makeCancelable(
new Promise(r => component.setState({...}}))
);
cancelablePromise
.promise
.then(() => console.log('resolved'))
.catch((reason) => console.log('isCanceled', reason.isCanceled));
cancelablePromise.cancel(); // Cancel the promise
Więcej o makeCancelable
w połączonej artykułu.
Podsumowując, nie próbuj łatać tego problemu, ustawiając zmienne i sprawdzając, czy komponent jest zamontowany, przejdź do źródła problemu. Prosimy o komentarz w innych typowych przypadkach, jeśli możesz wymyślić jakiś.
- 1. Czy istnieje sposób sprawdzenia, czy komponent bean jest zdefiniowany w kontekście sprężyny?
- 2. Czy istnieje sposób sprawdzenia, czy alarm jest już ustawiony?
- 3. Czy istnieje sposób sprawdzenia, czy zmienna jest zdefiniowana w Javie?
- 4. Czy istnieje lepszy sposób sprawdzenia, czy plik jest zapisywany?
- 5. Czy istnieje sposób sprawdzenia, czy wybór HTML jest obecnie otwarty?
- 6. Java - Najszybszy sposób sprawdzenia, czy URL istnieje
- 7. pytoniczny sposób sprawdzenia, czy coś istnieje?
- 8. W scala, czy istnieje sposób sprawdzenia, czy wystąpienie jest obiekt singleton, czy nie?
- 9. Jaki jest najlepszy sposób sprawdzenia, czy URL istnieje w PHP?
- 10. Podczas debugowania istnieje sposób sprawdzenia, czy obiekt jest inną instancją?
- 11. Czy istnieje sposób sprawdzenia, ile parametrów jest wymaganych dla metody?
- 12. Jaki jest najlepszy sposób sprawdzenia, czy istnieje atrybut?
- 13. Czy istnieje sposób sprawdzenia, czy operacja OpenGL została zakończona?
- 14. Czy istnieje sposób sprawdzenia, czy próbka została skonfigurowana dla członka?
- 15. Czy istnieje sposób sprawdzenia, czy dwa elementy DOM są równe?
- 16. Czy istnieje sposób sprawdzenia, czy wymuszono tryb ścisły?
- 17. Czy istnieje sposób sprawdzenia, czy odebrano transmisje LocalBroadcastManager?
- 18. Czy istnieje sposób sprawdzenia, czy ReactElement renderuje wartość "null"?
- 19. Czy istnieje sposób sprawdzenia, czy element zakończył przejście CSS3?
- 20. Czy istnieje sposób sprawdzenia, czy zdefiniowano funkcję VBScript?
- 21. Lepszym sposobem sprawdzenia, czy ścieżka istnieje, czy nie w PowerShell
- 22. Sprawdź, czy mongoDB jest podłączony
- 23. Jak sprawdzić, czy klient ElasticSearch jest podłączony?
- 24. Czy komponent reagowania może mieć wiele obszarów dla treści podrzędnych?
- 25. Jaki jest najlepszy sposób sprawdzenia, czy atrybut istnieje i czy jest ustawiony?
- 26. Czy istnieje sposób sprawdzenia, czy funkcja działa w gotowym dokumencie, czy nie?
- 27. Czy istnieje uniwersalny sposób sprawdzenia, czy użytkownik trzyma klawisz CTRL, czy nie?
- 28. Jak sprawdzić, czy zestaw słuchawkowy jest podłączony, czy nie?
- 29. Czy istnieje sposób sprawdzenia, czy istnieje wiele powiązań istnieje w Rails 3.1?
- 30. Czy istnieje sposób sprawdzenia, czy przewód @ Out został wyprowadzony z komponentu w Angular 2?
Dzięki za podpowiedź ... od dokumentów ... Po prostu ustaw właściwość _isMounted na wartość true w componentDidMount i ustaw ją na false w componentWillUnmount ... jednak, używając tego.setState ({mounted: false}); może wywołać zbyt późno, aby zapobiec ostrzeżeniu, ponieważ zmiany stanu nie następują natychmiastowo - lepiej po prostu użyć właściwości klasy dla tego ... this.mounted = false - dziękuję, to wskazało mi w dobrym kierunku – danday74
@ danday74, tak, ty są poprawne. Prawdopodobnie przegapiłem punkt, w którym napisałem odpowiedź. Zastanów się nad odpowiedzią, jeśli to pomogło. –
Tak, poprawiłem ją 10 dni temu :) – danday74