créer un timer avec react native en utilisant es6

je cherche à ajouter une minuterie à mon application qui est construite en utilisant react native.

j'ai regardé le lien de l' timer mixin dans la documentation cependant j'ai construit le reste de l'application en utilisant es6 donc ce ne sera pas compatible.

j'ai essayé le dessous.

Dans ma classe Principale, j'ai une fonction appelée getTimerCountDown

getTimerCountDown() {
    setTimeout(() => {
      this.setTimeRemaining(this.getTimeRem()-1);
    }, 1000);
}

getTimeRem() {
    return this.state.timeRemaining;
}

j'ai essayé d'appeler ce dans componentDidUpdate comme indiqué ci-dessous. Cela fonctionne comme je le veux, si je ne fais pas toute autre interaction avec l'INTERFACE utilisateur.

Si je fais (par exemple: j'ai un bouton, je peux cliquer sur la vue.) comme ' componentDidUpdate est appelé à nouveau, le conunter devient très rapide (puisqu'il est appelé x nombre de fois)

componentDidUpdate(){
    this.getTimerCountDown();
}

Je ne suis pas sûr d'être sur la bonne voie ici ou un petit changement à ce que j'ai fait peut m'obtenir ce que je veux. Quelle est la meilleure façon de faire fonctionner un compte à rebours dans react native en utilisant es6?

Classe Timer sur principal page

<Timer timeRem={this.getTimeRem()} />

retourne

render(){
    return (
        <View style={styles.container}>
            <Text> This is the Timer : {this.props.setTimer}  - {this.props.timeRem} </Text>
        </View>
    )
}
8
demandé sur ak85 2015-08-12 14:23:24

3 réponses

Je ne suis pas vraiment sûr de savoir comment cela fonctionnerait même en l'absence d'autres interactions avec L'interface utilisateur. componentDidUpdate est appelé chaque fois que le composant est rendu à nouveau, ce qui se produit lorsque l'état interne ou les accessoires transmis ont changé. On ne peut pas compter sur quelque chose qui arrive à chaque seconde.

Que Diriez-vous de déplacer le getTimerCountDown pour votre componentDidMount méthode (qui n'est appelée qu'une fois), et ensuite en utilisant setInterval au lieu de setTimeout pour vérifier que le compteur est décrémenté en continu?

4
répondu Lapixx 2015-08-13 08:17:36

un peu tard, mais vous pouvez essayer ce composant que j'ai fait pour traiter les timers et les composants es6 dans react-native:

https://github.com/fractaltech/react-native-timer

L'idée est simple, maintenir et effacer les variables de minuterie sur les composants est une douleur, donc simplement, les maintenir dans un module séparé. Exemple:

// not using ES6 modules as babel has broken interop with commonjs for defaults 
const timer = require('react-native-timer');

// timers maintained in the Map timer.timeouts 
timer.setTimeout(name, fn, interval);
timer.clearTimeout(name);

// timers maintained in the Map timer.intervals 
timer.setInterval(name, fn, interval);
timer.clearInterval(name);

// timers maintained in the Map timer.immediates 
timer.setImmediate(name, fn);
timer.clearImmediate(name);

// timers maintained in the Map timer.animationFrames 
timer.requestAnimationFrame(name, fn);
timer.cancelAnimationFrame(name);
4
répondu kapv89 2016-03-22 20:32:27

Essayez ceci

minuterie.js

import React, { Component } from "react";
import { View,Text,Button,StyleSheet } from "react-native";
const timer = () => {};
class Timer extends Component {
    constructor(props) {
    super(props);
    this.state = {
      remainingTime: 10
     };
    }

 countdownTimer(){
   this.setState({remainingTime:10 });
   clearInterval(timer);
   timer = setInterval(() =>{
        if(!this.state.remainingTime){
          clearInterval(timer);
          return false;
        }
        this.setState(prevState =>{
        return {remainingTime: prevState.remainingTime - 1}});
        },1000);
    }

    render() {
      return (
       <View style={styles.container}>
         <Text>Remaining time :{this.state.remainingTime}</Text>
          <Button title ="Start timer" onPress={()=>this.countdownTimer()}/>
       </View>
     );
   }
  }


  const styles = StyleSheet.create({
    container:{
     flex:1,
     justifyContent:'center',
     alignItems:'center',
   } 
});

  export default Timer;

App.js

import React, { Component } from "react";
  import { View,Text,Button,StyleSheet } from "react-native";
  import Timer from './timer';

  export default class App extends Component{
   render(
    return (<Timer />)
   );
 }
2
répondu sky .. 2018-08-02 11:51:46