2016-09-29 19 views

Odpowiedz

22

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

+1

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

+0

@ 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. –

+0

Tak, poprawiłem ją 10 dni temu :) – danday74

1

okazało się, że komponent zostanie odmontowany, wygeneruj wypełnienie tego var

if(!this._calledComponentWillUnmount)this.setState({vars});

1

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 =]

9

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ś.

Powiązane problemy