2017-07-30 12 views
1

zu halten Ich habe ein React-Karussell erstellt, in dem ich SetInterval-Methode in ComponentDidMount-Methode wie folgt aufrufen, scheint aber wie React wirft Warnung wie unten angehängt. Tue ich es falsch? idealerweise componentDidMount sollte nur einmal aufgerufen werden und mein Code sollte gut funktionieren.Wo ist der beste Ort, um setInterval() in React Komponente

componentDidMount() { 
    const self = this; 

    if(self.props.autoPlay) { 
     setInterval(() => { 
     if(self.state.current != self.props.images.length - 1){ 
      self.handleTransition(self.state.current + 1); 
     } else { 
      self.handleTransition(0); 
     } 
     }, 3000); 
    } 
    } 

enter image description here

+1

Mögliches Duplikat von [Using setInterval in React Component] (https://stackoverflow.com/questions/45158087/using-setinterval-in-react-component) –

+0

Trotz der angegebenen Antwort kann die Verwendung von 'self = this' sein als ein Anti-Muster betrachtet. Es ist besser, 'Function.prototype.bind()' bei Callbacks zu verwenden. Auch 'setInterval()' kann zu "stack overflow" Problemen führen, wenn die Tasks länger als das Intervall laufen. Es ist besser, 'setTimeout()' zu verwenden und nach dem Rückruf neu zu planen. –

Antwort

1

das Intervall als eine Eigenschaft der Komponente, löschen dann das Intervall, nachdem die Komponente Aushänge:

componentDidMount() { 
    const self = this; 

    if(self.props.autoPlay) { 
    self.interval = setInterval(() => { 
     if(self.state.current != self.props.images.length - 1){ 
     self.handleTransition(self.state.current + 1); 
     } else { 
     self.handleTransition(0); 
     } 
    }, 3000); 
    } 
} 

componentWillUnmount() { 
    clearInterval(this.interval); 
} 
+1

genau was ich in meiner Antwort geschrieben habe :) –

1

I auch eine Variable innerhalb eines Moduls verwendet wurde, in dem die Komponente ist definiert. Etwas wie:

//Clock.js 

let timerID; 

class Clock extends React.Component { 

    componentDidMount() { 
    timerID = setInterval(
    () => this.tick(), 
     1000 
    ); 
    } 

    componentWillUnmount() { 
    clearInterval(timerID); 
    } 

    tick() { 
    console.log('tick'); 
    } 

    render() { 
    return (
     <div> 
     <h1>Hello, world!</h1> 
     </div> 
    ); 
    } 
} 

Vielleicht hat jemand kommentieren, warum ist this.timerID (wie in Using setInterval in React Component erwähnt) bevorzugt?

Verwandte Themen