1
resposta

[Sugestão] Remover o cronometroRodando

Porque manter o estado em duas propriedades? Pensei na ideia de remover o estado do cronometroRodando, computar isso de acordo com o valor do cronometro e assim eu teria apenas um estado para gerenciar.

import { defineComponent } from "vue";

export default defineComponent({
  name: "Temporizador",
  data () {
    return {
      tempoEmSegundos: 0,
      cronometro: 0
    }
  },
  computed: {
    cronometroRodando(): Boolean { /* CRONOMETRO RONDANDO COMPUTADO */
        return this.cronometro == 0
    },
    tempoDecorrido (): string {
      return new Date(this.tempoEmSegundos * 1000).toISOString().substr(11,8)
    }
  },
  methods: {
    iniciar () {
      this.cronometro = setInterval(() => {
        this.tempoEmSegundos += 1        
      }, 1000)
    },
    finalizar () {
      clearInterval(this.cronometro)
      this.cronometro = 0 /* LIMPANDO O ESTADO */
    }
  }
});
          <button class="button" @click="iniciar" :disable="cronometroRodando">
            <span class="icon">
              <i class="fas fa-play"></i>
            </span>
            <span>play</span>
          </button>
          <button class="button" @click="finalizar" :disable="!cronometroRodando">
            <span class="icon">
              <i class="fas fa-stop"></i>
            </span>
            <span>stop</span>
          </button>
1 resposta

Olá, Steimntz!

Sua sugestão de remover o estado cronometroRodando e computá-lo a partir do valor do cronometro é bastante interessante e pode, sim, ser uma alternativa para simplificar o gerenciamento de estados no seu componente.

No exemplo que você deu, o estado cronometroRodando é calculado como um valor computado (computed property) que retorna true se cronometro == 0 e false caso contrário. Isso funcionaria bem para o seu caso, já que você está atribuindo 0 ao cronometro quando o cronômetro é finalizado.

Aqui está como ficaria o seu código com essa modificação:

import { defineComponent } from "vue";

export default defineComponent({
  name: "Temporizador",
  data () {
    return {
      tempoEmSegundos: 0,
      cronometro: 0
    }
  },
  computed: {
    cronometroRodando(): Boolean {
        return this.cronometro != 0
    },
    tempoDecorrido (): string {
      return new Date(this.tempoEmSegundos * 1000).toISOString().substr(11,8)
    }
  },
  methods: {
    iniciar () {
      this.cronometro = setInterval(() => {
        this.tempoEmSegundos += 1        
      }, 1000)
    },
    finalizar () {
      clearInterval(this.cronometro)
      this.cronometro = 0
    }
  }
});

Note que eu inverti a condição no cronometroRodando para this.cronometro != 0, porque agora queremos que ele retorne true quando o cronômetro está rodando (ou seja, quando cronometro é diferente de 0).

No entanto, é importante lembrar que essa abordagem pode ter algumas implicações. Por exemplo, se em algum momento você precisar usar um valor diferente de 0 para indicar que o cronômetro não está rodando, você terá que lembrar de atualizar a propriedade computada cronometroRodando também.

Espero ter ajudado e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software